From 84868e0bf8289d79942ff232c06e81fa097038d0 Mon Sep 17 00:00:00 2001 From: Furkan Mudanyali Date: Thu, 29 Oct 2020 22:42:39 +0300 Subject: [PATCH] Initial Commit --- .gitignore | 2 + CMakeLists.txt | 55 ++ LICENSE | 674 +++++++++++++++++++++++ README.md | 13 + es2gears.c | 719 +++++++++++++++++++++++++ sce_sys/icon0.png | Bin 0 -> 17066 bytes sce_sys/livearea/contents/bg.png | Bin 0 -> 40250 bytes sce_sys/livearea/contents/startup.png | Bin 0 -> 180 bytes sce_sys/livearea/contents/template.xml | 11 + 9 files changed, 1474 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 README.md create mode 100644 es2gears.c create mode 100644 sce_sys/icon0.png create mode 100644 sce_sys/livearea/contents/bg.png create mode 100644 sce_sys/livearea/contents/startup.png create mode 100644 sce_sys/livearea/contents/template.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..751831e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build +.DS_Store \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..35f25c1 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,55 @@ +cmake_minimum_required(VERSION 2.8) + +if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) + if(DEFINED ENV{DOLCESDK}) + set(CMAKE_TOOLCHAIN_FILE "$ENV{DOLCESDK}/share/dolce.toolchain.cmake" CACHE PATH "toolchain file") + else() + message(FATAL_ERROR "Please define DOLCESDK to point to your SDK path!") + endif() +endif() + +project(ES2GEARS) +set(DOLCE_APP_NAME "ES2GEARS") +set(DOLCE_TITLEID "ES2GEARS0") +set(DOLCE_VERSION "01.00") +include("$ENV{DOLCESDK}/share/dolce.cmake" REQUIRED) +set(DOLCE_ELF_CREATE_FLAGS "${DOLCE_ELF_CREATE_FLAGS} -h 4194304") + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11 -o3") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -o3") + +link_directories( + ${CMAKE_CURRENT_BINARY_DIR} +) + +add_executable(${PROJECT_NAME} + es2gears.c +) +target_link_libraries(${PROJECT_NAME} + freeglut-gles + m + pib + SceThreadmgr_stub + SceRtcUser_stub + SceCtrl_stub + SceGxm_stub + SceSysmem_stub + SceThreadmgr_stub + SceHid_stub + SceDisplay_stub + SceDisplayUser_stub + SceCommonDialog_stub + SceSysmodule_stub + SceTouch_stub + ScePower_stub +) +dolce_create_self(${PROJECT_NAME}.self ${PROJECT_NAME} UNSAFE) +dolce_create_vpk(${PROJECT_NAME}.vpk ${DOLCE_TITLEID} ${PROJECT_NAME}.self + VERSION ${DOLCE_VERSION} + NAME ${DOLCE_APP_NAME} + FILE sce_sys/icon0.png sce_sys/icon0.png + FILE sce_sys/livearea/contents/bg.png sce_sys/livearea/contents/bg.png + FILE sce_sys/livearea/contents/startup.png sce_sys/livearea/contents/startup.png + FILE sce_sys/livearea/contents/template.xml sce_sys/livearea/contents/template.xml +) + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -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/README.md b/README.md new file mode 100644 index 0000000..bdb4976 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# es2gears for PS Vita using freeglut-vita + +Original code can be found here: https://github.com/ehsan/gl-samples/blob/master/01-es2sdlgears/es2gears.c + +## Credits +- FMudanyali +- dots-tb +- BigBlackOniiSan +- Team CBPS +## Original Authors +- Brian Paul +- Kristian Høgsberg +- Alexandros Frantzis diff --git a/es2gears.c b/es2gears.c new file mode 100644 index 0000000..994e543 --- /dev/null +++ b/es2gears.c @@ -0,0 +1,719 @@ +/* + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * Ported to GLES2. + * Kristian Høgsberg + * May 3, 2010 + * + * Improve GLES2 port: + * * Refactor gear drawing. + * * Use correct normals for surfaces. + * * Improve shader. + * * Use perspective projection transformation. + * * Add FPS count. + * * Add comments. + * Alexandros Frantzis + * Jul 13, 2010 + */ + +#define GL_GLEXT_PROTOTYPES +#define EGL_EGLEXT_PROTOTYPES + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#ifdef __APPLE__ +#include +#include +#else +#include +#include +#include +#endif + +#define STRIPS_PER_TOOTH 7 +#define VERTICES_PER_TOOTH 34 +#define GEAR_VERTEX_STRIDE 6 + +#ifndef HAVE_BUILTIN_SINCOS +#define sincos _sincos +static void +sincos (double a, double *s, double *c) +{ + *s = sin (a); + *c = cos (a); +} +#endif + +/** + * Struct describing the vertices in triangle strip + */ +struct vertex_strip { + /** The first vertex in the strip */ + GLint first; + /** The number of consecutive vertices in the strip after the first */ + GLint count; +}; + +/* Each vertex consist of GEAR_VERTEX_STRIDE GLfloat attributes */ +typedef GLfloat GearVertex[GEAR_VERTEX_STRIDE]; + +/** + * Struct representing a gear. + */ +struct gear { + /** The array of vertices comprising the gear */ + GearVertex *vertices; + /** The number of vertices comprising the gear */ + int nvertices; + /** The array of triangle strips comprising the gear */ + struct vertex_strip *strips; + /** The number of triangle strips comprising the gear */ + int nstrips; + /** The Vertex Buffer Object holding the vertices in the graphics card */ + GLuint vbo; +}; + +/** The view rotation [x, y, z] */ +static GLfloat view_rot[3] = { 20.0, 30.0, 0.0 }; +/** The gears */ +static struct gear *gear1, *gear2, *gear3; +/** The current gear rotation angle */ +static GLfloat angle = 0.0; +/** The location of the shader uniforms */ +static GLuint ModelViewProjectionMatrix_location, + NormalMatrix_location, + LightSourcePosition_location, + MaterialColor_location; +/** The projection matrix */ +static GLfloat ProjectionMatrix[16]; +/** The direction of the directional light for the scene */ +static const GLfloat LightSourcePosition[4] = { 5.0, 5.0, 10.0, 1.0}; + +/** + * Fills a gear vertex. + * + * @param v the vertex to fill + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coortinate + * @param n pointer to the normal table + * + * @return the operation error code + */ +static GearVertex * +vert(GearVertex *v, GLfloat x, GLfloat y, GLfloat z, GLfloat n[3]) +{ + v[0][0] = x; + v[0][1] = y; + v[0][2] = z; + v[0][3] = n[0]; + v[0][4] = n[1]; + v[0][5] = n[2]; + + return v + 1; +} + +/** + * Create a gear wheel. + * + * @param inner_radius radius of hole at center + * @param outer_radius radius at center of teeth + * @param width width of gear + * @param teeth number of teeth + * @param tooth_depth depth of tooth + * + * @return pointer to the constructed struct gear + */ +static struct gear * +create_gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, + GLint teeth, GLfloat tooth_depth) +{ + GLfloat r0, r1, r2; + GLfloat da; + GearVertex *v; + struct gear *gear; + double s[5], c[5]; + GLfloat normal[3]; + int cur_strip = 0; + int i; + + /* Allocate memory for the gear */ + gear = malloc(sizeof *gear); + if (gear == NULL) + return NULL; + + /* Calculate the radii used in the gear */ + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0; + r2 = outer_radius + tooth_depth / 2.0; + + da = 2.0 * M_PI / teeth / 4.0; + + /* Allocate memory for the triangle strip information */ + gear->nstrips = STRIPS_PER_TOOTH * teeth; + gear->strips = calloc(gear->nstrips, sizeof (*gear->strips)); + + /* Allocate memory for the vertices */ + gear->vertices = calloc(VERTICES_PER_TOOTH * teeth, sizeof(*gear->vertices)); + v = gear->vertices; + + for (i = 0; i < teeth; i++) { + /* Calculate needed sin/cos for varius angles */ + sincos(i * 2.0 * M_PI / teeth, &s[0], &c[0]); + sincos(i * 2.0 * M_PI / teeth + da, &s[1], &c[1]); + sincos(i * 2.0 * M_PI / teeth + da * 2, &s[2], &c[2]); + sincos(i * 2.0 * M_PI / teeth + da * 3, &s[3], &c[3]); + sincos(i * 2.0 * M_PI / teeth + da * 4, &s[4], &c[4]); + + /* A set of macros for making the creation of the gears easier */ +#define GEAR_POINT(r, da) { (r) * c[(da)], (r) * s[(da)] } +#define SET_NORMAL(x, y, z) do { \ + normal[0] = (x); normal[1] = (y); normal[2] = (z); \ +} while(0) + +#define GEAR_VERT(v, point, sign) vert((v), p[(point)].x, p[(point)].y, (sign) * width * 0.5, normal) + +#define START_STRIP do { \ + gear->strips[cur_strip].first = v - gear->vertices; \ +} while(0); + +#define END_STRIP do { \ + int _tmp = (v - gear->vertices); \ + gear->strips[cur_strip].count = _tmp - gear->strips[cur_strip].first; \ + cur_strip++; \ +} while (0) + +#define QUAD_WITH_NORMAL(p1, p2) do { \ + SET_NORMAL((p[(p1)].y - p[(p2)].y), -(p[(p1)].x - p[(p2)].x), 0); \ + v = GEAR_VERT(v, (p1), -1); \ + v = GEAR_VERT(v, (p1), 1); \ + v = GEAR_VERT(v, (p2), -1); \ + v = GEAR_VERT(v, (p2), 1); \ +} while(0) + + struct point { + GLfloat x; + GLfloat y; + }; + + /* Create the 7 points (only x,y coords) used to draw a tooth */ + struct point p[7] = { + GEAR_POINT(r2, 1), // 0 + GEAR_POINT(r2, 2), // 1 + GEAR_POINT(r1, 0), // 2 + GEAR_POINT(r1, 3), // 3 + GEAR_POINT(r0, 0), // 4 + GEAR_POINT(r1, 4), // 5 + GEAR_POINT(r0, 4), // 6 + }; + + /* Front face */ + START_STRIP; + SET_NORMAL(0, 0, 1.0); + v = GEAR_VERT(v, 0, +1); + v = GEAR_VERT(v, 1, +1); + v = GEAR_VERT(v, 2, +1); + v = GEAR_VERT(v, 3, +1); + v = GEAR_VERT(v, 4, +1); + v = GEAR_VERT(v, 5, +1); + v = GEAR_VERT(v, 6, +1); + END_STRIP; + + /* Inner face */ + START_STRIP; + QUAD_WITH_NORMAL(4, 6); + END_STRIP; + + /* Back face */ + START_STRIP; + SET_NORMAL(0, 0, -1.0); + v = GEAR_VERT(v, 6, -1); + v = GEAR_VERT(v, 5, -1); + v = GEAR_VERT(v, 4, -1); + v = GEAR_VERT(v, 3, -1); + v = GEAR_VERT(v, 2, -1); + v = GEAR_VERT(v, 1, -1); + v = GEAR_VERT(v, 0, -1); + END_STRIP; + + /* Outer face */ + START_STRIP; + QUAD_WITH_NORMAL(0, 2); + END_STRIP; + + START_STRIP; + QUAD_WITH_NORMAL(1, 0); + END_STRIP; + + START_STRIP; + QUAD_WITH_NORMAL(3, 1); + END_STRIP; + + START_STRIP; + QUAD_WITH_NORMAL(5, 3); + END_STRIP; + } + + gear->nvertices = (v - gear->vertices); + + /* Store the vertices in a vertex buffer object (VBO) */ + glGenBuffers(1, &gear->vbo); + glBindBuffer(GL_ARRAY_BUFFER, gear->vbo); + glBufferData(GL_ARRAY_BUFFER, gear->nvertices * sizeof(GearVertex), + gear->vertices, GL_STATIC_DRAW); + + return gear; +} + +/** + * Multiplies two 4x4 matrices. + * + * The result is stored in matrix m. + * + * @param m the first matrix to multiply + * @param n the second matrix to multiply + */ +static void +multiply(GLfloat *m, const GLfloat *n) +{ + GLfloat tmp[16]; + const GLfloat *row, *column; + div_t d; + int i, j; + + for (i = 0; i < 16; i++) { + tmp[i] = 0; + d = div(i, 4); + row = n + d.quot * 4; + column = m + d.rem; + for (j = 0; j < 4; j++) + tmp[i] += row[j] * column[j * 4]; + } + memcpy(m, &tmp, sizeof tmp); +} + +/** + * Rotates a 4x4 matrix. + * + * @param[in,out] m the matrix to rotate + * @param angle the angle to rotate + * @param x the x component of the direction to rotate to + * @param y the y component of the direction to rotate to + * @param z the z component of the direction to rotate to + */ +static void +rotate(GLfloat *m, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) +{ + double s, c; + + sincos(angle, &s, &c); + GLfloat r[16] = { + x * x * (1 - c) + c, y * x * (1 - c) + z * s, x * z * (1 - c) - y * s, 0, + x * y * (1 - c) - z * s, y * y * (1 - c) + c, y * z * (1 - c) + x * s, 0, + x * z * (1 - c) + y * s, y * z * (1 - c) - x * s, z * z * (1 - c) + c, 0, + 0, 0, 0, 1 + }; + + multiply(m, r); +} + + +/** + * Translates a 4x4 matrix. + * + * @param[in,out] m the matrix to translate + * @param x the x component of the direction to translate to + * @param y the y component of the direction to translate to + * @param z the z component of the direction to translate to + */ +static void +translate(GLfloat *m, GLfloat x, GLfloat y, GLfloat z) +{ + GLfloat t[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 }; + + multiply(m, t); +} + +/** + * Creates an identity 4x4 matrix. + * + * @param m the matrix make an identity matrix + */ +static void +identity(GLfloat *m) +{ + GLfloat t[16] = { + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0, + }; + + memcpy(m, t, sizeof(t)); +} + +/** + * Transposes a 4x4 matrix. + * + * @param m the matrix to transpose + */ +static void +transpose(GLfloat *m) +{ + GLfloat t[16] = { + m[0], m[4], m[8], m[12], + m[1], m[5], m[9], m[13], + m[2], m[6], m[10], m[14], + m[3], m[7], m[11], m[15]}; + + memcpy(m, t, sizeof(t)); +} + +/** + * Inverts a 4x4 matrix. + * + * This function can currently handle only pure translation-rotation matrices. + * Read http://www.gamedev.net/community/forums/topic.asp?topic_id=425118 + * for an explanation. + */ +static void +invert(GLfloat *m) +{ + GLfloat t[16]; + identity(t); + + // Extract and invert the translation part 't'. The inverse of a + // translation matrix can be calculated by negating the translation + // coordinates. + t[12] = -m[12]; t[13] = -m[13]; t[14] = -m[14]; + + // Invert the rotation part 'r'. The inverse of a rotation matrix is + // equal to its transpose. + m[12] = m[13] = m[14] = 0; + transpose(m); + + // inv(m) = inv(r) * inv(t) + multiply(m, t); +} + +/** + * Calculate a perspective projection transformation. + * + * @param m the matrix to save the transformation in + * @param fovy the field of view in the y direction + * @param aspect the view aspect ratio + * @param zNear the near clipping plane + * @param zFar the far clipping plane + */ +void perspective(GLfloat *m, GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar) +{ + GLfloat tmp[16]; + identity(tmp); + + double sine, cosine, cotangent, deltaZ; + GLfloat radians = fovy / 2 * M_PI / 180; + + deltaZ = zFar - zNear; + sincos(radians, &sine, &cosine); + + if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) + return; + + cotangent = cosine / sine; + + tmp[0] = cotangent / aspect; + tmp[5] = cotangent; + tmp[10] = -(zFar + zNear) / deltaZ; + tmp[11] = -1; + tmp[14] = -2 * zNear * zFar / deltaZ; + tmp[15] = 0; + + memcpy(m, tmp, sizeof(tmp)); +} + +/** + * Draws a gear. + * + * @param gear the gear to draw + * @param transform the current transformation matrix + * @param x the x position to draw the gear at + * @param y the y position to draw the gear at + * @param angle the rotation angle of the gear + * @param color the color of the gear + */ +static void +draw_gear(struct gear *gear, GLfloat *transform, + GLfloat x, GLfloat y, GLfloat angle, const GLfloat color[4]) +{ + GLfloat model_view[16]; + GLfloat normal_matrix[16]; + GLfloat model_view_projection[16]; + + /* Translate and rotate the gear */ + memcpy(model_view, transform, sizeof (model_view)); + translate(model_view, x, y, 0); + rotate(model_view, 2 * M_PI * angle / 360.0, 0, 0, 1); + + /* Create and set the ModelViewProjectionMatrix */ + memcpy(model_view_projection, ProjectionMatrix, sizeof(model_view_projection)); + multiply(model_view_projection, model_view); + + glUniformMatrix4fv(ModelViewProjectionMatrix_location, 1, GL_FALSE, + model_view_projection); + + /* + * Create and set the NormalMatrix. It's the inverse transpose of the + * ModelView matrix. + */ + memcpy(normal_matrix, model_view, sizeof (normal_matrix)); + invert(normal_matrix); + transpose(normal_matrix); + glUniformMatrix4fv(NormalMatrix_location, 1, GL_FALSE, normal_matrix); + + /* Set the gear color */ + glUniform4fv(MaterialColor_location, 1, color); + + /* Set the vertex buffer object to use */ + glBindBuffer(GL_ARRAY_BUFFER, gear->vbo); + + /* Set up the position of the attributes in the vertex buffer object */ + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, + 6 * sizeof(GLfloat), NULL); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, + 6 * sizeof(GLfloat), (GLfloat *) 0 + 3); + + /* Enable the attributes */ + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + + /* Draw the triangle strips that comprise the gear */ + int n; + for (n = 0; n < gear->nstrips; n++) + glDrawArrays(GL_TRIANGLE_STRIP, gear->strips[n].first, gear->strips[n].count); + + /* Disable the attributes */ + glDisableVertexAttribArray(1); + glDisableVertexAttribArray(0); +} + +/** + * Draws the gears. + */ +static void +gears_draw(void) +{ + const static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; + const static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; + const static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; + GLfloat transform[16]; + identity(transform); + + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + /* Translate and rotate the view */ + translate(transform, 0, 0, -20); + rotate(transform, 2 * M_PI * view_rot[0] / 360.0, 1, 0, 0); + rotate(transform, 2 * M_PI * view_rot[1] / 360.0, 0, 1, 0); + rotate(transform, 2 * M_PI * view_rot[2] / 360.0, 0, 0, 1); + + /* Draw the gears */ + draw_gear(gear1, transform, -3.0, -2.0, angle, red); + draw_gear(gear2, transform, 3.1, -2.0, -2 * angle - 9.0, green); + draw_gear(gear3, transform, -3.1, 4.2, -2 * angle - 25.0, blue); + + glutSwapBuffers(); +} + +/** + * Handles a new window size or exposure. + * + * @param width the window width + * @param height the window height + */ +static void +gears_reshape(int width, int height) +{ + /* Update the projection matrix */ + perspective(ProjectionMatrix, 60.0, width / (float)height, 1.0, 1024.0); + + /* Set the viewport */ + glViewport(0, 0, (GLint) width, (GLint) height); +} + +/** + * Handles special glut events. + * + * @param special the event to handle. + */ +static void +gears_special(int special, int crap, int morecrap) +{ + switch (special) { + case GLUT_KEY_LEFT: + view_rot[1] += 5.0; + break; + case GLUT_KEY_RIGHT: + view_rot[1] -= 5.0; + break; + case GLUT_KEY_UP: + view_rot[0] += 5.0; + break; + case GLUT_KEY_DOWN: + view_rot[0] -= 5.0; + break; + } +} + +static void +gears_idle(void) +{ + static int frames = 0; + static double tRot0 = -1.0, tRate0 = -1.0; + double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0; + + if (tRot0 < 0.0) + tRot0 = t; + dt = t - tRot0; + tRot0 = t; + + /* advance rotation for next frame */ + angle += 70.0 * dt; /* 70 degrees per second */ + if (angle > 3600.0) + angle -= 3600.0; + + glutPostRedisplay(); + frames++; + + if (tRate0 < 0.0) + tRate0 = t; + if (t - tRate0 >= 5.0) { + GLfloat seconds = t - tRate0; + GLfloat fps = frames / seconds; + printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, + fps); + tRate0 = t; + frames = 0; + } +} + +static const char vertex_shader[] = +"void main(\n" +"float3 position,\n" +"float3 normal,\n" +"uniform float4x4 ModelViewProjectionMatrix,\n" +"uniform float4x4 NormalMatrix,\n" +"float4 out gl_Position : POSITION,\n" +"uniform float4 LightSourcePosition,\n" +"uniform float4 MaterialColor,\n" +"float4 out Color : COLOR)\n" +"{\n" +" float3 N = normalize(mul( float4(normal, 1.0), NormalMatrix).xyz);\n" +" float3 L = normalize(LightSourcePosition.xyz);\n" +" float diffuse = max(dot(N, L), 0.0);\n" +" Color = diffuse * MaterialColor;\n" +" gl_Position = mul(float4(position, 1.0), ModelViewProjectionMatrix);\n" +"}"; + +static const char fragment_shader[] = +"float4 main(\n" +"float4 Color : COLOR)\n" +"{\n" +" return Color;\n" +"}"; + +static void +gears_init(void) +{ + GLuint v, f, program; + const char *p; + char msg[512]; + + glEnable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + + /* Compile the vertex shader */ + p = vertex_shader; + v = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(v, 1, &p, NULL); + glCompileShader(v); + glGetShaderInfoLog(v, sizeof msg, NULL, msg); + printf("vertex shader info: %s\n", msg); + + /* Compile the fragment shader */ + p = fragment_shader; + f = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(f, 1, &p, NULL); + glCompileShader(f); + glGetShaderInfoLog(f, sizeof msg, NULL, msg); + printf("fragment shader info: %s\n", msg); + + /* Create and link the shader program */ + program = glCreateProgram(); + glAttachShader(program, v); + glAttachShader(program, f); + glBindAttribLocation(program, 0, "position"); + glBindAttribLocation(program, 1, "normal"); + + glLinkProgram(program); + glGetProgramInfoLog(program, sizeof msg, NULL, msg); + printf("info: %s\n", msg); + /* Enable the shaders */ + glUseProgram(program); + /* Get the locations of the uniforms so we can access them */ + ModelViewProjectionMatrix_location = glGetUniformLocation(program, "ModelViewProjectionMatrix"); + NormalMatrix_location = glGetUniformLocation(program, "NormalMatrix"); + LightSourcePosition_location = glGetUniformLocation(program, "LightSourcePosition"); + MaterialColor_location = glGetUniformLocation(program, "MaterialColor"); + /* Set the LightSourcePosition uniform which is constant throught the program */ + glUniform4fv(LightSourcePosition_location, 1, LightSourcePosition); + /* make the gears */ + gear1 = create_gear(1.0, 4.0, 1.0, 20, 0.7); + gear2 = create_gear(0.5, 2.0, 2.0, 10, 0.7); + gear3 = create_gear(1.3, 2.0, 0.5, 10, 0.7); +} + +int +main(int argc, char *argv[]) +{ + /* Initialize the window */ + glutInit(&argc, argv); + glutInitWindowSize(960, 544); + glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); + glutInitContextVersion(2, 0); + glutCreateWindow("es2gears"); + /* Set up glut callback functions */ + glutIdleFunc (gears_idle); + glutReshapeFunc(gears_reshape); + glutDisplayFunc(gears_draw); + glutSpecialFunc(gears_special); + /* Initialize the gears */ + gears_init(); + glutMainLoop(); + return 0; +} diff --git a/sce_sys/icon0.png b/sce_sys/icon0.png new file mode 100644 index 0000000000000000000000000000000000000000..25138923dd4616ecfd7d46055a7299310aa660ab GIT binary patch literal 17066 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 Hu0mjff>qw; literal 0 HcmV?d00001 diff --git a/sce_sys/livearea/contents/bg.png b/sce_sys/livearea/contents/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc8b463802022d18076a6e09a669b4635e63fe0 GIT binary patch literal 40250 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 literal 0 HcmV?d00001 diff --git a/sce_sys/livearea/contents/startup.png b/sce_sys/livearea/contents/startup.png new file mode 100644 index 0000000000000000000000000000000000000000..62d755d2e03cfbb442f7e746a796170f4cd96141 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0y~yV3Yu|=W#Ft$$RIXo(EErC9V-A!TD(=<%vb942~)J zNvR5+xryniL8*x;m4zo$ZGei{0(?STf%O0X|CipJe;3Gd@pN$vskrs#U?Y&jaCpJb k;P?j|p^P97all46fnjYP1EZUxM+ZoUr>mdKI;Vst0B?0F4*&oF literal 0 HcmV?d00001 diff --git a/sce_sys/livearea/contents/template.xml b/sce_sys/livearea/contents/template.xml new file mode 100644 index 0000000..a4d43f0 --- /dev/null +++ b/sce_sys/livearea/contents/template.xml @@ -0,0 +1,11 @@ + + + + + bg.png + + + + startup.png + +