From 7037b7a76f807b2817219b672cea4cb1082ce4d4 Mon Sep 17 00:00:00 2001 From: Alexandre Weiler Date: Sun, 23 Nov 2014 14:42:31 +0100 Subject: [PATCH] First commit first commit --- Editor/ALPSConfigEditor.cs | 110 +++ LICENSE.txt | 674 ++++++++++++++++++ Materials/ALPSDistortion.mat | Bin 0 -> 4228 bytes Plugins/Android/ALPSImmersive.jar | Bin 0 -> 2970 bytes Plugins/Android/AndroidManifest.xml | 36 + .../libs/armeabi-v7a/libalps_native_sensor.so | Bin 0 -> 21824 bytes .../libs/armeabi/libalps_native_sensor.so | Bin 0 -> 25912 bytes Prefabs/ALPS.prefab | Bin 0 -> 13888 bytes Resources/ALPSSkin.guiskin | Bin 0 -> 101868 bytes Resources/Textures/arcs.png | Bin 0 -> 216 bytes Resources/Textures/blue.jpg | Bin 0 -> 1127 bytes Resources/Textures/progress_point.png | Bin 0 -> 149 bytes Scripts/ALPSAndroid.cs | 63 ++ Scripts/ALPSBarrelMesh.cs | 96 +++ Scripts/ALPSCamera.cs | 59 ++ Scripts/ALPSConfig.cs | 130 ++++ Scripts/ALPSController.cs | 197 +++++ Scripts/ALPSControllerLight.cs | 114 +++ Scripts/ALPSCrosshair.cs | 60 ++ Scripts/ALPSDevice.cs | 57 ++ Scripts/ALPSGUI.cs | 134 ++++ Scripts/ALPSGyro.cs | 78 ++ Scripts/ALPSNavigation.cs | 84 +++ Shaders/ALPSDistortion.shader | 73 ++ 24 files changed, 1965 insertions(+) create mode 100644 Editor/ALPSConfigEditor.cs create mode 100644 LICENSE.txt create mode 100644 Materials/ALPSDistortion.mat create mode 100644 Plugins/Android/ALPSImmersive.jar create mode 100644 Plugins/Android/AndroidManifest.xml create mode 100644 Plugins/Android/libs/armeabi-v7a/libalps_native_sensor.so create mode 100644 Plugins/Android/libs/armeabi/libalps_native_sensor.so create mode 100644 Prefabs/ALPS.prefab create mode 100644 Resources/ALPSSkin.guiskin create mode 100644 Resources/Textures/arcs.png create mode 100644 Resources/Textures/blue.jpg create mode 100644 Resources/Textures/progress_point.png create mode 100644 Scripts/ALPSAndroid.cs create mode 100644 Scripts/ALPSBarrelMesh.cs create mode 100644 Scripts/ALPSCamera.cs create mode 100644 Scripts/ALPSConfig.cs create mode 100644 Scripts/ALPSController.cs create mode 100644 Scripts/ALPSControllerLight.cs create mode 100644 Scripts/ALPSCrosshair.cs create mode 100644 Scripts/ALPSDevice.cs create mode 100644 Scripts/ALPSGUI.cs create mode 100644 Scripts/ALPSGyro.cs create mode 100644 Scripts/ALPSNavigation.cs create mode 100644 Shaders/ALPSDistortion.shader diff --git a/Editor/ALPSConfigEditor.cs b/Editor/ALPSConfigEditor.cs new file mode 100644 index 0000000..2adf274 --- /dev/null +++ b/Editor/ALPSConfigEditor.cs @@ -0,0 +1,110 @@ +/************************************************************************ + ALPSContollerEditor is a custom editor for ALPSController class + + Copyright (C) 2014 ALPS VR. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +************************************************************************/ + +using UnityEngine; +using System.Collections; +using UnityEditor; + +[System.Serializable] +[CustomEditor(typeof(ALPSController))] +public class ALPSContollerEditor : Editor { + + /**Public**/ + public ALPSConfig DeviceConfig; + public ALPSController Controller; + + public Device Device{ + get{ + return DeviceConfig.DeviceName; + } + set{ + if(DeviceConfig.DeviceName != value){ + Controller.setDevice(value); + OnEnable(); + } + } + } + + public ScreenOption screenSize{ + get{ + return DeviceConfig.FixedSize?ScreenOption.FixedSize:ScreenOption.FullScreen; + } + set{ + DeviceConfig.FixedSize=(value == ScreenOption.FixedSize)?true:false; + } + } + + /**Functions**/ + void OnEnable() + { + Controller = (ALPSController)target; + DeviceConfig = (Controller.DeviceConfig == null)? ALPSDevice.getConfig(Device.DEFAULT):Controller.DeviceConfig; + Controller.DeviceConfig = DeviceConfig; + ALPSCamera.DeviceConfig = DeviceConfig; + ALPSBarrelMesh.DeviceConfig = DeviceConfig; + ALPSCrosshair.DeviceConfig = DeviceConfig; + screenSize = DeviceConfig.getScreenOption (); + } + + public override void OnInspectorGUI(){ + + //Device + Device = (Device)EditorGUILayout.EnumPopup("Device:",Device); + + //IPD + DeviceConfig.IPD = EditorGUILayout.FloatField (new GUIContent("IPD", "Inter Pupilary Distance in millimeter. This must match the distance between the user's eyes"),DeviceConfig.IPD); + //Stereo distance + DeviceConfig.ILD = EditorGUILayout.FloatField (new GUIContent("ILD","Inter Lens Distance in millimeter. This is the distance between both cameras and this should match the IPD. Can be tweaked to increase or decrease the stereo effect."),DeviceConfig.ILD); + + //Field Of View + DeviceConfig.FieldOfView = EditorGUILayout.Slider ("Vertical FOV",DeviceConfig.FieldOfView, 1, 180); + + //Screen size + screenSize = (ScreenOption)EditorGUILayout.EnumPopup("Screen size:",screenSize); + + if (screenSize == ScreenOption.FixedSize) { + DeviceConfig.Width = EditorGUILayout.IntField (new GUIContent("\twidth", "Width of the viewport in millimeter"), DeviceConfig.Width); + DeviceConfig.Height = EditorGUILayout.IntField (new GUIContent("\theight", "Height of the viewport in millimeter"), DeviceConfig.Height); + DeviceConfig.FixedSize = true; + } else { + DeviceConfig.FixedSize = false; + } + + //Barrel distortion + DeviceConfig.EnableBarrelDistortion = EditorGUILayout.Toggle ("Barrel distortion", DeviceConfig.EnableBarrelDistortion); + if (DeviceConfig.EnableBarrelDistortion) { + DeviceConfig.k1 = EditorGUILayout.FloatField ("\tk1", DeviceConfig.k1); + DeviceConfig.k2 = EditorGUILayout.FloatField ("\tk2", DeviceConfig.k2); + } + + //Chromatic correction + DeviceConfig.EnableChromaticCorrection = EditorGUILayout.Toggle ("Chromatic correction",DeviceConfig.EnableChromaticCorrection); + if (DeviceConfig.EnableChromaticCorrection) { + DeviceConfig.ChromaticCorrection = EditorGUILayout.FloatField ("\tCorrection intensity", DeviceConfig.ChromaticCorrection); + } + + Controller.CrosshairEnabled = EditorGUILayout.Toggle("Crosshair", Controller.CrosshairEnabled); + + if (GUI.changed) { + Controller.clearDirty(); + EditorUtility.SetDirty(target); + } + } +} diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Materials/ALPSDistortion.mat b/Materials/ALPSDistortion.mat new file mode 100644 index 0000000000000000000000000000000000000000..40d73f6b4e7577412d01b301d40f02dd7b4eff3e GIT binary patch literal 4228 zcmeH~OLG)A5XWU8Kp+XP1VTt)Nq8o~5Mv$*#Q1?7yTGtu9!Hn#)!IYt&bTyM$D2cH z51jcZe2ILPoVaq1>3{cVtQ`wDr)s-ucQoqXs9S%vG`mXe8&~S!OQqDObft?@qr=yR zuQac#|28)_hv@z*`pj!*Y@%CgQs+jIV-qB7C%$@0?WId6&6AbXG-^reRD1E^(hIZf zW|M}QY3Y?*?IHvN!f^HNdfnOE(~ZPsc6!4Z8YD}{==r)eO}$jt)}&6x;wU?K06)Z# z!o38XNm^#^F2~`t$~Y29pt^Re1%!lPl8iu{j6~kbVJ@ZVr!;-c@)Le$>#1n`-4zJ8 z+v4wuK)JI?xNx@h-T?=ZT^!XZ9Ty_bb9aXeP7-YXHN zn)xq9NIV~{-jQGspM8JzUX2ikD@i z`ukxW{TVNg`>{Em5`Mbl_{R^r#d)2i^z)S+{MDm36+T-A7Jr8q`NfBR&&c&1Ia%gj literal 0 HcmV?d00001 diff --git a/Plugins/Android/ALPSImmersive.jar b/Plugins/Android/ALPSImmersive.jar new file mode 100644 index 0000000000000000000000000000000000000000..628339d2deffba9ed8ed40edbad7b273daf9a401 GIT binary patch literal 2970 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 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Plugins/Android/libs/armeabi-v7a/libalps_native_sensor.so b/Plugins/Android/libs/armeabi-v7a/libalps_native_sensor.so new file mode 100644 index 0000000000000000000000000000000000000000..19d90813f57cf561923286c22674e78255f952ea GIT binary patch literal 21824 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 literal 0 HcmV?d00001 diff --git a/Plugins/Android/libs/armeabi/libalps_native_sensor.so b/Plugins/Android/libs/armeabi/libalps_native_sensor.so new file mode 100644 index 0000000000000000000000000000000000000000..5031a2285bbf8fdef3862e7fa8668fb65286e7ee GIT binary patch literal 25912 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 literal 0 HcmV?d00001 diff --git a/Prefabs/ALPS.prefab b/Prefabs/ALPS.prefab new file mode 100644 index 0000000000000000000000000000000000000000..7ee1fb63f697e888de114acadd2d61e070d685c4 GIT binary patch literal 13888 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 CTfNx; literal 0 HcmV?d00001 diff --git a/Resources/ALPSSkin.guiskin b/Resources/ALPSSkin.guiskin new file mode 100644 index 0000000000000000000000000000000000000000..d33c09be1139247ec2eb3dedc9f3ad3604700287 GIT binary patch literal 101868 zcmeI51#}$8wzcJu9cCtnnHi07`JIt~*ww1_|Gm;EJhZSaKW@hF@VPmF0)%R>@YONWw+u-4Qlt#4HHq@5}G}eu3shK82a=h}@e?MeMYk9*>>Kj^{%bQGS zEoBeV+_Z7Fen`1AvTpd0x^k(h)gG&+N49jT?9+X?<=wLXbGPjW4rpjB4eX!)oT(j= zeR#-yZ_tps*3lKn4dgx$%7?L^T%BQHQ){W*RM(jQ{Aq2`lvVWSPZvS%X7cm96Da@r zo7Rmf*)w)CRBz=!-#Ks}Zt6bS|I(j7eU4NicQg6V`L#>hqs6 zBXHgN*p29SZNI+ocRdp>t9+k7J@=9tHlo}xw$(j7`!0WKGe;}vQ=27%+|A^v%}St_ z)^bDBsO%?hnd!}6#IqqasbZ^KuA5lXC;wmf`ky^x>;;m2?QJhV_v2a`_AccwwK?!X zD&LP7U01HDuWPN#m(EFuDZ`k#evNf4Ed%SbS9-(9hEh47ZZ2FliBC6o#&kN}Joq4$ z@5AZlB}D#fT5>>hQ~n!rU-RG3e1N(;= zE|1BM6HZi5z`d;8>(-?St!?Gf>iylTzi-`$Jx7(B+nVZg!;6tcCJzp7iv#3GO$;wV zpnlDb&E=t+_U)7XU^hj6yT-i>mIS({N6-9)J+iU6uC=C|f4>yu-Ll+$SUxJxm(K60 zC=T-BdA^Ly>+*bAlE-dqo5yAE45xNEpbM*Ao-9h#t^kl!yCQ+K+LeH2YFCDwsa-|p zrgl}Co7&Y#9;@v$qP1aMDR;X%;Dz0;K^7%$*91tqU5h~4?b<*yx9dR8+^#EgbGx3* z&F%UmkKGPv9?{m4?WFF7y8-ZpkTbb`WNvc%%G~7k zBY7-$a1$JH`@@35b~ho561xKcl6E&GkhYucLHUQW38eLo0GjEohn(px$=vjgl)330Me?E9mHgn5BU?)D!oF{Fxjs7+bLWktfpuct zCAB#kR2tc8HzUN|G-PPQsL{skA(^e4$L5c+rzH9|x3)Hq$)QF91(R=4S02^Slute; zV#(x95#nyflQ&DoPd-)>F!^2t3ML;?S6}b0UY+!E1e4KQBE;Q{M{kvkAH7WyF#0$G z1)~qnPTR9B+-WR*hx-Z;>rfE(W2+?c(e zx69to+m-9a=Gj4-8`>~pw7YD~xr33boXptI&95vQ8^(@xuU9wXA&3S~W#E{)QKccx zEe)+%=a;jG5_a3{;L}`QePlLjzf6&<1MN`c9_z4RLC?ICuq)FE`2!vv*yRkB0%kiJyZp)EloM19ZA@V?qRLvQtOD(_PFlXc2t*a<$)c1 zG{P0{e)G!&4R6bihD~{SatxB$)8ysJu}F3B^5nRTaX&l%%zmbS@lPpFj)w>FFZ{4P zIe`#PnV;Zq2tH|$e^W*hctkh2Z@beY?ReTK|! z!#O3R(m#Cl&C!iAgT6T0%^790nOB&4>?nNfy_G+}vJG^4Kk sq^VY%0mMTy+& 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 BDJ=j1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/arcs.png b/Resources/Textures/arcs.png new file mode 100644 index 0000000000000000000000000000000000000000..7a60b9596d815dcd8d7d460d9b936f701c657b6a GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3HEhl+{lMQk(@Ik;M!Q+`=Ht$S`Y;1W-^R z*(1o8fuTy3fuW(9f#K(WApMeoq11qZ;Z*_ygVhWM2J!q!@kiZ&YU4az978H@ExBOG z*AyVYaPhmjmr2{9X}{z9j?~iApvSTA z1ru+ybP0 Hl+XkK-7!OZ literal 0 HcmV?d00001 diff --git a/Resources/Textures/blue.jpg b/Resources/Textures/blue.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52d25435e1052b24ee6fd0feec0ddeea8e921612 GIT binary patch literal 1127 zcmb7D%TC)s6de;Pv8bwMS5YC2jD$$rcsz;iU<+drKWL<;LV!fK#vX_j?6K@gV_5e? z+VAKB7X64mR_v?x6Wnn~NJSA9SF@P8I_KQylwZp$@XRfuV*q-+7hnm@t^5h<&L|k3 z0Rb#tyUVNE%K>Alfl!i5en^jq6wnwIeu}UpBd}=|sUHjpgGb~fN=)(h=L-==p(!4! zeYv07WDvbR&&dAy+k@bI80evBZNbgLDB?6G%!fsMn&d`diW6~z-zzr~;RM2lrnp^2 zh41>i(54xIs?=@ix?X9tT1}2<=4T1>i)NCq&J-My2U(P|h$gU7^pEI>nIg~hx`a6G z_iu#n>{c9CbxqJY+avQd?nLJYXDLB@B&VY+ARN9rBlF(fAE*NIYz&76qnISD=a?e* zNMRHjZBMopO;c3I_Aqu8z1`WcHK%PWp69u)H{ z&Zf6Jpp51NnnHVDgX@P;64G(rs9HPClw{F+5_%bp;iNZ4bSr+9yN*4#YpWZ!tvarP zaTm+j>FA1V%TCL2JK~fZ-ck2|xrir&s=@v>=$VUePj$UnTmHCNe3I~O&-hxGzrd5p zvV!oEe;=Xz0X~4|%gc?G#`fCUb{8Sk-LbZ|tepp#u+nHKYl^kLZtYm=gQ(Y0%1cmR z0t;ZFCWv66F4XEm`31ZIf-wL2lUq%=?OJ^F^fn08|M8UH!Q-01rE7Iyfsc!yF3N9z E0MaNsD*ylh literal 0 HcmV?d00001 diff --git a/Resources/Textures/progress_point.png b/Resources/Textures/progress_point.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f2999f5640a9f93e14437f212225c1701e891d GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nR&H|6fVg?3oVGw3ym^DWND5#L^ z5#-CjP^HSi(9q1l@bf>Ae#yX4YQVtoDuIE)Y6b&?c>bjLqi#U8(w;7kAr-fh{`~*H mpNE;5Sy`A_1Srh#|35Q>;S6TEFRyK-KzvVEKbLh*2~7Y=t0FJ} literal 0 HcmV?d00001 diff --git a/Scripts/ALPSAndroid.cs b/Scripts/ALPSAndroid.cs new file mode 100644 index 0000000..796baf0 --- /dev/null +++ b/Scripts/ALPSAndroid.cs @@ -0,0 +1,63 @@ +/************************************************************************ + ALPSAndroid is an interface with the Android system + + Copyright (C) 2014 ALPS VR. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +************************************************************************/ + +using UnityEngine; +using System.Collections; + +public class ALPSAndroid : MonoBehaviour { + + /**Private**/ + private static AndroidJavaClass jc; + + /**Functions**/ + // Use this for initialization + public static void Init () { + jc = new AndroidJavaClass ("com.alpsvr.immersive.ALPSActivity"); + } + + ///

+ /// Vibrate constantly for 8 milliseconds. + /// + public static void Vibrate(){ + Vibrate(8); + } + + /// + /// Vibrate constantly for the specified period of time. + /// + /// The number of milliseconds to vibrate. + public static void Vibrate(int _milliseconds){ + jc.CallStatic ("vibrate",_milliseconds); + } + + /// + /// The absolute width of the display in pixels. + /// + public static int WidthPixels(){ + return jc.CallStatic ("getWidthPixel"); + } + + /// + /// The absolute height of the display in pixels. + /// + public static int HeightPixels(){ + return jc.CallStatic ("getHeightPixel"); + } +} diff --git a/Scripts/ALPSBarrelMesh.cs b/Scripts/ALPSBarrelMesh.cs new file mode 100644 index 0000000..8aee469 --- /dev/null +++ b/Scripts/ALPSBarrelMesh.cs @@ -0,0 +1,96 @@ +/************************************************************************ + ALPSBarrelMesh is a factory which creates barrel shaped meshes + + Copyright (C) 2014 ALPS VR. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +************************************************************************/ + +using UnityEngine; +using System.Collections; + +public class ALPSBarrelMesh { + + /**Public**/ + public static ALPSConfig DeviceConfig; + + /**Functions**/ + public static Mesh GenerateMesh(int lines, int columns,bool leftEye){ + float k1, k2; + if (!DeviceConfig.EnableBarrelDistortion) { + k1 = k2 = 0; + } else { + k1 = DeviceConfig.k1; + k2 = DeviceConfig.k2; + } + int numVertices = (lines + 1) * (columns + 1); + int numFaces = lines * columns; + Mesh mesh = new Mesh (); + Vector3[] vertices = new Vector3[numVertices]; + Vector2[] uvs = new Vector2[numVertices]; + int[] tri = new int[numFaces*6]; + //If IPD is smaller than half of the width, we take width/2 for IPD + //Otherwise meshes are outward-oriented + float widthIPDRatio = (DeviceConfig.IPD <= DeviceConfig.Width * 0.5f || DeviceConfig.FixedSize)?(DeviceConfig.IPD / DeviceConfig.Width) : 0.5f; + Vector2 center = new Vector2 (leftEye?1-widthIPDRatio:widthIPDRatio,0.5f); + int x, y; + + //Creation of the vertices + int numQuad = 0; + float maxX = (leftEye?1:0); + float maxY = 0; + for (y=0; y<=lines; y++) { + for(x=0; x<=columns; x++){ + int index = y*(lines+1)+x; + Vector2 vertex = new Vector2(); + + float rSqr = Mathf.Pow (center.x-((float)x/(float)columns),2) + Mathf.Pow (center.y-((float)y/(float)lines),2); + float rMod = 1+k1*rSqr+k2*rSqr*rSqr; + + vertex.x = (float)((float)x/(float)columns-center.x)/(float)rMod+center.x-0.5f; + vertex.y = (float)((float)y/(float)lines-center.y)/(float)rMod+center.y-0.5f; + if(leftEye){ + if(vertex.xmaxX)maxX=vertex.x; + } + if(vertex.y>maxY)maxY=vertex.y; + vertices[index] = new Vector3(vertex.x, vertex.y, 0); + uvs[index] = new Vector2((float)x/(float)columns,(float)y/(float)lines); + + if(x=2 && v!=3) ? columns : 0) + ((v==0) ? 0 : (v/5)+1); + } + numQuad++; + } + } + } + + float scaleFactor = 1f/Mathf.Max(leftEye?-1*(1-maxX):maxX,maxY); + + int i; + for(i=0; i. + +************************************************************************/ + +using UnityEngine; +using System.Collections; + +public class ALPSCamera : MonoBehaviour{ + + /**Public**/ + public static ALPSConfig DeviceConfig; + public bool LeftEye; + + /**Private**/ + private Mesh mesh; + + + /**Functions**/ + public void Init(){ + + Vector3 camLeftPos = camera.transform.localPosition; + camLeftPos.x = (LeftEye?-1:1)*DeviceConfig.ILD * 0.0005f; + camLeftPos.z = ALPSConfig.NeckPivotToEye.x * 0.001f; + camLeftPos.y = ALPSConfig.NeckPivotToEye.y * 0.001f; + + camera.transform.localPosition = camLeftPos; + } + + public void updateMesh(){ + + camera.rect = new Rect ((LeftEye?0f:0.5f),0f,0.5f,1f); + camera.aspect = DeviceConfig.Width*0.5f / DeviceConfig.Height; + + mesh = ALPSBarrelMesh.GenerateMesh(20,20,LeftEye); + } + + public void Draw(){ + + Graphics.DrawMeshNow (mesh,Camera.current.transform.position,Camera.current.transform.rotation); + } + + +} \ No newline at end of file diff --git a/Scripts/ALPSConfig.cs b/Scripts/ALPSConfig.cs new file mode 100644 index 0000000..0f98ad4 --- /dev/null +++ b/Scripts/ALPSConfig.cs @@ -0,0 +1,130 @@ +/************************************************************************ + ALPSConfig describes a configuration for one particular device + + Copyright (C) 2014 ALPS VR. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +************************************************************************/ + +using UnityEngine; +using System.Collections; + +[System.Serializable] +public class ALPSConfig{ + + /**Public**/ + public const float INCH_TO_MM = 25.4f; + public static float DEFAULT_DPI = 96f; + //Vector between eyes and the pivot point (neck) + public static Vector2 NeckPivotToEye = new Vector2 (80f,120f); + + //Configuration name + public Device DeviceName; + + //Is barrel distortion enabled or not + public bool EnableBarrelDistortion; + + //Is chromatic correction enabled or not + public bool EnableChromaticCorrection; + + //Does the application run in full screen or must it have the same + //size on every device + public bool FixedSize; + + //Inter pupillary distance in millimeters. Must match the distance between + //users' eyes + public float IPD; + + //Inter lens distance in millimeters. Should match the IPD but can be tweaked + //to increase or decrease the stereo effect. Basically, with an ILD set to 0, there + //is no 3D effect. + public float ILD; + + //Vertical field of view of both cameras + [Range(1,179)] + public float FieldOfView; + + //Chromatic correction coefficient + public float ChromaticCorrection; + + //Barrel distortion parameters. + public float k1; + public float k2; + + //DPI + public float DPI; + + //Width of the viewport in mm + [SerializeField] + private int width; + public int Width { + get{return (int)(FixedSize?width:ALPSController.ScreenWidthPix/DPI*INCH_TO_MM);} + set{ + if(value<0) width = 0; + else width = value; + } + } + + //Height of the viewport in mm + [SerializeField] + private int height; + public int Height { + get{ + return (int)(FixedSize?height:ALPSController.ScreenHeightPix/DPI*INCH_TO_MM);} + set{ + if(value<0) height = 0; + else height = value; + } + } + + /**Functions**/ + public int HeightPix(){ + + return (int)(FixedSize ? Height * DPI / INCH_TO_MM : ALPSController.ScreenHeightPix); + } + + public int WidthPix(){ + + return (int)(FixedSize ? Width * DPI / INCH_TO_MM : ALPSController.ScreenWidthPix); + } + + + public ALPSConfig(Device _DeviceName, bool _EnableBarrelDistortion, bool _EnableChromaticCorrection, bool _FixedSize, float _IPD, float _ILD, float _FieldOfView, float _ChromaticCorrection, float _k1, float _k2, int _Width, int _Height){ + + DeviceName = _DeviceName; + IPD = _IPD; + ILD = _ILD; + FieldOfView = _FieldOfView; + ChromaticCorrection = _ChromaticCorrection; + k1 = _k1; + k2 = _k2; + Width = _Width; + Height = _Height; + EnableBarrelDistortion = _EnableBarrelDistortion; + EnableChromaticCorrection = _EnableChromaticCorrection; + FixedSize = _FixedSize; + } + + public ScreenOption getScreenOption(){ + + return FixedSize ? ScreenOption.FixedSize : ScreenOption.FullScreen; + } + + public int getIPDPixels(){ + + //IPD is in millimeters while DPI is in inches + return (int)(IPD * DPI / INCH_TO_MM); + } +} diff --git a/Scripts/ALPSController.cs b/Scripts/ALPSController.cs new file mode 100644 index 0000000..04fbf48 --- /dev/null +++ b/Scripts/ALPSController.cs @@ -0,0 +1,197 @@ +/************************************************************************ + ALPSController is the main class which manages custom rendering + + Copyright (C) 2014 ALPS VR. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +************************************************************************/ + +using UnityEngine; +using System.Collections; + +[System.Serializable] +public class ALPSController : MonoBehaviour { + + /**Public**/ + public ALPSConfig DeviceConfig = ALPSDevice.getConfig(Device.FIREFLY); + + //One camera for each eye + public Camera CameraLeft; + public Camera CameraRight; + + //Render textures + public RenderTexture srcTex; + public RenderTexture destTex; + + //Screen size + public static int ScreenWidthPix; + public static int ScreenHeightPix; + + //Material + public Material mat; + + //Crosshair + public bool CrosshairEnabled; + + /**Private**/ + private Rect rectLeft,rectRight; + private float DPI; + + /**Functions**/ + public void Awake(){ + #if UNITY_EDITOR + transform.FindChild("Head").gameObject.AddComponent("MouseLook"); + ScreenWidthPix = Screen.width; + ScreenHeightPix = Screen.height; + #elif UNITY_ANDROID + transform.FindChild("Head").gameObject.AddComponent("ALPSGyro"); + Screen.orientation = ScreenOrientation.LandscapeLeft; + ALPSAndroid.Init (); + ScreenWidthPix = ALPSAndroid.WidthPixels (); + ScreenHeightPix = ALPSAndroid.HeightPixels (); + #endif + + //Make sure the longer dimension is width as the phone is always in landscape mode + if(ScreenWidthPix().Draw (); + else CameraRight.GetComponent().Draw (); + GL.PopMatrix (); + } + + public void clearDirty(){ + + //We give the current DPI to the new ALPSConfig + DeviceConfig.DPI = DPI; + if (DeviceConfig.DPI <= 0) { + DeviceConfig.DPI = ALPSConfig.DEFAULT_DPI; + } + + float widthPix = DeviceConfig.WidthPix(); + float heightPix = DeviceConfig.HeightPix(); + + rectLeft = new Rect (ScreenWidthPix*0.5f-widthPix*0.5f,ScreenHeightPix*0.5f-heightPix*0.5f,widthPix*0.5f,heightPix); + rectRight = new Rect (ScreenWidthPix*0.5f,ScreenHeightPix*0.5f-heightPix*0.5f,widthPix*0.5f,heightPix); + + Vector3 camLeftPos = CameraLeft.transform.localPosition; + camLeftPos.x = -DeviceConfig.ILD*0.0005f; + CameraLeft.transform.localPosition = camLeftPos; + + Vector3 camRightPos = CameraRight.transform.localPosition; + camRightPos.x = DeviceConfig.ILD*0.0005f; + CameraRight.transform.localPosition = camRightPos; + + CameraLeft.fieldOfView = DeviceConfig.FieldOfView; + CameraRight.fieldOfView = DeviceConfig.FieldOfView; + + CameraLeft.GetComponent().updateMesh(); + CameraRight.GetComponent().updateMesh(); + + ALPSCrosshair[] ch = GetComponentsInChildren (); + foreach (ALPSCrosshair c in ch) { + c.updateCrosshair(); + c.enabled = CrosshairEnabled; + } + } + + void setFixedSize(bool _fixed){ + if (_fixed != DeviceConfig.FixedSize) { + clearDirty(); + } + DeviceConfig.FixedSize = _fixed; + } + + public void setDevice(Device _device){ + DeviceConfig = ALPSDevice.getConfig (_device); + ALPSCamera.DeviceConfig = DeviceConfig; + ALPSBarrelMesh.DeviceConfig = DeviceConfig; + ALPSCrosshair.DeviceConfig = DeviceConfig; + clearDirty (); + } + +} \ No newline at end of file diff --git a/Scripts/ALPSControllerLight.cs b/Scripts/ALPSControllerLight.cs new file mode 100644 index 0000000..3570de0 --- /dev/null +++ b/Scripts/ALPSControllerLight.cs @@ -0,0 +1,114 @@ +/************************************************************************ + ALPSControllerLight is the main class for non Pro license holders + + Copyright (C) 2014 ALPS VR. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +************************************************************************/ + +using UnityEngine; +using System.Collections; + +public class ALPSControllerLight : MonoBehaviour { + + /**Public**/ + + //One camera for each eye + public GameObject CameraLeft; + public GameObject CameraRight; + + //Inter lens distance in millimeters. Should match the IPD but can be tweaked + //to increase or decrease the stereo effect. Basically, with an ILD set to 0, there + //is no 3D effect. + public float ILD; + + //Vector between eyes and the pivot point (neck) + public Vector2 NeckToEye; + + public bool AddTracking; + + /**Functions**/ + void Awake () { + if (AddTracking) { + #if UNITY_EDITOR + gameObject.AddComponent ("MouseLook"); + #elif UNITY_ANDROID + gameObject.AddComponent("ALPSGyro"); + Screen.orientation = ScreenOrientation.LandscapeLeft; + ALPSAndroid.Init (); + #endif + } + CameraLeft = new GameObject("CameraLeft"); + CameraLeft.AddComponent ("Camera"); + CameraLeft.camera.rect = new Rect (0,0,0.5f,1); + CameraLeft.transform.parent = transform; + CameraLeft.transform.position = transform.position; + CameraLeft.transform.localPosition = new Vector3 (ILD*-0.0005f,NeckToEye.y*0.001f,NeckToEye.x*0.001f); + AudioListener[] listeners = FindObjectsOfType(typeof(AudioListener)) as AudioListener[]; + + CameraRight = new GameObject("CameraRight"); + CameraRight.AddComponent ("Camera"); + CameraRight.camera.rect = new Rect (0.5f,0,0.5f,1); + CameraRight.transform.parent = transform; + CameraRight.transform.position = transform.position; + CameraRight.transform.localPosition = new Vector3 (ILD*0.0005f,NeckToEye.y*0.001f,NeckToEye.x*0.001f); + + + if (listeners.Length < 1) { + gameObject.AddComponent ("AudioListener"); + } + + CameraLeft.camera.fieldOfView = 90f; + CameraRight.camera.fieldOfView = 90f; + SetStereoLayers ("left","right"); + + } + + public void SetCameraSettings(Camera _cam){ + CameraLeft.camera.CopyFrom (_cam); + CameraRight.camera.CopyFrom (_cam); + CameraLeft.camera.rect = new Rect (0,0,0.5f,1); + CameraRight.camera.rect = new Rect (0.5f,0,0.5f,1); + } + + public int SetStereoLayers(string _leftLayer, string _rightLayer){ + int leftLayer = LayerMask.NameToLayer (_leftLayer); + int rightLayer = LayerMask.NameToLayer (_rightLayer); + if (leftLayer < 0 && rightLayer < 0) return -1; + + CameraLeft.camera.cullingMask |= 1 << LayerMask.NameToLayer(_leftLayer); + CameraLeft.camera.cullingMask &= ~(1 << LayerMask.NameToLayer(_rightLayer)); + + CameraRight.camera.cullingMask |= 1 << LayerMask.NameToLayer(_rightLayer); + CameraRight.camera.cullingMask &= ~(1 << LayerMask.NameToLayer(_leftLayer)); + + return 0; + } + + //This can be useful for setting up a Raycast + public Vector3 PointOfView(){ + //returns current position plus NeckToEye vector + return new Vector3(transform.position.x,transform.position.y + NeckToEye.y*0.001f,transform.position.z + NeckToEye.x*0.001f); + } + + public Vector3 ForwardDirection(){ + return CameraLeft.camera.transform.forward; + } + + public Camera[] GetCameras(){ + Camera[] cams = {CameraLeft.camera, CameraRight.camera}; + return cams; + } +} diff --git a/Scripts/ALPSCrosshair.cs b/Scripts/ALPSCrosshair.cs new file mode 100644 index 0000000..b524154 --- /dev/null +++ b/Scripts/ALPSCrosshair.cs @@ -0,0 +1,60 @@ +/************************************************************************ + ALPSCrosshair adds a crosshair in the middle of the screen + + Copyright (C) 2014 ALPS VR. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +************************************************************************/ + +using UnityEngine; +using System.Collections; + +public class ALPSCrosshair : MonoBehaviour { + + /**Public**/ + public static ALPSConfig DeviceConfig; + + + /**Private**/ + private Vector2 CenterGUI; + private Vector2 CenterGUIBar; + private Vector2 CenterIPD; + private bool LeftEye; + private Texture2D arc; + private Texture2D bar; + + /**Functions**/ + public void Awake(){ + LeftEye = GetComponent ().LeftEye; + arc = Resources.Load ("Textures/arcs") as Texture2D ; + bar = Resources.Load ("Textures/progress_point") as Texture2D ; + + CenterIPD = new Vector2 (ALPSController.ScreenWidthPix*0.5f + ((LeftEye?-1:1) * ((DeviceConfig.IPD <= DeviceConfig.Width * 0.5f)?DeviceConfig.getIPDPixels()*0.5f:ALPSController.ScreenWidthPix*0.25f)) ,ALPSController.ScreenHeightPix * 0.5f); + CenterGUI = new Vector2(CenterIPD.x-(arc.width * 0.5f),CenterIPD.y-(arc.height * 0.5f)); + CenterGUIBar = new Vector2(CenterIPD.x-(bar.width * 0.5f),CenterIPD.y-(bar.height * 0.5f)); + } + + public void updateCrosshair(){ + CenterIPD = new Vector2 (ALPSController.ScreenWidthPix*0.5f + ((LeftEye?-1:1) * ((DeviceConfig.IPD <= DeviceConfig.Width * 0.5f)?DeviceConfig.getIPDPixels()*0.5f:ALPSController.ScreenWidthPix*0.25f)) ,ALPSController.ScreenHeightPix * 0.5f); + CenterGUI = new Vector2(CenterIPD.x-(arc.width * 0.5f),CenterIPD.y-(arc.height * 0.5f)); + CenterGUIBar = new Vector2(CenterIPD.x-(bar.width * 0.5f),CenterIPD.y-(bar.height * 0.5f)); + } + + void OnGUI(){ + GUI.DrawTexture(new Rect(CenterGUI.x,CenterGUI.y,arc.width,arc.height),arc,ScaleMode.ScaleToFit, true, 0f); + CenterGUIBar = new Vector2(CenterIPD.x-((arc.width-4)*ALPSNavigation.progress() * 0.5f),CenterIPD.y-(bar.height * 0.5f)); + GUI.DrawTexture(new Rect(CenterGUIBar.x,CenterGUIBar.y,(arc.width-4)*ALPSNavigation.progress(),bar.height),bar,ScaleMode.StretchToFill, true, 0f); + } +} diff --git a/Scripts/ALPSDevice.cs b/Scripts/ALPSDevice.cs new file mode 100644 index 0000000..4c9d2ca --- /dev/null +++ b/Scripts/ALPSDevice.cs @@ -0,0 +1,57 @@ +/************************************************************************ + ALPSDevice provides a specific configuration for each supported device + + Copyright (C) 2014 ALPS VR. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +************************************************************************/ + +using UnityEngine; +using System.Collections; + +public enum Device{ + DEFAULT, + ALTERGAZE, + CARDBOARD, + FIREFLY +}; +public enum ScreenOption{ + FixedSize, + FullScreen +}; +public class ALPSDevice { + + /**Functions**/ + public static ALPSConfig getConfig(Device _device){ + ALPSConfig config; + switch (_device) { + case Device.ALTERGAZE: + config = new ALPSConfig(Device.ALTERGAZE,true,true,false,62f,62f,90f,-1f,0.4f,0.2f,0,0); + break; + case Device.CARDBOARD: + config = new ALPSConfig(Device.CARDBOARD,true,true,false,62f,62f,90f,-1.5f,0.5f,0.2f,128,75); + break; + case Device.FIREFLY: + config = new ALPSConfig(Device.FIREFLY,true,true,false,62f,62f,90f,-2f,0.7f,0.2f,140,75); + break; + case Device.DEFAULT: + default: + config = new ALPSConfig(Device.DEFAULT,false,false,false,62f,62f,90f,0f,0f,0f,0,0); + break; + } + return config; + } + +} diff --git a/Scripts/ALPSGUI.cs b/Scripts/ALPSGUI.cs new file mode 100644 index 0000000..ee9fffc --- /dev/null +++ b/Scripts/ALPSGUI.cs @@ -0,0 +1,134 @@ +/************************************************************************ + ALPSGUI provides a basic menu to choose a headset + + Copyright (C) 2014 ALPS VR. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +************************************************************************/ + +using UnityEngine; +using System.Collections; + +public class ALPSGUI : MonoBehaviour { + + /**Public**/ + public static ALPSController Controller; + + /**Private**/ + private float beginX; + private float endX; + private float maxOffset; + private bool GUIVisible; + private bool showing; + private bool hiding; + private GUISkin ALPSSkin; + + /**Functions**/ + void Start(){ + beginX = 0; + endX = 0; + maxOffset = -ALPSController.ScreenWidthPix*0.25f; + GUIVisible = false; + showing = false; + hiding = false; + ALPSSkin = Resources.Load ("ALPSSkin") as GUISkin; + ALPSSkin.box.overflow.right = (int) maxOffset-1; + ALPSSkin.button.overflow.right = (int) maxOffset-1; + ALPSSkin.box.contentOffset = new Vector2((int) maxOffset-1,0); + ALPSSkin.button.contentOffset = new Vector2((int) maxOffset-1,0); + } + + void Update() { + if(Input.touchCount > 0){ + if (Input.GetTouch (0).phase == TouchPhase.Began) { + beginX = Input.GetTouch (0).position.x; + } else if (Input.GetTouch (0).phase == TouchPhase.Ended) { + endX = Input.GetTouch (0).position.x; + if (endX - beginX >= 150) { + SwipeRight (); + } else if (endX - beginX <= -150) { + SwipeLeft (); + } + } + } + if (showing) { + int deltaOffset = (int)(-maxOffset*Time.deltaTime/0.3f); + ALPSSkin.box.overflow.right +=deltaOffset; + ALPSSkin.button.overflow.right +=deltaOffset; + ALPSSkin.box.contentOffset = new Vector2(ALPSSkin.box.contentOffset.x+deltaOffset,0); + ALPSSkin.button.contentOffset = new Vector2(ALPSSkin.button.contentOffset.x+deltaOffset,0); + if (ALPSSkin.box.overflow.right >= 0) { + ALPSSkin.box.overflow.right = 0; + ALPSSkin.button.overflow.right = 0; + ALPSSkin.box.contentOffset = new Vector2(0,0); + ALPSSkin.button.contentOffset = new Vector2(0,0); + showing = false; + } + + } else if (hiding) { + int deltaOffset = (int)(-maxOffset*Time.deltaTime/0.3f); + ALPSSkin.box.overflow.right -=deltaOffset;//+= (int) (maxOffset * cumulativeTime); + ALPSSkin.button.overflow.right -=deltaOffset; + ALPSSkin.box.contentOffset = new Vector2(ALPSSkin.box.contentOffset.x-deltaOffset,0); + ALPSSkin.button.contentOffset = new Vector2(ALPSSkin.button.contentOffset.x-deltaOffset,0); + if (ALPSSkin.box.overflow.right <= maxOffset) { + ALPSSkin.box.overflow.right = (int)maxOffset-1; + ALPSSkin.button.overflow.right = (int)maxOffset-1; + ALPSSkin.box.contentOffset = new Vector2((int) maxOffset-1,0); + ALPSSkin.button.contentOffset = new Vector2((int) maxOffset-1,0); + hiding = false; + GUIVisible = false; + } + } + } + + private void SwipeRight(){ + if (!GUIVisible) { + GUIVisible = true; + showing = true; + } + } + + private void SwipeLeft(){ + if (GUIVisible) { + hiding = true; + } + } + + void OnGUI(){ + if (GUIVisible) { + GUI.skin = ALPSSkin; + + // Make a background box + GUI.Box (new Rect (0, 0, ALPSController.ScreenWidthPix * 0.25f, ALPSController.ScreenHeightPix), "Choose a device"); + + if (GUI.Button (new Rect (0, ALPSController.ScreenHeightPix * 0.15f, ALPSController.ScreenWidthPix * 0.25f, ALPSController.ScreenHeightPix * 0.15f), "Default")) { + Controller.setDevice (Device.DEFAULT); + } + + if (GUI.Button (new Rect (0, ALPSController.ScreenHeightPix * 0.30f, ALPSController.ScreenWidthPix * 0.25f, ALPSController.ScreenHeightPix * 0.15f), "Altergaze")) { + Controller.setDevice (Device.ALTERGAZE); + } + + if (GUI.Button (new Rect (0, ALPSController.ScreenHeightPix * 0.45f, ALPSController.ScreenWidthPix * 0.25f, ALPSController.ScreenHeightPix * 0.15f), "Cardboard")) { + Controller.setDevice (Device.CARDBOARD); + } + + if (GUI.Button (new Rect (0, ALPSController.ScreenHeightPix * 0.60f, ALPSController.ScreenWidthPix * 0.25f, ALPSController.ScreenHeightPix * 0.15f), "Firefly VR")) { + Controller.setDevice (Device.FIREFLY); + } + } + } +} diff --git a/Scripts/ALPSGyro.cs b/Scripts/ALPSGyro.cs new file mode 100644 index 0000000..6c10d74 --- /dev/null +++ b/Scripts/ALPSGyro.cs @@ -0,0 +1,78 @@ +/************************************************************************ + ALPSGyro is an interface for head tracking using Android native sensors + + Copyright (C) 2014 ALPS VR. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +************************************************************************/ + +using UnityEngine; +using System.Collections; +using System.Runtime.InteropServices; +using System; +public class ALPSGyro : MonoBehaviour { + + /**Private**/ + private float dt_q_x = 0,dt_q_y=0, dt_q_z=0,dt_q_w=0; + private float gr_x=0,gr_y=0,gr_z=0,gr_w=0; + + private Quaternion dt_q_gyro = Quaternion.identity; + private Quaternion game_rotation = Quaternion.identity; + private Quaternion landscapeLeft = Quaternion.Euler(90, 0, 0); + + /**Functions**/ + #if UNITY_ANDROID + [DllImport("alps_native_sensor")] public static extern void init(); + [DllImport("alps_native_sensor")] public static extern void get_dt_gyro (ref float dt_q_x, ref float dt_q_y, ref float dt_q_z, ref float dt_q_w); + [DllImport("alps_native_sensor")] public static extern void get_game_rotation (ref float gr_x, ref float gr_y, ref float gr_z, ref float gr_w); + #endif + + public void Start () { + Screen.sleepTimeout = SleepTimeout.NeverSleep; + Application.targetFrameRate = 60; + #if UNITY_ANDROID + init (); + #endif + } + + + public void LateUpdate () { + #if UNITY_ANDROID + transform.localRotation = getOrientation(); + #endif + } + + private Quaternion getOrientation () + { + + //get delta rotation + get_dt_gyro(ref dt_q_x, ref dt_q_y, ref dt_q_z, ref dt_q_w); + dt_q_gyro.x = dt_q_y; + dt_q_gyro.y = -dt_q_x; + dt_q_gyro.z = dt_q_z; + dt_q_gyro.w = dt_q_w; + + //get game rotation + get_game_rotation(ref gr_x, ref gr_y, ref gr_z, ref gr_w); + game_rotation.x = gr_y; + game_rotation.y = -gr_x; + game_rotation.z = gr_z; + game_rotation.w = gr_w; + + //Must be optimized. Delta rotation is multiplies five times to accelerate the movement. + //This doesn't replace faster sensor polling but it makes tracking look more responsive. + return landscapeLeft * game_rotation * dt_q_gyro; + } +} diff --git a/Scripts/ALPSNavigation.cs b/Scripts/ALPSNavigation.cs new file mode 100644 index 0000000..2c69eb6 --- /dev/null +++ b/Scripts/ALPSNavigation.cs @@ -0,0 +1,84 @@ +/************************************************************************ + ALPSNavigation provides an input-free navigation system + + Copyright (C) 2014 ALPS VR. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +************************************************************************/ + +using UnityEngine; +using System.Collections; + +public class ALPSNavigation : MonoBehaviour { + + private static float pitch; + + /**Private**/ + private CharacterController controller; + + + private bool moving; + + + /**Functions**/ + public void Awake () { + + controller = transform.parent.gameObject.GetComponent ("CharacterController") as CharacterController; + transform.parent.gameObject.AddComponent ("CharacterMotor"); + if (Application.platform == RuntimePlatform.Android) { + Debug.Log (Application.platform); + moving = false; + } + } + + public void Update () { + pitch = this.transform.eulerAngles.x; + if (pitch >= 20 && pitch <= 30) { + if (Application.platform == RuntimePlatform.Android){ + if (!moving){ + ALPSAndroid.Vibrate(20); + moving = true; + } + } + controller.Move (new Vector3 (transform.forward.x, 0, transform.forward.z) * Time.deltaTime * 3); + + } else if (pitch >= 330 && pitch <= 340) { + if (Application.platform == RuntimePlatform.Android){ + if (!moving){ + ALPSAndroid.Vibrate(20); + moving = true; + } + } + controller.Move (new Vector3 (-transform.forward.x, 0, -transform.forward.z) * Time.deltaTime * 3); + + } else { + if (Application.platform == RuntimePlatform.Android){ + if(moving)moving=false; + } + } + } + + public static float progress(){ + if (pitch >= 20 && pitch <= 30 || pitch >= 330 && pitch <= 340) { + return 1f; + } else { + if(pitch>=0 && pitch < 20) return pitch/25f; + else if(pitch<=360 && pitch > 340)return (360-pitch)/25f; + else if(pitch>30 && pitch <= 50)return (50-pitch)/25f; + else if(pitch<330 && pitch >= 310)return (pitch-310)/25f; + else return 0f; + } + } +} diff --git a/Shaders/ALPSDistortion.shader b/Shaders/ALPSDistortion.shader new file mode 100644 index 0000000..81b0bd9 --- /dev/null +++ b/Shaders/ALPSDistortion.shader @@ -0,0 +1,73 @@ +Shader "Custom/ALPSDistortion" { + Properties + { + _MainTex ("Base (RGB)", 2D) = "white" {} + } + Subshader + { + Pass + { + ZTest Always Cull Off ZWrite Off + Fog { Mode off } + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + sampler2D _MainTex; + float2 _SHIFT; + float2 _CONVERGE; + float2 _SCALE; + + struct appdata { + float4 pos : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + v2f vert (appdata v) { + v2f o; + o.pos = v.pos ; + o.uv.x = (v.uv.x * 0.5f)+_SHIFT; + o.uv.y = (v.uv.y); + return o; + } + + + uniform float _AberrationOffset; + uniform float4 _Center; + uniform float _ChromaticConstant; + + float4 frag(v2f i):COLOR{ + + float2 coords = i.uv.xy; + + _AberrationOffset /= 300.0f; + _ChromaticConstant /= 300.0f; + float radius = (coords.x - _Center.x)*(coords.x - _Center.x) + (coords.y - _Center.y)*(coords.y - _Center.y); + + float radialOffsetX = (step(0, coords.x - _Center.x) * 2 - 1) * _ChromaticConstant + (coords.x - _Center.x) * _AberrationOffset; + float radialOffsetY = (step(0, coords.y - _Center.y) * 2 - 1) * _ChromaticConstant + (coords.y - _Center.y) * _AberrationOffset; + + float4 red = tex2D(_MainTex , float2(coords.x + radialOffsetX, coords.y + radialOffsetY)); + //Green Channel + float4 green = tex2D(_MainTex, coords.xy ); + //Blue Channel + float4 blue = tex2D(_MainTex, float2(coords.x - radialOffsetX, coords.y - radialOffsetY)); + + //final color + float4 finalColor = float4(red.r, green.g, blue.b, 1.0f); + return finalColor; + } + + ENDCG + + } +} + +Fallback off +}