Compare commits
36 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
0cc202f757 | ||
![]() |
236903dfeb | ||
![]() |
d05675d9b8 | ||
![]() |
a9ae5adc5c | ||
![]() |
fb8d53359e | ||
![]() |
3dd42d77ca | ||
e0693e0bf8 | |||
8eb92e2ff2 | |||
423f488740 | |||
adb11eaeb3 | |||
e0c524b985 | |||
3f18fa68c6 | |||
607c2e5c65 | |||
18e1dc9f84 | |||
5b3e45405c | |||
20887460f1 | |||
548188c24a | |||
f7345bcfb2 | |||
fcd755cd12 | |||
920ac8cb20 | |||
e9541980c0 | |||
b469cf2bf7 | |||
752f014935 | |||
f322784a9a | |||
86e799bdfa | |||
2b0c623ad4 | |||
91b504bc63 | |||
1707c6cb11 | |||
39ac99553d | |||
ec312fbe09 | |||
c6c92f86f6 | |||
31dae9d4e3 | |||
de79013881 | |||
f59e53e7a4 | |||
43ea0339f1 | |||
ccd988640d |
106
.classpath
106
.classpath
@ -1,106 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry excluding="**/__*" kind="src" path="src">
|
||||
<attributes>
|
||||
<attribute name="optional" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="src" path="resources"/>
|
||||
<classpathentry including="**/*.java" kind="src" output="out/eclipse/classes-test" path="test/src">
|
||||
<attributes>
|
||||
<attribute name="test" value="true"/>
|
||||
<attribute name="optional" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-14">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lwjgl3-awt-0.1.7.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/pngdecoder.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lwjgl/lwjgl.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lwjgl/lwjgl-assimp.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lwjgl/lwjgl-assimp-natives-linux.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lwjgl/lwjgl-glfw.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lwjgl/lwjgl-glfw-natives-linux.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lwjgl/lwjgl-jawt.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lwjgl/lwjgl-natives-linux.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lwjgl/lwjgl-opengl.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lwjgl/lwjgl-stb.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lwjgl/lwjgl-stb-natives-linux.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry exported="true" kind="lib" path="lib/lwjgl/lwjgl-opengl-natives-linux.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5">
|
||||
<attributes>
|
||||
<attribute name="test" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/atriasoft-egami">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/atriasoft-etk">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/atriasoft-io-gami">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="output" path="out/eclipse/classes"/>
|
||||
</classpath>
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,5 @@
|
||||
|
||||
/__pycache__/
|
||||
/bin/
|
||||
/Operator/
|
||||
/DrawerProperties/
|
||||
|
24
.project
24
.project
@ -1,24 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>atriasoft-gale</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
<project>atriasoft-gale</project>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
Binary file not shown.
@ -1,29 +0,0 @@
|
||||
Copyright (c) 2012-present Lightweight Java Game Library
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
- Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
- Neither the name Lightweight Java Game Library nor the names of
|
||||
its contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
@ -1,78 +0,0 @@
|
||||
Open Asset Import Library (assimp)
|
||||
|
||||
Copyright (c) 2006-2016, assimp team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
with or without modification, are permitted provided that the
|
||||
following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
|
||||
******************************************************************************
|
||||
|
||||
AN EXCEPTION applies to all files in the ./test/models-nonbsd folder.
|
||||
These are 3d models for testing purposes, from various free sources
|
||||
on the internet. They are - unless otherwise stated - copyright of
|
||||
their respective creators, which may impose additional requirements
|
||||
on the use of their work. For any of these models, see
|
||||
<model-name>.source.txt for more legal information. Contact us if you
|
||||
are a copyright holder and believe that we credited you inproperly or
|
||||
if you don't want your files to appear in the repository.
|
||||
|
||||
|
||||
******************************************************************************
|
||||
|
||||
Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
|
||||
http://code.google.com/p/poly2tri/
|
||||
|
||||
All rights reserved.
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the name of Poly2Tri nor the names of its contributors may be
|
||||
used to endorse or promote products derived from this software without specific
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
@ -1 +0,0 @@
|
||||
LWJGL 3.2.3 SNAPSHOT build 13
|
@ -1,14 +0,0 @@
|
||||
Copyright (c) 2007-2015 Daniel Adler <dadler AT uni-goettingen DOT de>,
|
||||
Tassilo Philipp <tphilipp AT potion-studios DOT com>
|
||||
|
||||
Permission to use, copy, modify, and distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
@ -1,21 +0,0 @@
|
||||
Copyright (c) 2002-2006 Marcus Geelnard
|
||||
Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would
|
||||
be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
@ -1,22 +0,0 @@
|
||||
/*
|
||||
** Copyright (c) 2013-2014 The Khronos Group Inc.
|
||||
**
|
||||
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||
** copy of this software and/or associated documentation files (the
|
||||
** "Materials"), to deal in the Materials without restriction, including
|
||||
** without limitation the rights to use, copy, modify, merge, publish,
|
||||
** distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
** permit persons to whom the Materials are 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 Materials.
|
||||
**
|
||||
** THE MATERIALS ARE 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 THE AUTHORS OR COPYRIGHT HOLDERS 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
|
||||
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
*/
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,27 +0,0 @@
|
||||
{
|
||||
"build": "stable",
|
||||
"mode": "zip",
|
||||
"selectedAddons": [],
|
||||
"platform": [
|
||||
"linux"
|
||||
],
|
||||
"descriptions": false,
|
||||
"compact": false,
|
||||
"hardcoded": false,
|
||||
"javadoc": false,
|
||||
"includeJSON": true,
|
||||
"source": true,
|
||||
"osgi": false,
|
||||
"language": "groovy",
|
||||
"contents": [
|
||||
"lwjgl",
|
||||
"lwjgl-assimp",
|
||||
"lwjgl-egl",
|
||||
"lwjgl-glfw",
|
||||
"lwjgl-jawt",
|
||||
"lwjgl-openal",
|
||||
"lwjgl-opengl",
|
||||
"lwjgl-opengles",
|
||||
"lwjgl-stb"
|
||||
]
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,481 +0,0 @@
|
||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the library GPL. It is
|
||||
numbered 2 because it goes with version 2 of the ordinary GPL.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Library General Public License, applies to some
|
||||
specially designated Free Software Foundation software, and to any
|
||||
other libraries whose authors decide to use it. You can use it for
|
||||
your libraries, 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
|
||||
this service 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 make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if
|
||||
you distribute copies of the library, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link a program with the library, you must provide
|
||||
complete object files to the recipients so that they can relink them
|
||||
with the library, after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
Our method of protecting your rights has two steps: (1) copyright
|
||||
the library, and (2) offer you this license which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
Also, for each distributor's protection, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
library. If the library is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original
|
||||
version, so that any problems introduced by others will not reflect on
|
||||
the original authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that companies distributing free
|
||||
software will individually obtain patent licenses, thus in effect
|
||||
transforming the program into proprietary software. To prevent this,
|
||||
we have made it clear that any patent must be licensed for everyone's
|
||||
free use or not licensed at all.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the ordinary
|
||||
GNU General Public License, which was designed for utility programs. This
|
||||
license, the GNU Library General Public License, applies to certain
|
||||
designated libraries. This license is quite different from the ordinary
|
||||
one; be sure to read it in full, and don't assume that anything in it is
|
||||
the same as in the ordinary license.
|
||||
|
||||
The reason we have a separate public license for some libraries is that
|
||||
they blur the distinction we usually make between modifying or adding to a
|
||||
program and simply using it. Linking a program with a library, without
|
||||
changing the library, is in some sense simply using the library, and is
|
||||
analogous to running a utility program or application program. However, in
|
||||
a textual and legal sense, the linked executable is a combined work, a
|
||||
derivative of the original library, and the ordinary General Public License
|
||||
treats it as such.
|
||||
|
||||
Because of this blurred distinction, using the ordinary General
|
||||
Public License for libraries did not effectively promote software
|
||||
sharing, because most developers did not use the libraries. We
|
||||
concluded that weaker conditions might promote sharing better.
|
||||
|
||||
However, unrestricted linking of non-free programs would deprive the
|
||||
users of those programs of all benefit from the free status of the
|
||||
libraries themselves. This Library General Public License is intended to
|
||||
permit developers of non-free programs to use free libraries, while
|
||||
preserving your freedom as a user of such programs to change the free
|
||||
libraries that are incorporated in them. (We have not seen how to achieve
|
||||
this as regards changes in header files, but we have achieved it as regards
|
||||
changes in the actual functions of the Library.) The hope is that this
|
||||
will lead to faster development of free libraries.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, while the latter only
|
||||
works together with the library.
|
||||
|
||||
Note that it is possible for a library to be covered by the ordinary
|
||||
General Public License rather than by this special one.
|
||||
|
||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library which
|
||||
contains a notice placed by the copyright holder or other authorized
|
||||
party saying it may be distributed under the terms of this Library
|
||||
General Public License (also called "this License"). Each licensee is
|
||||
addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also compile or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
c) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
d) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the source code distributed need not include anything that is normally
|
||||
distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
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
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Library 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 Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "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
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY 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
|
||||
LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
100
lutin_org-atriasoft-gale.py
Normal file
100
lutin_org-atriasoft-gale.py
Normal file
@ -0,0 +1,100 @@
|
||||
#!/usr/bin/python
|
||||
import realog.debug as debug
|
||||
import lutin.tools as tools
|
||||
import realog.debug as debug
|
||||
import lutin.image as image
|
||||
import os
|
||||
import lutin.multiprocess as lutinMultiprocess
|
||||
|
||||
|
||||
def get_type():
|
||||
return "LIBRARY_DYNAMIC"
|
||||
|
||||
def get_desc():
|
||||
return "Ewol Tool Kit"
|
||||
|
||||
def get_licence():
|
||||
return "MPL-2"
|
||||
|
||||
def get_compagny_type():
|
||||
return "org"
|
||||
|
||||
def get_compagny_name():
|
||||
return "atria-soft"
|
||||
|
||||
#def get_maintainer():
|
||||
# return "authors.txt"
|
||||
|
||||
#def get_version():
|
||||
# return "version.txt"
|
||||
|
||||
def configure(target, my_module):
|
||||
|
||||
my_module.add_src_file([
|
||||
'src/module-info.java',
|
||||
'src/org/atriasoft/gale/TextureFilter.java',
|
||||
'src/org/atriasoft/gale/internal/LOGGER.java',
|
||||
'src/org/atriasoft/gale/DisplayManagerDraw.java',
|
||||
'src/org/atriasoft/gale/test/sample1/Sample1.java',
|
||||
'src/org/atriasoft/gale/test/sample1/Sample1Application.java',
|
||||
'src/org/atriasoft/gale/test/sample1/LOGGER.java',
|
||||
'src/org/atriasoft/gale/test/sample2/Sample2Application.java',
|
||||
'src/org/atriasoft/gale/test/sample2/Main.java',
|
||||
'src/org/atriasoft/gale/test/sample2/LOGGER.java',
|
||||
'src/org/atriasoft/gale/context/ClipboardList.java',
|
||||
'src/org/atriasoft/gale/context/Cursor.java',
|
||||
'src/org/atriasoft/gale/context/LWJG_AWT/ContextLWJGLAWT.java',
|
||||
'src/org/atriasoft/gale/context/GaleContext.java',
|
||||
'src/org/atriasoft/gale/context/ClipBoard.java',
|
||||
'src/org/atriasoft/gale/context/CommandLine.java',
|
||||
'src/org/atriasoft/gale/context/GaleContextTest.java',
|
||||
'src/org/atriasoft/gale/backend3d/OpenGL.java',
|
||||
'src/org/atriasoft/gale/Orientation.java',
|
||||
'src/org/atriasoft/gale/resource/ResourceTexture2.java',
|
||||
'src/org/atriasoft/gale/resource/ResourceShader.java',
|
||||
'src/org/atriasoft/gale/resource/ResourceTexture.java',
|
||||
'src/org/atriasoft/gale/resource/ResourceManager.java',
|
||||
'src/org/atriasoft/gale/resource/ResourceVirtualArrayObject.java',
|
||||
'src/org/atriasoft/gale/resource/Resource.java',
|
||||
'src/org/atriasoft/gale/resource/ResourceVirtualBufferObject.java',
|
||||
'src/org/atriasoft/gale/resource/ResourceColored3DObject.java',
|
||||
'src/org/atriasoft/gale/resource/ResourceTextureFile.java',
|
||||
'src/org/atriasoft/gale/resource/ResourceProgram.java',
|
||||
'src/org/atriasoft/gale/key/KeySpecial.java',
|
||||
'src/org/atriasoft/gale/key/KeyStatus.java',
|
||||
'src/org/atriasoft/gale/key/KeyType.java',
|
||||
'src/org/atriasoft/gale/key/KeyKeyboard.java',
|
||||
'src/org/atriasoft/gale/GaleApplication.java',
|
||||
'src/org/atriasoft/gale/Fps.java',
|
||||
'src/org/atriasoft/gale/Gale.java',
|
||||
'src/org/atriasoft/gale/tools/ImageRawData.java',
|
||||
'src/org/atriasoft/gale/tools/ImageLoader.java',
|
||||
])
|
||||
my_module.add_path('src/', type='java')
|
||||
|
||||
my_module.add_depend([
|
||||
'org-atriasoft-iogami',
|
||||
'org-atriasoft-pngdecoder',
|
||||
])
|
||||
|
||||
my_module.add_path([
|
||||
'lib/lwjgl/lwjgl.jar',
|
||||
'lib/lwjgl3-awt-0.1.7.jar',
|
||||
'lib/lwjgl/lwjgl-assimp.jar',
|
||||
'lib/lwjgl/lwjgl-assimp-natives-linux.jar',
|
||||
'lib/lwjgl/lwjgl-jawt.jar',
|
||||
'lib/lwjgl/lwjgl-glfw-natives-linux.jar',
|
||||
'lib/lwjgl/lwjgl-glfw.jar',
|
||||
'lib/lwjgl/lwjgl-natives-linux.jar',
|
||||
'lib/lwjgl/lwjgl-opengl.jar',
|
||||
'lib/lwjgl/lwjgl-opengl-natives-linux.jar',
|
||||
'lib/lwjgl/lwjgl-stb.jar',
|
||||
'lib/lwjgl/lwjgl-stb-natives-linux.jar',
|
||||
],
|
||||
type='java',
|
||||
export=True
|
||||
);
|
||||
my_module.add_flag('java', "RELEASE_15_PREVIEW");
|
||||
|
||||
return True
|
||||
|
357
pom.xml
Normal file
357
pom.xml
Normal file
@ -0,0 +1,357 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.atriasoft</groupId>
|
||||
<artifactId>gale</artifactId>
|
||||
<version>0.1.0</version>
|
||||
<properties>
|
||||
<lwjgl.version>3.3.3</lwjgl.version>
|
||||
<lwjgl3-awt.version>0.1.8</lwjgl3-awt.version>
|
||||
<lwjgl.natives>natives-linux</lwjgl.natives>
|
||||
</properties>
|
||||
<licenses>
|
||||
<license>
|
||||
<name>Mozilla Public License 2.0</name>
|
||||
<url>https://opensource.org/licenses/MPL-2.0</url>
|
||||
<distribution>repo</distribution>
|
||||
</license>
|
||||
</licenses>
|
||||
<developers>
|
||||
<developer>
|
||||
<id>dev1</id>
|
||||
<name>Edouard DUPIN</name>
|
||||
<email>edouard.dupin@proton.me</email>
|
||||
<roles>
|
||||
<role>Lead Developer</role>
|
||||
</roles>
|
||||
</developer>
|
||||
</developers>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>gitea</id>
|
||||
<url>https://gitea.atria-soft.org/api/packages/org.atriasoft/maven</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<distributionManagement>
|
||||
<repository>
|
||||
<id>gitea</id>
|
||||
<url>https://gitea.atria-soft.org/api/packages/org.atriasoft/maven</url>
|
||||
</repository>
|
||||
<snapshotRepository>
|
||||
<id>gitea</id>
|
||||
<url>https://gitea.atria-soft.org/api/packages/org.atriasoft/maven</url>
|
||||
</snapshotRepository>
|
||||
</distributionManagement>
|
||||
<!--
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>lwjgl-natives-linux-amd64</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>unix</family>
|
||||
<name>linux</name>
|
||||
<arch>amd64</arch>
|
||||
</os>
|
||||
</activation>
|
||||
<properties>
|
||||
<lwjgl.natives>natives-linux</lwjgl.natives>
|
||||
</properties>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>lwjgl-natives-linux-aarch64</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>unix</family>
|
||||
<name>linux</name>
|
||||
<arch>aarch64</arch>
|
||||
</os>
|
||||
</activation>
|
||||
<properties>
|
||||
<lwjgl.natives>natives-linux-arm64</lwjgl.natives>
|
||||
</properties>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>lwjgl-natives-linux-arm</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>unix</family>
|
||||
<name>linux</name>
|
||||
<arch>arm</arch>
|
||||
</os>
|
||||
</activation>
|
||||
<properties>
|
||||
<lwjgl.natives>natives-linux-arm32</lwjgl.natives>
|
||||
</properties>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>lwjgl-natives-linux-arm32</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>unix</family>
|
||||
<name>linux</name>
|
||||
<arch>arm32</arch>
|
||||
</os>
|
||||
</activation>
|
||||
<properties>
|
||||
<lwjgl.natives>natives-linux-arm32</lwjgl.natives>
|
||||
</properties>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>lwjgl-natives-macos-x86_64</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>mac</family>
|
||||
<arch>x86_64</arch>
|
||||
</os>
|
||||
</activation>
|
||||
<properties>
|
||||
<lwjgl.natives>natives-macos</lwjgl.natives>
|
||||
</properties>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>lwjgl-natives-macos-aarch64</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>mac</family>
|
||||
<arch>aarch64</arch>
|
||||
</os>
|
||||
</activation>
|
||||
<properties>
|
||||
<lwjgl.natives>natives-macos-arm64</lwjgl.natives>
|
||||
</properties>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>lwjgl-natives-windows-amd64</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>windows</family>
|
||||
<arch>amd64</arch>
|
||||
</os>
|
||||
</activation>
|
||||
<properties>
|
||||
<lwjgl.natives>natives-windows</lwjgl.natives>
|
||||
</properties>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>lwjgl-natives-windows-x86</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>windows</family>
|
||||
<arch>x86</arch>
|
||||
</os>
|
||||
</activation>
|
||||
<properties>
|
||||
<lwjgl.natives>natives-windows-x86</lwjgl.natives>
|
||||
</properties>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>lwjgl-natives-windows-aarch64</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>windows</family>
|
||||
<arch>aarch64</arch>
|
||||
</os>
|
||||
</activation>
|
||||
<properties>
|
||||
<lwjgl.natives>natives-windows-arm64</lwjgl.natives>
|
||||
</properties>
|
||||
</profile>
|
||||
</profiles>
|
||||
-->
|
||||
<!--
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-bom</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
<scope>import</scope>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
-->
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.atriasoft</groupId>
|
||||
<artifactId>io-gami</artifactId>
|
||||
<version>0.1.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.atriasoft</groupId>
|
||||
<artifactId>png-decoder</artifactId>
|
||||
<version>0.1.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- generate with https://www.lwjgl.org/customize -->
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-assimp</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-glfw</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-jawt</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-openal</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-opengl</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-stb</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
<classifier>${lwjgl.natives}</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-assimp</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
<classifier>${lwjgl.natives}</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-glfw</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
<classifier>${lwjgl.natives}</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-openal</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
<classifier>${lwjgl.natives}</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-opengl</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
<classifier>${lwjgl.natives}</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-stb</artifactId>
|
||||
<version>${lwjgl.version}</version>
|
||||
<classifier>${lwjgl.natives}</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjglx</groupId>
|
||||
<artifactId>lwjgl3-awt</artifactId>
|
||||
<version>${lwjgl3-awt.version}</version>
|
||||
</dependency>
|
||||
<!-- Test tools section-->
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<version>5.11.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- generic logger of SLF4J to console (in color) -->
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
<version>1.5.18</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<sourceDirectory>src/main</sourceDirectory>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/resources</directory>
|
||||
</resource>
|
||||
</resources>
|
||||
<testSourceDirectory>src/test</testSourceDirectory>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.14.0</version>
|
||||
<configuration>
|
||||
<source>21</source>
|
||||
<target>21</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!-- Create the source bundle -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<version>3.3.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-sources</id>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<!-- junit results -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>3.2.5</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifest>
|
||||
<mainClass>fully.qualified.MainClass</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
<descriptorRefs>
|
||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||
</descriptorRefs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!-- Java-doc generation for stand-alone site -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
<configuration>
|
||||
<show>private</show>
|
||||
<nohelp>true</nohelp>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<!-- Generate Java-docs As Part Of Project Reports -->
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
<configuration>
|
||||
<show>public</show>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting>
|
||||
|
||||
</project>
|
88
src/main/org/atriasoft/gale/Fps.java
Normal file
88
src/main/org/atriasoft/gale/Fps.java
Normal file
@ -0,0 +1,88 @@
|
||||
package org.atriasoft.gale;
|
||||
|
||||
public class Fps {
|
||||
private long startTime = 0;
|
||||
private long nbCallTime = 0;
|
||||
private long nbDisplayTime = 0;
|
||||
private float min = (float) 99999999999999.0;
|
||||
private float avg = 0;
|
||||
private float max = 0;
|
||||
private float minIdle = (float) 9999999999999.0;
|
||||
private float avgIdle = 0;
|
||||
private float maxIdle = 0;
|
||||
private long ticTime = 0;
|
||||
private boolean display = false;
|
||||
private boolean drawingDone = false;
|
||||
private String displayName = null;
|
||||
private final boolean displayFPS;
|
||||
public Fps(final String displayName, final boolean displayFPS) {
|
||||
this.displayName = displayName;
|
||||
this.displayFPS = displayFPS;
|
||||
}
|
||||
public void tic() {
|
||||
long currentTime = System.nanoTime();
|
||||
this.ticTime = currentTime;
|
||||
this.nbCallTime++;
|
||||
if (this.startTime == 0) {
|
||||
this.startTime = currentTime;
|
||||
}
|
||||
if ( (currentTime - this.startTime) > 10000000000L) {
|
||||
this.display = true;
|
||||
}
|
||||
}
|
||||
public void toc() {
|
||||
toc(false);
|
||||
}
|
||||
public void toc(final boolean displayTime) {
|
||||
long currentTime = System.nanoTime();
|
||||
long processTimeLocal = (currentTime - this.ticTime);
|
||||
if (displayTime) {
|
||||
System.out.println(this.displayName + ": processTime: " + processTimeLocal);
|
||||
}
|
||||
if (this.drawingDone) {
|
||||
this.min = Math.min(this.min, processTimeLocal);
|
||||
this.max = Math.max(this.max, processTimeLocal);
|
||||
this.avg += processTimeLocal;
|
||||
this.drawingDone = false;
|
||||
} else {
|
||||
this.minIdle = Math.min(this.minIdle, processTimeLocal);
|
||||
this.maxIdle = Math.max(this.maxIdle, processTimeLocal);
|
||||
this.avgIdle += processTimeLocal;
|
||||
}
|
||||
}
|
||||
|
||||
public void incrementCounter() {
|
||||
this.nbDisplayTime++;
|
||||
this.drawingDone = true;
|
||||
}
|
||||
|
||||
public void draw() {
|
||||
if (this.display) {
|
||||
if (this.nbDisplayTime > 0) {
|
||||
System.out.println(this.displayName + " : Active : "
|
||||
+ this.min + " "
|
||||
+ this.avg / this.nbDisplayTime + "ms "
|
||||
+ this.max + " ");
|
||||
}
|
||||
if (this.nbCallTime-this.nbDisplayTime>0) {
|
||||
System.out.println(this.displayName + " : idle : "
|
||||
+ this.minIdle + " "
|
||||
+ this.avgIdle / (this.nbCallTime-this.nbDisplayTime) + "ms "
|
||||
+ this.maxIdle + " ");
|
||||
}
|
||||
if (this.displayFPS) {
|
||||
System.out.println("FPS : " + this.nbDisplayTime + "/" + this.nbCallTime + "fps");
|
||||
}
|
||||
this.max = 0;
|
||||
this.min = 99999999;
|
||||
this.avg = 0;
|
||||
this.maxIdle = 0;
|
||||
this.minIdle = 99999999;
|
||||
this.avgIdle = 0;
|
||||
this.nbCallTime = 0;
|
||||
this.nbDisplayTime = 0;
|
||||
this.startTime = 0;
|
||||
this.display = false;
|
||||
}
|
||||
}
|
||||
}
|
@ -4,15 +4,17 @@ import org.atriasoft.etk.Uri;
|
||||
import org.atriasoft.gale.context.GaleContext;
|
||||
//import org.atriasoft.gale.context.JOGL.ContextJOGL;
|
||||
import org.atriasoft.gale.context.LWJG_AWT.ContextLWJGLAWT;
|
||||
//import org.atriasoft.gale.context.LWJGL.ContextLWJGL;
|
||||
import org.atriasoft.gale.internal.Log;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class Gale {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(Gale.class);
|
||||
|
||||
public static GaleContext getContext() {
|
||||
// TODO Auto-generated method stub
|
||||
return GaleContext.getContext();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get GALE version
|
||||
* @return The string that describe gale version
|
||||
@ -20,16 +22,16 @@ public class Gale {
|
||||
public static String getVersion() {
|
||||
return "J-0.5";
|
||||
}
|
||||
|
||||
|
||||
public static void init() {
|
||||
Uri.addLibrary("gale", Gale.class, "/resources/gale/");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is the only one things the User might done in his main();
|
||||
* @note To answare you before you ask the question, this is really simple:
|
||||
* Due to the fect that the current system is multiple-platform, you "main"
|
||||
* Does not exist in the android platform, then gale call other start
|
||||
* Does not exist in the android platform, then gale call other start
|
||||
* and stop function, to permit to have only one code
|
||||
* @note The main can not be in the gale, due to the fact thet is an librairy
|
||||
* @param _application just created instance of the applicationo
|
||||
@ -41,17 +43,17 @@ public class Gale {
|
||||
init();
|
||||
//etk::init(_argc, _argv);
|
||||
GaleContext context = null;
|
||||
String request = "";
|
||||
|
||||
final String request = "";
|
||||
|
||||
//context = ContextLWJGL.create(application, arg);
|
||||
//context = ContextJOGL.create(application, arg);
|
||||
context = ContextLWJGLAWT.create(application, arg);
|
||||
if (context == null) {
|
||||
Log.error("Can not allocate the interface of the GUI ...");
|
||||
LOGGER.error("Can not allocate the interface of the GUI ...");
|
||||
return -1;
|
||||
}
|
||||
return context.run();
|
||||
}
|
||||
|
||||
|
||||
private Gale() {}
|
||||
}
|
@ -1,41 +1,45 @@
|
||||
package org.atriasoft.gale;
|
||||
|
||||
import java.time.Clock;
|
||||
|
||||
import org.atriasoft.etk.Uri;
|
||||
import org.atriasoft.etk.math.Vector2f;
|
||||
import org.atriasoft.gale.context.ClipboardList;
|
||||
import org.atriasoft.gale.context.GaleContext;
|
||||
import org.atriasoft.gale.context.Cursor;
|
||||
import org.atriasoft.gale.internal.Log;
|
||||
import org.atriasoft.gale.context.GaleContext;
|
||||
import org.atriasoft.gale.key.KeyKeyboard;
|
||||
import org.atriasoft.gale.key.KeySpecial;
|
||||
import org.atriasoft.gale.key.KeyStatus;
|
||||
import org.atriasoft.gale.key.KeyType;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class GaleApplication {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(GaleApplication.class);
|
||||
private boolean needRedraw = true;
|
||||
private String title = "gale";
|
||||
private Uri iconName = null;
|
||||
private final Cursor cursor = Cursor.arrow;
|
||||
private Orientation orientation = Orientation.screenAuto;
|
||||
private Vector2f windowsSize = new Vector2f(800, 600);
|
||||
|
||||
|
||||
public GaleApplication() {
|
||||
Log.verbose("Constructor Gale Application");
|
||||
LOGGER.trace("Constructor Gale Application");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Exit the application (not availlable on IOs, ==> the user will not understand the comportement. He will think the application has crashed (Apple philosophie))
|
||||
* @param value value to return on the program
|
||||
*/
|
||||
public void exit(final int value) {
|
||||
Log.verbose("Exit Requested " + value);
|
||||
LOGGER.trace("Exit Requested " + value);
|
||||
Gale.getContext().stop();
|
||||
}
|
||||
|
||||
|
||||
public float getAspectRatio() {
|
||||
return this.windowsSize.x() / this.windowsSize.y();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the cursor type.
|
||||
* @return the current cursor.
|
||||
@ -43,7 +47,7 @@ public class GaleApplication {
|
||||
public Cursor getCursor() {
|
||||
return this.cursor;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the current filename of the application.
|
||||
* @return Filename of the icon.
|
||||
@ -51,7 +55,7 @@ public class GaleApplication {
|
||||
public Uri getIcon() {
|
||||
return this.iconName;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the screen orientation (if possible : only on iOs/Android)
|
||||
* @return Current orientation.
|
||||
@ -59,7 +63,7 @@ public class GaleApplication {
|
||||
public Orientation getOrientation() {
|
||||
return this.orientation;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the position of the window.
|
||||
* @return Current position of the window.
|
||||
@ -67,7 +71,7 @@ public class GaleApplication {
|
||||
public Vector2f getPosition() {
|
||||
return new Vector2f(0, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the size of the window.
|
||||
* @return Current size of the window.
|
||||
@ -75,7 +79,7 @@ public class GaleApplication {
|
||||
public Vector2f getSize() {
|
||||
return this.windowsSize;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the current title of the application
|
||||
* @return Current title
|
||||
@ -83,13 +87,13 @@ public class GaleApplication {
|
||||
public String getTitle() {
|
||||
return this.title;
|
||||
}
|
||||
|
||||
|
||||
public boolean isDrawingNeeded() {
|
||||
final boolean tmp = this.needRedraw;
|
||||
this.needRedraw = false;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Hide the virtal keyboard (if possible : only on iOs/Android)
|
||||
*/
|
||||
@ -100,7 +104,7 @@ public class GaleApplication {
|
||||
}
|
||||
context.keyboardHide();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show the virtal keyboard (if possible : only on iOs/Android)
|
||||
*/
|
||||
@ -111,43 +115,43 @@ public class GaleApplication {
|
||||
}
|
||||
context.keyboardShow();
|
||||
}
|
||||
|
||||
|
||||
public void markDrawingIsNeeded() {
|
||||
this.needRedraw = true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* A clipboard data is back (apear after a request of a new clipboard).
|
||||
* @param clipboardId Id of the clipboard.
|
||||
*/
|
||||
public void onClipboardEvent(final ClipboardList clipboardId) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The application is created.
|
||||
* @param context Current gale context.
|
||||
*/
|
||||
public void onCreate(final GaleContext context) {
|
||||
Log.verbose("Create Gale Application");
|
||||
LOGGER.trace("Create Gale Application");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The application is removed (call destructor just adter it.).
|
||||
* @param context Current gale context.
|
||||
*/
|
||||
public void onDestroy(final GaleContext context) {
|
||||
Log.verbose("Destroy Gale Application");
|
||||
LOGGER.trace("Destroy Gale Application");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Real draw of the application
|
||||
* @param context Current gale context.
|
||||
*/
|
||||
public void onDraw(final GaleContext context) {
|
||||
Log.verbose("draw Gale Application");
|
||||
LOGGER.trace("draw Gale Application");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get keyborad value input.
|
||||
* @param special Current special key status (ctrl/alt/shift ...).
|
||||
@ -155,41 +159,46 @@ public class GaleApplication {
|
||||
* @param value Unicode value of the char pushed (viable only if type==gale::key::keyboard::character).
|
||||
* @param state State of the key (up/down/upRepeate/downRepeate)
|
||||
*/
|
||||
public void onKeyboard(final KeySpecial special, final KeyKeyboard type, final Character value, final KeyStatus state) {
|
||||
|
||||
public void onKeyboard(
|
||||
final KeySpecial special,
|
||||
final KeyKeyboard type,
|
||||
final Character value,
|
||||
final KeyStatus state) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The user request application removing.
|
||||
* @param context Current gale context.
|
||||
*/
|
||||
public void onKillDemand(final GaleContext context) {
|
||||
Log.info("Gale request auto destroy ==> no applification specification");
|
||||
LOGGER.info("Gale request auto destroy ==> no applification specification");
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Event generated when user change the position of the window.
|
||||
* @param size New position of the window.
|
||||
*/
|
||||
public void onMovePosition(final Vector2f size) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The application is Hide / not visible.
|
||||
* @param context Current gale context.
|
||||
*/
|
||||
public void onPause(final GaleContext context) {
|
||||
Log.verbose("Pause Gale Application");
|
||||
LOGGER.trace("Pause Gale Application");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Call every time a draw is called (not entirely periodic, but faster at we can ...
|
||||
* @param time Current time of the call;
|
||||
* Call when contrext finish process event in the buffer and add a latency of 10ms between calls
|
||||
* @param clock Current time of the call;
|
||||
* @param time time of the program in nanoseconds (monotonic) ==> need restart application approximately every 292 years
|
||||
*/
|
||||
public void onPeriod(final long time) {}
|
||||
|
||||
public void onPeriod(final Clock clock, final long time) {}
|
||||
|
||||
/**
|
||||
* Get touch/mouse/... event.
|
||||
* @param type Type of pointer event
|
||||
@ -197,56 +206,61 @@ public class GaleApplication {
|
||||
* @param pos Position of the event (can be <0 if out of window).
|
||||
* @param state Key state (up/down/move)
|
||||
*/
|
||||
public void onPointer(final KeySpecial special, final KeyType type, final int pointerID, final Vector2f pos, final KeyStatus state) {
|
||||
|
||||
public void onPointer(
|
||||
final KeySpecial special,
|
||||
final KeyType type,
|
||||
final int pointerID,
|
||||
final Vector2f pos,
|
||||
final KeyStatus state) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* call application to precalculate drawing.
|
||||
* @param context Current gale context.
|
||||
*/
|
||||
public void onRegenerateDisplay(final GaleContext context) {
|
||||
//Log.verbose("Regenerate Gale Application");
|
||||
//LOGGER.trace("Regenerate Gale Application");
|
||||
markDrawingIsNeeded();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Event generated when user change the size of the window.
|
||||
* @param size New size of the window.
|
||||
*/
|
||||
public void onResize(final Vector2f size) {
|
||||
if (size == null) {
|
||||
Log.error("Try to set a null size ...");
|
||||
LOGGER.error("Try to set a null size ...");
|
||||
return;
|
||||
}
|
||||
this.windowsSize = size;
|
||||
markDrawingIsNeeded();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The application is resumed (now visible).
|
||||
* @param context Current gale context.
|
||||
*/
|
||||
public void onResume(final GaleContext context) {
|
||||
Log.verbose("Start Gale Application");
|
||||
LOGGER.trace("Start Gale Application");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The application is started.
|
||||
* @param context Current gale context.
|
||||
*/
|
||||
public void onStart(final GaleContext context) {
|
||||
Log.verbose("Start Gale Application");
|
||||
LOGGER.trace("Start Gale Application");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The application is stopped.
|
||||
* @param context Current gale context.
|
||||
*/
|
||||
public void onStop(final GaleContext context) {
|
||||
Log.verbose("Stop Gale Application");
|
||||
LOGGER.trace("Stop Gale Application");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the cursor type.
|
||||
* @param newCursor Selected cursor.
|
||||
@ -254,7 +268,11 @@ public class GaleApplication {
|
||||
public void setCursor(final Cursor newCursor) {
|
||||
Gale.getContext().setCursor(this.cursor);
|
||||
}
|
||||
|
||||
|
||||
void setForceRedraw() {
|
||||
this.needRedraw = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* set the Icon of the application.
|
||||
* @param iconFile File name icon (.bmp/.png).
|
||||
@ -263,7 +281,7 @@ public class GaleApplication {
|
||||
this.iconName = iconFile;
|
||||
Gale.getContext().setIcon(this.iconName);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set the screen orientation (if possible : only on iOs/Android)
|
||||
* @param orientation New orientation.
|
||||
@ -272,36 +290,39 @@ public class GaleApplication {
|
||||
this.orientation = orientation;
|
||||
Gale.getContext().forceOrientation(this.orientation);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the position of the window (if possible: Android and Ios does not support it)
|
||||
* @param size New position of the window.
|
||||
*/
|
||||
public void setPosition(final Vector2f size) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the size of the window (if possible: Android and Ios does not support it)
|
||||
* @param size New size of the window.
|
||||
* @return
|
||||
* @return
|
||||
*/
|
||||
public void setSize(final Vector2f size) {
|
||||
if (size.x() <= 0 || size.y() <= 0) {
|
||||
Log.error("Wrong windows size: " + size);
|
||||
LOGGER.error("Wrong windows size: " + size);
|
||||
}
|
||||
Vector2f oldSize = this.windowsSize;
|
||||
final Vector2f oldSize = this.windowsSize;
|
||||
this.windowsSize = size;
|
||||
final GaleContext context = Gale.getContext();
|
||||
if (context == null) {
|
||||
return;
|
||||
}
|
||||
if (!context.setSize(size)) {
|
||||
Log.error("Can not set the size required by the user.");
|
||||
context.setSize(size);
|
||||
/* ==> change API ==> need the GUI notify the Windows that the size has change ????
|
||||
if (!) {
|
||||
LOGGER.error("Can not set the size required by the user.");
|
||||
this.windowsSize = oldSize;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the title of the application
|
||||
* @param title New title to set at the application (if possible: Android and Ios does not support it)
|
||||
@ -313,5 +334,5 @@ public class GaleApplication {
|
||||
return;
|
||||
}
|
||||
context.setTitle(this.title);
|
||||
};
|
||||
}
|
||||
}
|
5
src/main/org/atriasoft/gale/TextureFilter.java
Normal file
5
src/main/org/atriasoft/gale/TextureFilter.java
Normal file
@ -0,0 +1,5 @@
|
||||
package org.atriasoft.gale;
|
||||
|
||||
public enum TextureFilter {
|
||||
LINEAR, NEAREST
|
||||
}
|
File diff suppressed because it is too large
Load Diff
35
src/main/org/atriasoft/gale/context/CommandLine.java
Normal file
35
src/main/org/atriasoft/gale/context/CommandLine.java
Normal file
@ -0,0 +1,35 @@
|
||||
package org.atriasoft.gale.context;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class CommandLine {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(CommandLine.class);
|
||||
private final List<String> listArgs = new ArrayList<>();
|
||||
|
||||
public void parse(final String[] args) {
|
||||
for (int iii = 1; iii < args.length; iii++) {
|
||||
LOGGER.info("commandLine : '" + args[iii] + "'");
|
||||
this.listArgs.add(args[iii]);
|
||||
}
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return this.listArgs.size();
|
||||
}
|
||||
|
||||
public String get(final int id) {
|
||||
return this.listArgs.get(id);
|
||||
}
|
||||
|
||||
public void add(final String newElement) {
|
||||
this.listArgs.add(newElement);
|
||||
}
|
||||
|
||||
public void remove(final int id) {
|
||||
this.listArgs.remove(id);
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
22
src/main/org/atriasoft/gale/context/GaleContextTest.java
Normal file
22
src/main/org/atriasoft/gale/context/GaleContextTest.java
Normal file
@ -0,0 +1,22 @@
|
||||
package org.atriasoft.gale.context;
|
||||
|
||||
import org.atriasoft.gale.GaleApplication;
|
||||
|
||||
class GaleApplicationTest extends GaleApplication {
|
||||
|
||||
}
|
||||
|
||||
public class GaleContextTest extends GaleContext {
|
||||
|
||||
public GaleContextTest() {
|
||||
super(new GaleApplicationTest(), new String[0]);
|
||||
setContext(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int run() {
|
||||
// TODO Auto-generated method stub
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
@ -1,12 +1,10 @@
|
||||
package org.atriasoft.gale.context.LWJG_AWT;
|
||||
|
||||
import static org.lwjgl.opengl.GL.createCapabilities;
|
||||
import static org.lwjgl.opengl.GL11.glClearColor;
|
||||
|
||||
import java.awt.AWTException;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Frame;
|
||||
import java.awt.Image;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
@ -25,8 +23,7 @@ import java.util.List;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import io.scenarium.logger.Logger;
|
||||
import javax.swing.WindowConstants;
|
||||
|
||||
import org.atriasoft.etk.Uri;
|
||||
import org.atriasoft.etk.math.Vector2f;
|
||||
@ -34,11 +31,11 @@ import org.atriasoft.gale.DisplayManagerDraw;
|
||||
import org.atriasoft.gale.Fps;
|
||||
import org.atriasoft.gale.GaleApplication;
|
||||
import org.atriasoft.gale.context.GaleContext;
|
||||
import org.atriasoft.gale.internal.Log;
|
||||
import org.atriasoft.gale.key.KeyKeyboard;
|
||||
import org.atriasoft.gale.key.KeySpecial;
|
||||
import org.atriasoft.gale.key.KeyStatus;
|
||||
import org.atriasoft.gale.key.KeyType;
|
||||
import org.lwjgl.opengl.GL;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.opengl.awt.AWTGLCanvas;
|
||||
//import org.lwjgl.Version;
|
||||
@ -47,8 +44,12 @@ import org.lwjgl.opengl.awt.AWTGLCanvas;
|
||||
//import org.lwjgl.opengl.GL;
|
||||
//import org.lwjgl.system.MemoryStack;
|
||||
import org.lwjgl.opengl.awt.GLData;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class ContextLWJGLAWT extends GaleContext implements MouseListener, MouseMotionListener, KeyListener, MouseWheelListener {
|
||||
public class ContextLWJGLAWT extends GaleContext
|
||||
implements MouseListener, MouseMotionListener, KeyListener, MouseWheelListener {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(ContextLWJGLAWT.class);
|
||||
private static final int WIDTH = 800;
|
||||
private static final int HEIGHT = 600;
|
||||
private static final int MAX_MANAGE_INPUT = 15;
|
||||
@ -57,36 +58,36 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
private static float delta;
|
||||
private static double whellOffsetY;
|
||||
private static double whellOffsetX;
|
||||
|
||||
|
||||
private static boolean rightButtonStateDown = false;
|
||||
private static boolean leftButtonStateDown = false;
|
||||
|
||||
|
||||
private static double lastMousePositionX = 0;
|
||||
|
||||
|
||||
private static double lastMousePositionY = 0;
|
||||
private static double currentMousePositionX = 0;
|
||||
private static double currentMousePositionY = 0;
|
||||
|
||||
|
||||
public static GaleContext create(final GaleApplication application, final String[] arg) {
|
||||
// TODO Auto-generated method stub
|
||||
return new ContextLWJGLAWT(application, arg);
|
||||
}
|
||||
|
||||
|
||||
private static long getCurrentTime() {
|
||||
return System.currentTimeMillis();
|
||||
}
|
||||
|
||||
|
||||
public static float getFrameTimeSecconds() {
|
||||
return delta;
|
||||
return ContextLWJGLAWT.delta;
|
||||
}
|
||||
|
||||
private final boolean[] inputIsPressed = new boolean[MAX_MANAGE_INPUT];
|
||||
|
||||
private final boolean[] inputIsPressed = new boolean[ContextLWJGLAWT.MAX_MANAGE_INPUT];
|
||||
private Vector2f decoratedWindowsSize = Vector2f.ZERO;
|
||||
private Vector2f cursorPos = Vector2f.ZERO;
|
||||
|
||||
|
||||
private final Vector2f cursorSize = Vector2f.ZERO;
|
||||
private final Fps fps = new Fps("Main Loop", true);
|
||||
|
||||
|
||||
private DisplayManagerDraw drawer = null;
|
||||
// The window handle
|
||||
private final long window = 0;
|
||||
@ -94,20 +95,22 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
// Generic UI properties
|
||||
private JFrame frame;
|
||||
private GLData glData;
|
||||
|
||||
|
||||
private AWTGLCanvas canvas;
|
||||
|
||||
|
||||
private Robot robot = null;
|
||||
|
||||
|
||||
private final List<Integer> pressedKey = new ArrayList<>();
|
||||
|
||||
private Boolean isInitialized = false;
|
||||
|
||||
public ContextLWJGLAWT(final GaleApplication application, final String[] args) {
|
||||
super(application, args);
|
||||
System.out.println("Hello JOGL !");
|
||||
initWindows();
|
||||
start2ndThreadProcessing();
|
||||
this.isInitialized = true;
|
||||
}
|
||||
|
||||
|
||||
private int getUniqueIndex(final KeyEvent e) {
|
||||
int internalKeyValue = e.getKeyCode();
|
||||
if (e.getKeyLocation() == KeyEvent.KEY_LOCATION_LEFT) {
|
||||
@ -121,9 +124,9 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
}
|
||||
return internalKeyValue;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void grabPointerEvents(final boolean status, final Vector2f forcedPosition) {
|
||||
protected void grabPointerEventsThreadGUI(final boolean status, final Vector2f forcedPosition) {
|
||||
if (status) {
|
||||
try {
|
||||
this.robot = new Robot();
|
||||
@ -137,17 +140,18 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
showCursor();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void hideCursor() {
|
||||
final int[] pixels = new int[16 * 16];
|
||||
final Image image = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(16, 16, pixels, 0, 16));
|
||||
final Cursor transparentCursor = Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "invisiblecursor");
|
||||
final Cursor transparentCursor = Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0),
|
||||
"invisiblecursor");
|
||||
this.frame.setCursor(transparentCursor);
|
||||
}
|
||||
|
||||
|
||||
private void initWindows() {
|
||||
this.frame = new JFrame("Gale base");
|
||||
this.frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
||||
this.frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
|
||||
this.frame.setLayout(new BorderLayout());
|
||||
this.frame.setPreferredSize(new Dimension(800, 600));
|
||||
this.glData = new GLData();
|
||||
@ -156,28 +160,45 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
this.frame.add(this.canvas = new AWTGLCanvas(this.glData) {
|
||||
@Override
|
||||
public void initGL() {
|
||||
System.out.println("OpenGL version: " + this.effective.majorVersion + "." + this.effective.minorVersion + " (Profile: " + this.effective.profile + ")");
|
||||
createCapabilities();
|
||||
glClearColor(0.3f, 0.4f, 0.5f, 1);
|
||||
System.out.println("OpenGL version: " + this.effective.majorVersion + "." + this.effective.minorVersion
|
||||
+ " (Profile: " + this.effective.profile + ")");
|
||||
GL.createCapabilities();
|
||||
GL11.glClearColor(0.3f, 0.4f, 0.5f, 1);
|
||||
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void paintGL() {
|
||||
//Log.warning("Draw ... ");
|
||||
final long startRender = System.currentTimeMillis();
|
||||
//LOGGER.warn("Draw ... ");
|
||||
final int w = getWidth();
|
||||
final int h = getHeight();
|
||||
if (ContextLWJGLAWT.this.decoratedWindowsSize.x() != w || ContextLWJGLAWT.this.decoratedWindowsSize.y() != h) {
|
||||
if (ContextLWJGLAWT.this.decoratedWindowsSize.x() != w
|
||||
|| ContextLWJGLAWT.this.decoratedWindowsSize.y() != h) {
|
||||
ContextLWJGLAWT.this.decoratedWindowsSize = new Vector2f(w, h);
|
||||
final Rectangle bounds = ContextLWJGLAWT.this.canvas.getBounds();
|
||||
Vector2f tmpWindowsSize = new Vector2f(bounds.width, bounds.height);
|
||||
final Vector2f tmpWindowsSize = new Vector2f(bounds.width, bounds.height);
|
||||
operatingSystemResize(tmpWindowsSize);
|
||||
}
|
||||
operatingSystemDraw(true);
|
||||
swapBuffers();
|
||||
/*
|
||||
if (Logger.isCriticalOccured()) {
|
||||
ContextLWJGLAWT.this.frame.dispose();
|
||||
}
|
||||
*/
|
||||
// Process event from the GUI (specific events...
|
||||
processEventsGui();
|
||||
/*
|
||||
final long stopRender = System.currentTimeMillis();
|
||||
try {
|
||||
// limit at 60FPS ==> bad to do it here, but it work for now... add a minimum of 10ms to free lock...
|
||||
Thread.sleep((int) FMath.max((3000.0f / 60.0f) - (stopRender - startRender), 10)); // This permit to limit the FPS (base 602FPS)
|
||||
} catch (final InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
*/
|
||||
}
|
||||
}, BorderLayout.CENTER);
|
||||
this.frame.pack();
|
||||
@ -189,21 +210,21 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
this.canvas.addKeyListener(this);
|
||||
this.canvas.addMouseWheelListener(this);
|
||||
this.frame.transferFocus();
|
||||
|
||||
lastFrameTime = getCurrentTime();
|
||||
|
||||
|
||||
ContextLWJGLAWT.lastFrameTime = ContextLWJGLAWT.getCurrentTime();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isGrabPointerEvents() {
|
||||
return this.robot != null;
|
||||
}
|
||||
|
||||
|
||||
public void keyEvent(final KeyEvent e, final boolean pressed, final boolean thisIsAReapeateKey) {
|
||||
//Log.info("event " + thisIsAReapeateKey + " " + e.getKeyCode() + " " + e);
|
||||
//LOGGER.info("event " + thisIsAReapeateKey + " " + e.getKeyCode() + " " + e);
|
||||
boolean find = true;
|
||||
KeyKeyboard keyInput = KeyKeyboard.UNKNOWN;
|
||||
//Log.error("keyboard input " + e.getWhen() + " " + e.getKeyCode() + " " + e.getKeyLocation());
|
||||
//LOGGER.error("keyboard input " + e.getWhen() + " " + e.getKeyCode() + " " + e.getKeyLocation());
|
||||
switch (e.getKeyCode()) {
|
||||
//case 328: // keypad
|
||||
case KeyEvent.VK_UP:
|
||||
@ -300,7 +321,8 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
keyInput = KeyKeyboard.SHIFT_LEFT;
|
||||
this.guiKeyBoardMode.setShiftLeft(pressed);
|
||||
break;
|
||||
} else if (e.getKeyLocation() == KeyEvent.KEY_LOCATION_RIGHT) {
|
||||
}
|
||||
if (e.getKeyLocation() == KeyEvent.KEY_LOCATION_RIGHT) {
|
||||
keyInput = KeyKeyboard.SHIFT_LEFT;
|
||||
this.guiKeyBoardMode.setShiftRight(pressed);
|
||||
break;
|
||||
@ -310,7 +332,8 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
keyInput = KeyKeyboard.CTRL_LEFT;
|
||||
this.guiKeyBoardMode.setCtrlLeft(pressed);
|
||||
break;
|
||||
} else if (e.getKeyLocation() == KeyEvent.KEY_LOCATION_RIGHT) {
|
||||
}
|
||||
if (e.getKeyLocation() == KeyEvent.KEY_LOCATION_RIGHT) {
|
||||
keyInput = KeyKeyboard.CTRL_RIGHT;
|
||||
this.guiKeyBoardMode.setCtrlRight(pressed);
|
||||
break;
|
||||
@ -320,7 +343,8 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
keyInput = KeyKeyboard.META_LEFT;
|
||||
this.guiKeyBoardMode.setMetaLeft(pressed);
|
||||
break;
|
||||
} else if (e.getKeyLocation() == KeyEvent.KEY_LOCATION_RIGHT) {
|
||||
}
|
||||
if (e.getKeyLocation() == KeyEvent.KEY_LOCATION_RIGHT) {
|
||||
keyInput = KeyKeyboard.META_RIGHT;
|
||||
this.guiKeyBoardMode.setMetaRight(pressed);
|
||||
break;
|
||||
@ -344,38 +368,48 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
find = false;
|
||||
if (this.guiKeyBoardMode.getNumLock()) {
|
||||
if (thisIsAReapeateKey) {
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER, (!pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, '.');
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER,
|
||||
(!pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, '.');
|
||||
}
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER, (pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, '.');
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER,
|
||||
(pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, '.');
|
||||
} else {
|
||||
if (thisIsAReapeateKey) {
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER, (!pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, (char) 0x7F);
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER,
|
||||
(!pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, (char) 0x7F);
|
||||
}
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER, (pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, (char) 0x7F);
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER,
|
||||
(pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, (char) 0x7F);
|
||||
}
|
||||
break;
|
||||
case KeyEvent.VK_TAB: // special case for TAB
|
||||
find = false;
|
||||
if (thisIsAReapeateKey) {
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER, (!pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, (char) 0x09);
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER,
|
||||
(!pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, (char) 0x09);
|
||||
}
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER, (pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, (char) 0x09);
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER,
|
||||
(pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, (char) 0x09);
|
||||
break;
|
||||
default:
|
||||
find = false;
|
||||
if (thisIsAReapeateKey) {
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER, (!pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, e.getKeyChar());
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER,
|
||||
(!pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, e.getKeyChar());
|
||||
}
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER, (pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, e.getKeyChar());
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, KeyKeyboard.CHARACTER,
|
||||
(pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey, e.getKeyChar());
|
||||
}
|
||||
if (find) {
|
||||
if (thisIsAReapeateKey) {
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, keyInput, (!pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey);
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, keyInput, (!pressed ? KeyStatus.down : KeyStatus.up),
|
||||
thisIsAReapeateKey);
|
||||
}
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, keyInput, (pressed ? KeyStatus.down : KeyStatus.up), thisIsAReapeateKey);
|
||||
operatingSystemsetKeyboard(this.guiKeyBoardMode, keyInput, (pressed ? KeyStatus.down : KeyStatus.up),
|
||||
thisIsAReapeateKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void keyPressed(final KeyEvent e) {
|
||||
final int internalKeyValue = getUniqueIndex(e);
|
||||
@ -385,7 +419,7 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
}
|
||||
keyEvent(e, true, index != -1);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void keyReleased(final KeyEvent e) {
|
||||
final int internalKeyValue = getUniqueIndex(e);
|
||||
@ -395,69 +429,69 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
}
|
||||
keyEvent(e, false, false);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void keyTyped(final KeyEvent e) {
|
||||
// not needed with my model ...
|
||||
//Log.info(" typed " + e.getKeyChar() + " " + e);
|
||||
//LOGGER.info(" typed " + e.getKeyChar() + " " + e);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
// System.out.println(e.getX());
|
||||
// System.out.println(e.getY());
|
||||
Log.info("Mouse clicked:" + e.getX() + " " + e.getY());
|
||||
LOGGER.info("Mouse clicked:" + e.getX() + " " + e.getY());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseDragged(final MouseEvent e) {
|
||||
//Log.error("mouse drag ... " + e);
|
||||
//LOGGER.error("mouse drag ... " + e);
|
||||
mouseMoved(e);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseEntered(final MouseEvent e) {
|
||||
// TODO Auto-generated method stub
|
||||
//Log.info("Mouse entered:" + e.getX() + " " + e.getY());
|
||||
this.cursorPos = new Vector2f(e.getX(), e.getY());
|
||||
//LOGGER.info("Mouse entered:" + e.getX() + " " + e.getY());
|
||||
this.cursorPos = new Vector2f(e.getX(), this.decoratedWindowsSize.y() - e.getY());
|
||||
operatingSystemSetInput(this.guiKeyBoardMode, KeyType.mouse, KeyStatus.enter, 0, this.cursorPos);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseExited(final MouseEvent e) {
|
||||
// TODO Auto-generated method stub
|
||||
//Log.info("Mouse exited:" + e.getX() + " " + e.getY());
|
||||
this.cursorPos = new Vector2f(e.getX(), e.getY());
|
||||
//LOGGER.info("Mouse exited:" + e.getX() + " " + e.getY());
|
||||
this.cursorPos = new Vector2f(e.getX(), this.decoratedWindowsSize.y() - e.getY());
|
||||
operatingSystemSetInput(this.guiKeyBoardMode, KeyType.mouse, KeyStatus.leave, 0, this.cursorPos);
|
||||
//this.frame.mouseMove(e, 200, 200);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseMoved(final MouseEvent e) {
|
||||
//Log.info("Mouse moved:" + e.getX() + " " + e.getY() + " " + e);
|
||||
LOGGER.trace("Mouse moved:" + e.getX() + " " + e.getY() + " " + e);
|
||||
if (this.robot != null) {
|
||||
final Rectangle bounds = this.frame.getBounds();
|
||||
//Log.error(" " + bounds + " windows=" + windowsSize + " deco= " + decoratedWindowsSize);
|
||||
//LOGGER.error(" " + bounds + " windows=" + windowsSize + " deco= " + decoratedWindowsSize);
|
||||
final float refPosX = bounds.x + bounds.width / 2.0f;
|
||||
final float refPosY = bounds.y + bounds.height / 2.0f;
|
||||
if (e.getXOnScreen() == (int) refPosX && e.getYOnScreen() == (int) refPosY) {
|
||||
this.cursorPos = Vector2f.ZERO;
|
||||
return;
|
||||
} else {
|
||||
//Log.error(" " + bounds + " windows=" + windowsSize + " deco= " + decoratedWindowsSize);
|
||||
this.cursorPos = new Vector2f(-(e.getXOnScreen() - refPosX), e.getYOnScreen() - refPosY);
|
||||
this.robot.mouseMove((int) refPosX, (int) refPosY);
|
||||
}
|
||||
Log.info("delta moved:" + this.cursorPos);
|
||||
//LOGGER.error(" " + bounds + " windows=" + windowsSize + " deco= " + decoratedWindowsSize);
|
||||
this.cursorPos = new Vector2f(-(e.getXOnScreen() - refPosX), (e.getYOnScreen() - refPosY));
|
||||
//this.cursorPos = new Vector2f(-(e.getXOnScreen() - refPosX), refPosY);
|
||||
this.robot.mouseMove((int) refPosX, (int) refPosY);
|
||||
LOGGER.info("delta moved:" + this.cursorPos);
|
||||
} else {
|
||||
// TODO use real size ... !!!!
|
||||
this.cursorPos = new Vector2f(e.getX(), this.cursorSize.y() - e.getY());
|
||||
this.cursorPos = new Vector2f(e.getX(), this.decoratedWindowsSize.y() + (this.cursorSize.y() - e.getY()));
|
||||
}
|
||||
// For compatibility of the Android system :
|
||||
// For compatibility of the Android system :
|
||||
boolean findOne = false;
|
||||
for (int iii = 0; iii < MAX_MANAGE_INPUT; iii++) {
|
||||
for (int iii = 0; iii < ContextLWJGLAWT.MAX_MANAGE_INPUT; iii++) {
|
||||
if (this.inputIsPressed[iii]) {
|
||||
//Log.debug("X11 event: bt=" << iii << " " << event.type << " = \"MotionNotify\" (" << m_cursorEventX << "," << m_cursorEventY << ")");
|
||||
//LOGGER.debug("X11 event: bt=" << iii << " " << event.type << " = \"MotionNotify\" (" << m_cursorEventX << "," << m_cursorEventY << ")");
|
||||
operatingSystemSetInput(this.guiKeyBoardMode, KeyType.mouse, KeyStatus.move, iii, this.cursorPos);
|
||||
findOne = true;
|
||||
}
|
||||
@ -467,34 +501,34 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
operatingSystemSetInput(this.guiKeyBoardMode, KeyType.mouse, KeyStatus.move, 0, this.cursorPos);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mousePressed(final MouseEvent e) {
|
||||
Log.info("Mouse pressed:" + e.getX() + " " + e.getY());
|
||||
LOGGER.info("Mouse pressed:" + e.getX() + " " + e.getY());
|
||||
final int button = e.getButton();
|
||||
this.cursorPos = new Vector2f(e.getX(), e.getY());
|
||||
if (button < MAX_MANAGE_INPUT) {
|
||||
this.cursorPos = new Vector2f(e.getX(), this.decoratedWindowsSize.y() - e.getY());
|
||||
if (button < ContextLWJGLAWT.MAX_MANAGE_INPUT) {
|
||||
this.inputIsPressed[button] = true;
|
||||
}
|
||||
operatingSystemSetInput(this.guiKeyBoardMode, KeyType.mouse, KeyStatus.down, button, this.cursorPos);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseReleased(final MouseEvent e) {
|
||||
//Log.info("Mouse release:" + e.getX() + " " + e.getY());
|
||||
// Log.info("mouse value: GLFW_RELEASE" + action + " bt=" + button);
|
||||
//LOGGER.info("Mouse release:" + e.getX() + " " + e.getY());
|
||||
// LOGGER.info("mouse value: GLFW_RELEASE" + action + " bt=" + button);
|
||||
final int button = e.getButton();
|
||||
this.cursorPos = new Vector2f(e.getX(), e.getY());
|
||||
if (button < MAX_MANAGE_INPUT) {
|
||||
this.cursorPos = new Vector2f(e.getX(), this.decoratedWindowsSize.y() - e.getY());
|
||||
if (button < ContextLWJGLAWT.MAX_MANAGE_INPUT) {
|
||||
this.inputIsPressed[button] = false;
|
||||
}
|
||||
operatingSystemSetInput(this.guiKeyBoardMode, KeyType.mouse, KeyStatus.up, button, this.cursorPos);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseWheelMoved(final MouseWheelEvent e) {
|
||||
//Log.info("wheel_event : " + e);
|
||||
this.cursorPos = new Vector2f(e.getX(), e.getY());
|
||||
//LOGGER.info("wheel_event : " + e);
|
||||
this.cursorPos = new Vector2f(e.getX(), this.decoratedWindowsSize.y() - e.getY());
|
||||
if (e.getWheelRotation() < 0) {
|
||||
this.inputIsPressed[5] = true;
|
||||
operatingSystemSetInput(this.guiKeyBoardMode, KeyType.mouse, KeyStatus.down, 5, this.cursorPos);
|
||||
@ -507,7 +541,7 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
operatingSystemSetInput(this.guiKeyBoardMode, KeyType.mouse, KeyStatus.up, 4, this.cursorPos);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int run() {
|
||||
final Runnable renderLoop = new Runnable() {
|
||||
@ -518,14 +552,16 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
System.exit(0);
|
||||
return;
|
||||
}
|
||||
ContextLWJGLAWT.this.canvas.render();
|
||||
if (ContextLWJGLAWT.this.isInitialized) {
|
||||
ContextLWJGLAWT.this.canvas.render();
|
||||
}
|
||||
// fps.toc();
|
||||
// fps.draw();
|
||||
SwingUtilities.invokeLater(this);
|
||||
}
|
||||
};
|
||||
SwingUtilities.invokeLater(renderLoop);
|
||||
|
||||
|
||||
// while (canvas != null && canvas.isValid()) {
|
||||
// canvas.render();
|
||||
// try {
|
||||
@ -535,7 +571,7 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
// Run the rendering loop until the user has attempted to close
|
||||
// the window or has pressed the ESCAPE key.
|
||||
// while ( !glfwWindowShouldClose(window) ) {
|
||||
@ -560,7 +596,7 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
// fps.toc();
|
||||
// fps.draw();
|
||||
// */
|
||||
//
|
||||
//
|
||||
// glfwSwapBuffers(window); // swap the color buffers
|
||||
// glfwPollEvents();
|
||||
// /*
|
||||
@ -577,40 +613,40 @@ public class ContextLWJGLAWT extends GaleContext implements MouseListener, Mouse
|
||||
//System.exit(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
public void setDrawer(final DisplayManagerDraw drawer) {
|
||||
this.drawer = drawer;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setFullScreen(final boolean status) {
|
||||
public void setFullScreenThreadGUI(final boolean status) {
|
||||
super.setFullScreen(status);
|
||||
if (status) {
|
||||
this.frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
|
||||
this.frame.setExtendedState(Frame.MAXIMIZED_BOTH);
|
||||
this.frame.setUndecorated(true);
|
||||
} else {
|
||||
this.frame.setExtendedState(JFrame.NORMAL);
|
||||
this.frame.setExtendedState(Frame.NORMAL);
|
||||
this.frame.setUndecorated(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setIcon(final Uri inputFile) {
|
||||
|
||||
};
|
||||
|
||||
public void setIconThreadGUI(final Uri inputFile) {
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************************/
|
||||
@Override
|
||||
public void setTitle(final String title) {
|
||||
public void setTitleThreadGUI(final String title) {
|
||||
this.frame.setTitle(title);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
private void showCursor() {
|
||||
this.frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
};
|
||||
|
||||
public void unInit() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void unInit() {
|
||||
|
||||
}
|
||||
|
||||
}
|
68
src/main/org/atriasoft/gale/context/MessageSystem.java
Normal file
68
src/main/org/atriasoft/gale/context/MessageSystem.java
Normal file
@ -0,0 +1,68 @@
|
||||
package org.atriasoft.gale.context;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Vector;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class MessageSystem {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(MessageSystem.class);
|
||||
private final Vector<ActionToDoInAsyncLoop> data = new Vector<>();
|
||||
private final Map<String, ActionToDoInAsyncLoop> dataSingle = new HashMap<>();
|
||||
|
||||
public synchronized void addElement(final ActionToDoInAsyncLoop data2) {
|
||||
this.data.addElement(data2);
|
||||
notifyAll();
|
||||
}
|
||||
|
||||
public synchronized void addElement(final String uniqueID, final ActionToDoInAsyncLoop data2) {
|
||||
this.dataSingle.put(uniqueID, data2);
|
||||
notifyAll();
|
||||
}
|
||||
|
||||
protected synchronized ActionToDoInAsyncLoop getElementSingle() {
|
||||
//LOGGER.warn("+++++++++++++++++++++++++++++++++ getElement()");
|
||||
final Map.Entry<String, ActionToDoInAsyncLoop> entry = this.dataSingle.entrySet().iterator().next();
|
||||
final String key = entry.getKey();
|
||||
final ActionToDoInAsyncLoop message = entry.getValue();
|
||||
this.dataSingle.remove(key);
|
||||
//LOGGER.warn("+++++++++++++++++++++++++++++++++ getElement() ===> done " + message);
|
||||
return message;
|
||||
}
|
||||
|
||||
protected synchronized ActionToDoInAsyncLoop getElementVector() {
|
||||
//LOGGER.warn("+++++++++++++++++++++++++++++++++ getElement()");
|
||||
final ActionToDoInAsyncLoop message = this.data.firstElement();
|
||||
this.data.removeElement(message);
|
||||
//LOGGER.warn("+++++++++++++++++++++++++++++++++ getElement() ===> done " + message);
|
||||
return message;
|
||||
}
|
||||
|
||||
public synchronized ActionToDoInAsyncLoop getElementWait() {
|
||||
if (this.data.isEmpty() && this.dataSingle.isEmpty()) {
|
||||
try {
|
||||
wait();
|
||||
} catch (final InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
if (!this.data.isEmpty()) {
|
||||
return getElementVector();
|
||||
}
|
||||
if (!this.dataSingle.isEmpty()) {
|
||||
return getElementSingle();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public synchronized int getSize() {
|
||||
LOGGER.trace("------------------------------------------------------------");
|
||||
LOGGER.trace("-- nb message: {} + {}", this.data.size(), this.dataSingle.size());
|
||||
LOGGER.trace("------------------------------------------------------------");
|
||||
return this.data.size() + this.dataSingle.size();
|
||||
}
|
||||
}
|
53
src/main/org/atriasoft/gale/context/PeriodicThread.java
Normal file
53
src/main/org/atriasoft/gale/context/PeriodicThread.java
Normal file
@ -0,0 +1,53 @@
|
||||
package org.atriasoft.gale.context;
|
||||
|
||||
import java.time.Clock;
|
||||
|
||||
import org.atriasoft.etk.ThreadAbstract;
|
||||
import org.atriasoft.gale.GaleApplication;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class PeriodicThread extends ThreadAbstract {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(PeriodicThread.class);
|
||||
private final GaleContext context;
|
||||
|
||||
public PeriodicThread(final GaleContext context) {
|
||||
super("GaleAsync");
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void birth() {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void death() {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void runPeriodic() {
|
||||
LOGGER.trace("----------------------------- [START] -----------------------------------");
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (final InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
// Keep global clock to process events
|
||||
final Clock clock = Clock.systemUTC();
|
||||
final long time = System.nanoTime();
|
||||
|
||||
///synchronized (this.context) {
|
||||
this.context.processEventsAsync(clock, time);
|
||||
// call all the application for periodic request (the application manage multiple instance )...
|
||||
final GaleApplication appl = this.context.getApplication();
|
||||
//LOGGER.trace("Call application : " + appl);
|
||||
if (appl != null) {
|
||||
appl.onPeriod(clock, time);
|
||||
}
|
||||
LOGGER.trace("----------------------------- [ END ] -----------------------------------");
|
||||
}
|
||||
}
|
@ -2,25 +2,27 @@ package org.atriasoft.gale.resource;
|
||||
|
||||
import org.atriasoft.etk.Uri;
|
||||
import org.atriasoft.gale.context.GaleContext;
|
||||
import org.atriasoft.gale.internal.Log;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public abstract class Resource {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(Resource.class);
|
||||
protected static final String NO_NAME_RESOURCE = "---";
|
||||
protected static final int MAXRESOURCELEVEL = 5;
|
||||
private static int idGenerated = 10;
|
||||
|
||||
|
||||
/**
|
||||
* Get the current resource Manager
|
||||
*/
|
||||
protected static ResourceManager getManager() {
|
||||
return GaleContext.getContext().getResourcesManager();
|
||||
}
|
||||
|
||||
|
||||
protected long uid = -1; //!< unique ID definition
|
||||
protected int count = 1;
|
||||
protected int resourceLevel = MAXRESOURCELEVEL - 1; //!< Level of the resource ==> for update priority [0..5] 0 must be update first.
|
||||
protected String name = NO_NAME_RESOURCE; //!< name of the resource ...
|
||||
|
||||
|
||||
/**
|
||||
* generic protected contructor (use factory to create this class)
|
||||
*/
|
||||
@ -28,27 +30,35 @@ public abstract class Resource {
|
||||
this.uid = idGenerated++;
|
||||
getManager().localAdd(this);
|
||||
}
|
||||
|
||||
|
||||
protected Resource(final String name) {
|
||||
this.name = name;
|
||||
if (name == null) {
|
||||
this.name = "---";
|
||||
} else {
|
||||
this.name = name;
|
||||
}
|
||||
getManager().localAdd(this);
|
||||
}
|
||||
|
||||
|
||||
protected Resource(final Uri uri) {
|
||||
this.name = uri.toString();
|
||||
if (uri == null) {
|
||||
this.name = "---";
|
||||
} else {
|
||||
this.name = uri.toString();
|
||||
}
|
||||
getManager().localAdd(this);
|
||||
}
|
||||
|
||||
|
||||
public abstract void cleanUp();
|
||||
|
||||
|
||||
public int getCount() {
|
||||
return this.count;
|
||||
}
|
||||
|
||||
|
||||
public long getId() {
|
||||
return this.uid;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the resource name
|
||||
* @return The requested name
|
||||
@ -56,7 +66,7 @@ public abstract class Resource {
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the current resource level;
|
||||
* @return value in [0..5]
|
||||
@ -64,40 +74,40 @@ public abstract class Resource {
|
||||
public int getResourceLevel() {
|
||||
return this.resourceLevel;
|
||||
}
|
||||
|
||||
|
||||
public void keep() {
|
||||
this.count++;
|
||||
}
|
||||
|
||||
|
||||
public void release() {
|
||||
this.count--;
|
||||
if (this.count == 0) {
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* User request the reload of all resources (usefull when the file depend on DATA:GUI:xxx ...
|
||||
*/
|
||||
public void reload() {
|
||||
Log.debug("Not set for : [" + getId() + "]" + getName() + " loaded ??? time(s)");
|
||||
};
|
||||
|
||||
LOGGER.debug("Not set for : [" + getId() + "]" + getName() + " loaded ??? time(s)");
|
||||
}
|
||||
|
||||
/**
|
||||
* The current OpenGl context is removing ==> remove yout own system data
|
||||
*/
|
||||
public void removeContext() {
|
||||
Log.debug("Not set for : [" + getId() + "]" + getName() + " loaded ??? time(s)");
|
||||
LOGGER.debug("Not set for : [" + getId() + "]" + getName() + " loaded ??? time(s)");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The notification of the Context removing is too late, we have no more acces on the OpenGl context (thank you Android).
|
||||
* Just update your internal state
|
||||
*/
|
||||
public void removeContextToLate() {
|
||||
Log.debug("Not set for : [" + getId() + "]" + getName() + " loaded ??? time(s)");
|
||||
LOGGER.debug("Not set for : [" + getId() + "]" + getName() + " loaded ??? time(s)");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the resource name
|
||||
* @param name The name to set.
|
||||
@ -105,7 +115,7 @@ public abstract class Resource {
|
||||
public void setName(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Call when need to send data on the harware (openGL)
|
||||
* @note This is done asynchronously with the create of the Resource.
|
||||
@ -113,7 +123,7 @@ public abstract class Resource {
|
||||
* @return false The context is not updated
|
||||
*/
|
||||
public boolean updateContext() {
|
||||
Log.debug("Not set for : [" + getId() + "]" + getName() + " loaded ??? time(s)");
|
||||
LOGGER.debug("Not set for : [" + getId() + "]" + getName() + " loaded ??? time(s)");
|
||||
return true;
|
||||
}
|
||||
}
|
@ -9,28 +9,31 @@ import org.atriasoft.etk.Uri;
|
||||
import org.atriasoft.etk.math.Matrix4f;
|
||||
import org.atriasoft.etk.math.Vector3f;
|
||||
import org.atriasoft.gale.backend3d.OpenGL;
|
||||
import org.atriasoft.gale.internal.Log;
|
||||
import org.lwjgl.BufferUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class ResourceColored3DObject extends Resource {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(ResourceColored3DObject.class);
|
||||
|
||||
public static ResourceColored3DObject create() {
|
||||
final ResourceColored3DObject resource = new ResourceColored3DObject();
|
||||
getManager().localAdd(resource);
|
||||
return resource;
|
||||
}
|
||||
|
||||
|
||||
private final ResourceProgram program;
|
||||
private int oGLPosition;
|
||||
private int oGLColor;
|
||||
private int oGLMatrixTransformation;
|
||||
private int oGLMatrixProjection;
|
||||
private int oGLMatrixView;
|
||||
|
||||
|
||||
protected ResourceColored3DObject() {
|
||||
super();
|
||||
// get the shader resource :
|
||||
this.oGLPosition = 0;
|
||||
this.program = ResourceProgram.create(new Uri("DATA", "simple3D.vert", "gale"), new Uri("DATA", "simple3D.frag", "gale"));
|
||||
this.program = ResourceProgram.create(new Uri("DATA", "simple3D.vert", "gale"),
|
||||
new Uri("DATA", "simple3D.frag", "gale"));
|
||||
if (this.program != null) {
|
||||
this.oGLMatrixTransformation = this.program.getUniform("in_matrixTransformation");
|
||||
this.oGLMatrixProjection = this.program.getUniform("in_matrixProjection");
|
||||
@ -39,13 +42,13 @@ public class ResourceColored3DObject extends Resource {
|
||||
this.oGLColor = this.program.getUniform("in_colors");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void cleanUp() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private float[] convertInFloat(final List<Vector3f> data) {
|
||||
final float[] out = new float[data.size() * 3];
|
||||
for (int iii = 0; iii < data.size(); iii++) {
|
||||
@ -55,13 +58,17 @@ public class ResourceColored3DObject extends Resource {
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
public void draw(final List<Vector3f> vertices, final Color color, final boolean updateDepthBuffer, final boolean depthtest) {
|
||||
|
||||
public void draw(
|
||||
final List<Vector3f> vertices,
|
||||
final Color color,
|
||||
final boolean updateDepthBuffer,
|
||||
final boolean depthtest) {
|
||||
if (vertices.size() <= 0) {
|
||||
return;
|
||||
}
|
||||
if (this.program == null) {
|
||||
Log.error("No shader ...");
|
||||
LOGGER.error("No shader ...");
|
||||
return;
|
||||
}
|
||||
if (depthtest) {
|
||||
@ -70,7 +77,7 @@ public class ResourceColored3DObject extends Resource {
|
||||
OpenGL.setDeathMask(false);
|
||||
}
|
||||
}
|
||||
//Log.debug(" display " << this.coord.size() << " elements" );
|
||||
//LOGGER.debug(" display " << this.coord.size() << " elements" );
|
||||
this.program.use();
|
||||
final Matrix4f projectionMatrix = OpenGL.getMatrix();
|
||||
final Matrix4f viewMatrix = OpenGL.getCameraMatrix();
|
||||
@ -86,13 +93,13 @@ public class ResourceColored3DObject extends Resource {
|
||||
if (color.a() < 1.0f) {
|
||||
OpenGL.enable(OpenGL.Flag.flag_blend);
|
||||
}
|
||||
// Request the draw of the elements:
|
||||
OpenGL.drawArrays(OpenGL.RenderMode.triangle, 0, vertices.size());
|
||||
// Request the draw of the elements:
|
||||
OpenGL.drawArrays(OpenGL.RenderMode.TRIANGLE, 0, vertices.size());
|
||||
if (color.a() < 1.0f) {
|
||||
OpenGL.disable(OpenGL.Flag.flag_blend);
|
||||
}
|
||||
this.program.unUse();
|
||||
// Request the draw od the elements:
|
||||
// Request the draw od the elements:
|
||||
//glDrawArrays(oGLLINES, 0, vertices.size());
|
||||
//this.oGLprogram.UnUse();
|
||||
if (depthtest) {
|
||||
@ -102,13 +109,18 @@ public class ResourceColored3DObject extends Resource {
|
||||
OpenGL.disable(OpenGL.Flag.flag_depthTest);
|
||||
}
|
||||
}
|
||||
|
||||
public void draw(final List<Vector3f> vertices, final Color color, final Matrix4f transformationMatrix, final boolean updateDepthBuffer, final boolean depthtest) {
|
||||
|
||||
public void draw(
|
||||
final List<Vector3f> vertices,
|
||||
final Color color,
|
||||
final Matrix4f transformationMatrix,
|
||||
final boolean updateDepthBuffer,
|
||||
final boolean depthtest) {
|
||||
if (vertices.size() <= 0) {
|
||||
return;
|
||||
}
|
||||
if (this.program == null) {
|
||||
Log.error("No shader ...");
|
||||
LOGGER.error("No shader ...");
|
||||
return;
|
||||
}
|
||||
if (depthtest) {
|
||||
@ -117,7 +129,7 @@ public class ResourceColored3DObject extends Resource {
|
||||
OpenGL.setDeathMask(false);
|
||||
}
|
||||
}
|
||||
//Log.debug(" display " << this.coord.size() << " elements" );
|
||||
//LOGGER.debug(" display " << this.coord.size() << " elements" );
|
||||
this.program.use();
|
||||
// set Matrix: translation/positionMatrix
|
||||
final Matrix4f projectionMatrix = OpenGL.getMatrix();
|
||||
@ -129,13 +141,13 @@ public class ResourceColored3DObject extends Resource {
|
||||
final FloatBuffer buffer = storeDataInFloatBuffer(convertInFloat(vertices));
|
||||
this.program.sendAttribute(this.oGLPosition, 3, buffer, 3);
|
||||
// color :
|
||||
//Log.info("color= " + color + " " + this.oGLPosition);
|
||||
//LOGGER.info("color= " + color + " " + this.oGLPosition);
|
||||
this.program.uniformColor(this.oGLColor, color);
|
||||
if (color.a() < 1.0f) {
|
||||
OpenGL.enable(OpenGL.Flag.flag_blend);
|
||||
}
|
||||
// Request the draw of the elements:
|
||||
OpenGL.drawArrays(OpenGL.RenderMode.triangle, 0, vertices.size());
|
||||
// Request the draw of the elements:
|
||||
OpenGL.drawArrays(OpenGL.RenderMode.TRIANGLE, 0, vertices.size());
|
||||
if (color.a() < 1.0f) {
|
||||
OpenGL.disable(OpenGL.Flag.flag_blend);
|
||||
}
|
||||
@ -147,29 +159,35 @@ public class ResourceColored3DObject extends Resource {
|
||||
OpenGL.disable(OpenGL.Flag.flag_depthTest);
|
||||
}
|
||||
}
|
||||
|
||||
public void drawCapsule(final float radius, final float size, int lats, final int longs, final Matrix4f transformationMatrix, final Color tmpColor) {
|
||||
|
||||
public void drawCapsule(
|
||||
final float radius,
|
||||
final float size,
|
||||
int lats,
|
||||
final int longs,
|
||||
final Matrix4f transformationMatrix,
|
||||
final Color tmpColor) {
|
||||
final List<Vector3f> tmpVertices = new ArrayList<>();
|
||||
lats = lats / 2 * 2;
|
||||
|
||||
|
||||
// center to border (TOP)
|
||||
float offset = size * 0.5f;
|
||||
for (int iii = lats / 2 + 1; iii <= lats; ++iii) {
|
||||
final float lat0 = (float) Math.PI * (-0.5f + (float) (iii - 1) / lats);
|
||||
final float z0 = radius * (float) Math.sin(lat0);
|
||||
final float zr0 = radius * (float) Math.cos(lat0);
|
||||
|
||||
|
||||
final float lat1 = (float) Math.PI * (-0.5f + (float) (iii) / lats);
|
||||
final float z1 = radius * (float) Math.sin(lat1);
|
||||
final float zr1 = radius * (float) Math.cos(lat1);
|
||||
|
||||
|
||||
for (int jjj = 0; jjj < longs; ++jjj) {
|
||||
float lng = 2.0f * (float) Math.PI * (jjj - 1) / longs;
|
||||
float x = (float) Math.cos(lng);
|
||||
float y = (float) Math.sin(lng);
|
||||
final Vector3f v1 = new Vector3f(x * zr1, y * zr1, z1 + offset);
|
||||
final Vector3f v4 = new Vector3f(x * zr0, y * zr0, z0 + offset);
|
||||
|
||||
|
||||
lng = 2 * (float) Math.PI * (jjj) / longs;
|
||||
x = (float) Math.cos(lng);
|
||||
y = (float) Math.sin(lng);
|
||||
@ -178,7 +196,7 @@ public class ResourceColored3DObject extends Resource {
|
||||
tmpVertices.add(v1);
|
||||
tmpVertices.add(v2);
|
||||
tmpVertices.add(v3);
|
||||
|
||||
|
||||
tmpVertices.add(v1);
|
||||
tmpVertices.add(v3);
|
||||
tmpVertices.add(v4);
|
||||
@ -187,24 +205,24 @@ public class ResourceColored3DObject extends Resource {
|
||||
// Cylinder
|
||||
for (int jjj = 0; jjj < longs; ++jjj) {
|
||||
float lng = 2.0f * (float) Math.PI * (jjj - 1) / longs;
|
||||
|
||||
|
||||
final float z = size * 0.5f;
|
||||
|
||||
|
||||
float x = (float) Math.cos(lng) * radius;
|
||||
float y = (float) Math.sin(lng) * radius;
|
||||
final Vector3f v2 = new Vector3f(x, y, z);
|
||||
final Vector3f v2b = new Vector3f(x, y, -z);
|
||||
|
||||
|
||||
lng = 2.0f * (float) Math.PI * (jjj) / longs;
|
||||
x = (float) Math.cos(lng) * radius;
|
||||
y = (float) Math.sin(lng) * radius;
|
||||
final Vector3f v3 = new Vector3f(x, y, z);
|
||||
final Vector3f v3b = new Vector3f(x, y, -z);
|
||||
|
||||
|
||||
tmpVertices.add(v2);
|
||||
tmpVertices.add(v3);
|
||||
tmpVertices.add(v3b);
|
||||
|
||||
|
||||
tmpVertices.add(v2);
|
||||
tmpVertices.add(v3b);
|
||||
tmpVertices.add(v2b);
|
||||
@ -215,18 +233,18 @@ public class ResourceColored3DObject extends Resource {
|
||||
final float lat0 = (float) Math.PI * (-0.5f + (float) (iii - 1) / lats);
|
||||
final float z0 = radius * (float) Math.sin(lat0);
|
||||
final float zr0 = radius * (float) Math.cos(lat0);
|
||||
|
||||
|
||||
final float lat1 = (float) Math.PI * (-0.5f + (float) (iii) / lats);
|
||||
final float z1 = radius * (float) Math.sin(lat1);
|
||||
final float zr1 = radius * (float) Math.cos(lat1);
|
||||
|
||||
|
||||
for (int jjj = 0; jjj < longs; ++jjj) {
|
||||
float lng = 2.0f * (float) Math.PI * (jjj - 1) / longs;
|
||||
float x = (float) Math.cos(lng);
|
||||
float y = (float) Math.sin(lng);
|
||||
final Vector3f v1 = new Vector3f(x * zr1, y * zr1, z1 + offset);
|
||||
final Vector3f v4 = new Vector3f(x * zr0, y * zr0, z0 + offset);
|
||||
|
||||
|
||||
lng = 2 * (float) Math.PI * (jjj) / longs;
|
||||
x = (float) Math.cos(lng);
|
||||
y = (float) Math.sin(lng);
|
||||
@ -235,7 +253,7 @@ public class ResourceColored3DObject extends Resource {
|
||||
tmpVertices.add(v1);
|
||||
tmpVertices.add(v2);
|
||||
tmpVertices.add(v3);
|
||||
|
||||
|
||||
tmpVertices.add(v1);
|
||||
tmpVertices.add(v3);
|
||||
tmpVertices.add(v4);
|
||||
@ -243,18 +261,24 @@ public class ResourceColored3DObject extends Resource {
|
||||
}
|
||||
draw(tmpVertices, tmpColor, transformationMatrix, true, true);
|
||||
}
|
||||
|
||||
public void drawCone(final float radius, final float size, final int lats, final int longs, final Matrix4f transformationMatrix, final Color tmpColor) {
|
||||
|
||||
public void drawCone(
|
||||
final float radius,
|
||||
final float size,
|
||||
final int lats,
|
||||
final int longs,
|
||||
final Matrix4f transformationMatrix,
|
||||
final Color tmpColor) {
|
||||
final List<Vector3f> tmpVertices = new ArrayList<>();
|
||||
// center to border (TOP)
|
||||
for (int jjj = 0; jjj < longs; ++jjj) {
|
||||
float lng = 2.0f * (float) Math.PI * (jjj - 1) / longs;
|
||||
final Vector3f v1 = new Vector3f(0.0f, 0.0f, -size / 2);
|
||||
|
||||
|
||||
float x = (float) Math.cos(lng) * radius;
|
||||
float y = (float) Math.sin(lng) * radius;
|
||||
final Vector3f v2 = new Vector3f(x, y, size / 2);
|
||||
|
||||
|
||||
lng = 2.0f * (float) Math.PI * (jjj) / longs;
|
||||
x = (float) Math.cos(lng) * radius;
|
||||
y = (float) Math.sin(lng) * radius;
|
||||
@ -266,13 +290,13 @@ public class ResourceColored3DObject extends Resource {
|
||||
// center to border (BUTTOM)
|
||||
for (int jjj = 0; jjj < longs; ++jjj) {
|
||||
float lng = 2.0f * (float) Math.PI * (jjj - 1) / longs;
|
||||
|
||||
|
||||
final Vector3f v1 = new Vector3f(0.0f, 0.0f, size / 2);
|
||||
|
||||
|
||||
float x = (float) Math.cos(lng) * radius;
|
||||
float y = (float) Math.sin(lng) * radius;
|
||||
final Vector3f v2 = new Vector3f(x, y, size / 2);
|
||||
|
||||
|
||||
lng = 2.0f * (float) Math.PI * (jjj) / longs;
|
||||
x = (float) Math.cos(lng) * radius;
|
||||
y = (float) Math.sin(lng) * radius;
|
||||
@ -283,62 +307,86 @@ public class ResourceColored3DObject extends Resource {
|
||||
}
|
||||
draw(tmpVertices, tmpColor, transformationMatrix, true, true);
|
||||
}
|
||||
|
||||
public void drawCubeLine(final Vector3f min, final Vector3f max, final Color color, final Matrix4f transformationMatrix, final boolean updateDepthBuffer, final boolean depthtest) {
|
||||
|
||||
public void drawCubeLine(
|
||||
final Vector3f min,
|
||||
final Vector3f max,
|
||||
final Color color,
|
||||
final Matrix4f transformationMatrix,
|
||||
final boolean updateDepthBuffer,
|
||||
final boolean depthtest) {
|
||||
final List<Vector3f> vertices = new ArrayList<>();
|
||||
vertices.add(new Vector3f(min.x(), min.y(), min.z()));
|
||||
vertices.add(new Vector3f(max.x(), min.y(), min.z()));
|
||||
|
||||
|
||||
vertices.add(new Vector3f(max.x(), min.y(), min.z()));
|
||||
vertices.add(new Vector3f(max.x(), min.y(), max.z()));
|
||||
|
||||
|
||||
vertices.add(new Vector3f(max.x(), min.y(), max.z()));
|
||||
vertices.add(new Vector3f(min.x(), min.y(), max.z()));
|
||||
|
||||
|
||||
vertices.add(new Vector3f(min.x(), min.y(), max.z()));
|
||||
vertices.add(new Vector3f(min.x(), min.y(), min.z()));
|
||||
|
||||
|
||||
vertices.add(new Vector3f(min.x(), max.y(), min.z()));
|
||||
vertices.add(new Vector3f(max.x(), max.y(), min.z()));
|
||||
|
||||
|
||||
vertices.add(new Vector3f(max.x(), max.y(), min.z()));
|
||||
vertices.add(new Vector3f(max.x(), max.y(), max.z()));
|
||||
|
||||
|
||||
vertices.add(new Vector3f(max.x(), max.y(), max.z()));
|
||||
vertices.add(new Vector3f(min.x(), max.y(), max.z()));
|
||||
|
||||
|
||||
vertices.add(new Vector3f(min.x(), max.y(), max.z()));
|
||||
vertices.add(new Vector3f(min.x(), max.y(), min.z()));
|
||||
|
||||
|
||||
vertices.add(new Vector3f(min.x(), min.y(), min.z()));
|
||||
vertices.add(new Vector3f(min.x(), max.y(), min.z()));
|
||||
|
||||
|
||||
vertices.add(new Vector3f(max.x(), min.y(), min.z()));
|
||||
vertices.add(new Vector3f(max.x(), max.y(), min.z()));
|
||||
|
||||
|
||||
vertices.add(new Vector3f(max.x(), min.y(), max.z()));
|
||||
vertices.add(new Vector3f(max.x(), max.y(), max.z()));
|
||||
|
||||
|
||||
vertices.add(new Vector3f(min.x(), min.y(), max.z()));
|
||||
vertices.add(new Vector3f(min.x(), max.y(), max.z()));
|
||||
drawLine(vertices, color, transformationMatrix, updateDepthBuffer, depthtest);
|
||||
}
|
||||
|
||||
public void drawCylinder(final float radius, final float size, final int lats, final int longs, final Matrix4f transformationMatrix, final Color tmpColor) {
|
||||
|
||||
public void drawCylinder(
|
||||
final float radius,
|
||||
final float size,
|
||||
final int lats,
|
||||
final int longs,
|
||||
final Matrix4f transformationMatrix,
|
||||
final Color tmpColor) {
|
||||
drawCylinder(radius, size, lats, longs, transformationMatrix, tmpColor, true, true);
|
||||
}
|
||||
|
||||
public void drawCylinder(
|
||||
final float radius,
|
||||
final float size,
|
||||
final int lats,
|
||||
final int longs,
|
||||
final Matrix4f transformationMatrix,
|
||||
final Color tmpColor,
|
||||
final boolean updateDepthBuffer,
|
||||
final boolean depthtest) {
|
||||
final List<Vector3f> tmpVertices = new ArrayList<>();
|
||||
// center to border (TOP)
|
||||
|
||||
|
||||
// center to border (TOP)
|
||||
for (int jjj = 0; jjj < longs; ++jjj) {
|
||||
float lng = 2.0f * (float) Math.PI * (jjj - 1) / longs;
|
||||
|
||||
|
||||
final float z = size * 0.5f;
|
||||
final Vector3f v1 = new Vector3f(0.0f, 0.0f, z);
|
||||
|
||||
|
||||
float x = (float) Math.cos(lng) * radius;
|
||||
float y = (float) Math.sin(lng) * radius;
|
||||
final Vector3f v2 = new Vector3f(x, y, z);
|
||||
|
||||
|
||||
lng = 2.0f * (float) Math.PI * (jjj) / longs;
|
||||
x = (float) Math.cos(lng) * radius;
|
||||
y = (float) Math.sin(lng) * radius;
|
||||
@ -350,24 +398,24 @@ public class ResourceColored3DObject extends Resource {
|
||||
// Cylinder
|
||||
for (int jjj = 0; jjj < longs; ++jjj) {
|
||||
float lng = 2.0f * (float) Math.PI * (jjj - 1) / longs;
|
||||
|
||||
|
||||
final float z = size * 0.5f;
|
||||
|
||||
|
||||
float x = (float) Math.cos(lng) * radius;
|
||||
float y = (float) Math.sin(lng) * radius;
|
||||
final Vector3f v2 = new Vector3f(x, y, z);
|
||||
final Vector3f v2b = new Vector3f(x, y, -z);
|
||||
|
||||
|
||||
lng = 2.0f * (float) Math.PI * (jjj) / longs;
|
||||
x = (float) Math.cos(lng) * radius;
|
||||
y = (float) Math.sin(lng) * radius;
|
||||
final Vector3f v3 = new Vector3f(x, y, z);
|
||||
final Vector3f v3b = new Vector3f(x, y, -z);
|
||||
|
||||
|
||||
tmpVertices.add(v2);
|
||||
tmpVertices.add(v3);
|
||||
tmpVertices.add(v3b);
|
||||
|
||||
|
||||
tmpVertices.add(v2);
|
||||
tmpVertices.add(v3b);
|
||||
tmpVertices.add(v2b);
|
||||
@ -375,14 +423,14 @@ public class ResourceColored3DObject extends Resource {
|
||||
// center to border (BUTTOM)
|
||||
for (int jjj = 0; jjj < longs; ++jjj) {
|
||||
float lng = 2.0f * (float) Math.PI * (jjj - 1) / longs;
|
||||
|
||||
|
||||
final float z = size * -0.5f;
|
||||
final Vector3f v1 = new Vector3f(0.0f, 0.0f, z);
|
||||
|
||||
|
||||
float x = (float) Math.cos(lng) * radius;
|
||||
float y = (float) Math.sin(lng) * radius;
|
||||
final Vector3f v2 = new Vector3f(x, y, z);
|
||||
|
||||
|
||||
lng = 2.0f * (float) Math.PI * (jjj) / longs;
|
||||
x = (float) Math.cos(lng) * radius;
|
||||
y = (float) Math.sin(lng) * radius;
|
||||
@ -391,15 +439,20 @@ public class ResourceColored3DObject extends Resource {
|
||||
tmpVertices.add(v2);
|
||||
tmpVertices.add(v3);
|
||||
}
|
||||
draw(tmpVertices, tmpColor, transformationMatrix, true, true);
|
||||
draw(tmpVertices, tmpColor, transformationMatrix, updateDepthBuffer, depthtest);
|
||||
}
|
||||
|
||||
public void drawLine(final List<Vector3f> vertices, final Color color, final Matrix4f transformationMatrix, final boolean updateDepthBuffer, final boolean depthtest) {
|
||||
|
||||
public void drawLine(
|
||||
final List<Vector3f> vertices,
|
||||
final Color color,
|
||||
final Matrix4f transformationMatrix,
|
||||
final boolean updateDepthBuffer,
|
||||
final boolean depthtest) {
|
||||
if (vertices.size() <= 0) {
|
||||
return;
|
||||
}
|
||||
if (this.program == null) {
|
||||
Log.error("No shader ...");
|
||||
LOGGER.error("No shader ...");
|
||||
return;
|
||||
}
|
||||
if (depthtest) {
|
||||
@ -408,7 +461,7 @@ public class ResourceColored3DObject extends Resource {
|
||||
OpenGL.setDeathMask(false);
|
||||
}
|
||||
}
|
||||
//Log.debug(" display " << this.coord.size() << " elements" );
|
||||
//LOGGER.debug(" display " << this.coord.size() << " elements" );
|
||||
this.program.use();
|
||||
// set Matrix: translation/positionMatrix
|
||||
final Matrix4f projectionMatrix = OpenGL.getMatrix();
|
||||
@ -424,8 +477,8 @@ public class ResourceColored3DObject extends Resource {
|
||||
if (color.a() < 1.0f) {
|
||||
OpenGL.enable(OpenGL.Flag.flag_blend);
|
||||
}
|
||||
// Request the draw od the elements:
|
||||
OpenGL.drawArrays(OpenGL.RenderMode.line, 0, vertices.size());
|
||||
// Request the draw od the elements:
|
||||
OpenGL.drawArrays(OpenGL.RenderMode.LINE, 0, vertices.size());
|
||||
if (color.a() < 1.0f) {
|
||||
OpenGL.disable(OpenGL.Flag.flag_blend);
|
||||
}
|
||||
@ -437,35 +490,40 @@ public class ResourceColored3DObject extends Resource {
|
||||
OpenGL.disable(OpenGL.Flag.flag_depthTest);
|
||||
}
|
||||
}
|
||||
|
||||
public void drawSphere(final float radius, final int lats, final int longs, final Matrix4f transformationMatrix, final Color tmpColor) {
|
||||
|
||||
public void drawSphere(
|
||||
final float radius,
|
||||
final int lats,
|
||||
final int longs,
|
||||
final Matrix4f transformationMatrix,
|
||||
final Color tmpColor) {
|
||||
final List<Vector3f> tmpVertices = new ArrayList<>();
|
||||
for (int iii = 0; iii <= lats; ++iii) {
|
||||
final float lat0 = (float) Math.PI * (-0.5f + (float) (iii - 1) / lats);
|
||||
final float z0 = radius * (float) Math.sin(lat0);
|
||||
final float zr0 = radius * (float) Math.cos(lat0);
|
||||
|
||||
|
||||
final float lat1 = (float) Math.PI * (-0.5f + (float) (iii) / lats);
|
||||
final float z1 = radius * (float) Math.sin(lat1);
|
||||
final float zr1 = radius * (float) Math.cos(lat1);
|
||||
|
||||
|
||||
for (int jjj = 0; jjj < longs; ++jjj) {
|
||||
float lng = 2.0f * (float) Math.PI * (jjj - 1) / longs;
|
||||
float x = (float) Math.cos(lng);
|
||||
float y = (float) Math.sin(lng);
|
||||
final Vector3f v1 = new Vector3f(x * zr1, y * zr1, z1);
|
||||
final Vector3f v4 = new Vector3f(x * zr0, y * zr0, z0);
|
||||
|
||||
|
||||
lng = 2 * (float) Math.PI * (jjj) / longs;
|
||||
x = (float) Math.cos(lng);
|
||||
y = (float) Math.sin(lng);
|
||||
final Vector3f v2 = new Vector3f(x * zr1, y * zr1, z1);
|
||||
final Vector3f v3 = new Vector3f(x * zr0, y * zr0, z0);
|
||||
|
||||
|
||||
tmpVertices.add(v1);
|
||||
tmpVertices.add(v2);
|
||||
tmpVertices.add(v3);
|
||||
|
||||
|
||||
tmpVertices.add(v1);
|
||||
tmpVertices.add(v3);
|
||||
tmpVertices.add(v4);
|
||||
@ -473,12 +531,15 @@ public class ResourceColored3DObject extends Resource {
|
||||
}
|
||||
draw(tmpVertices, tmpColor, transformationMatrix, true, true);
|
||||
}
|
||||
|
||||
|
||||
public void drawSquare(final Vector3f size, final Matrix4f transformationMatrix, final Color tmpColor) {
|
||||
final List<Vector3f> tmpVertices = new ArrayList<>();
|
||||
final int[] indices = { 0, 1, 2, 3, 2, 1, 4, 0, 6, 6, 0, 2, 5, 1, 4, 4, 1, 0, 7, 3, 1, 7, 1, 5, 5, 4, 7, 7, 4, 6, 7, 2, 3, 7, 6, 2 };
|
||||
final Vector3f[] vertices = { new Vector3f(size.x(), size.y(), size.z()), new Vector3f(-size.x(), size.y(), size.z()), new Vector3f(size.x(), -size.y(), size.z()),
|
||||
new Vector3f(-size.x(), -size.y(), size.z()), new Vector3f(size.x(), size.y(), -size.z()), new Vector3f(-size.x(), size.y(), -size.z()), new Vector3f(size.x(), -size.y(), -size.z()),
|
||||
final int[] indices = { 0, 1, 2, 3, 2, 1, 4, 0, 6, 6, 0, 2, 5, 1, 4, 4, 1, 0, 7, 3, 1, 7, 1, 5, 5, 4, 7, 7, 4,
|
||||
6, 7, 2, 3, 7, 6, 2 };
|
||||
final Vector3f[] vertices = { new Vector3f(size.x(), size.y(), size.z()),
|
||||
new Vector3f(-size.x(), size.y(), size.z()), new Vector3f(size.x(), -size.y(), size.z()),
|
||||
new Vector3f(-size.x(), -size.y(), size.z()), new Vector3f(size.x(), size.y(), -size.z()),
|
||||
new Vector3f(-size.x(), size.y(), -size.z()), new Vector3f(size.x(), -size.y(), -size.z()),
|
||||
new Vector3f(-size.x(), -size.y(), -size.z()) };
|
||||
tmpVertices.clear();
|
||||
for (int iii = 0; iii < 36; iii += 3) {
|
||||
@ -491,24 +552,47 @@ public class ResourceColored3DObject extends Resource {
|
||||
}
|
||||
draw(tmpVertices, tmpColor, transformationMatrix, true, true);
|
||||
}
|
||||
|
||||
public void drawTriangles(final List<Vector3f> vertex, final List<Integer> indice, final Matrix4f transformationMatrix, final Color tmpColor) {
|
||||
|
||||
public void drawTriangle(
|
||||
final Vector3f p1,
|
||||
final Vector3f p2,
|
||||
final Vector3f p3,
|
||||
final Matrix4f transformationMatrix,
|
||||
final Color tmpColor) {
|
||||
final List<Vector3f> tmpVertices = new ArrayList<>();
|
||||
tmpVertices.add(p1);
|
||||
tmpVertices.add(p2);
|
||||
tmpVertices.add(p3);
|
||||
//LOGGER.info("display " << tmpVertices.size() << " vertices form " << indice.size());
|
||||
draw(tmpVertices, tmpColor, transformationMatrix, true, true);
|
||||
}
|
||||
|
||||
public void drawTriangles(
|
||||
final List<Vector3f> vertex,
|
||||
final List<Integer> indice,
|
||||
final Matrix4f transformationMatrix,
|
||||
final Color tmpColor) {
|
||||
drawTriangles(vertex, indice, transformationMatrix, tmpColor, new Vector3f(0.0f, 0.0f, 0.1f));
|
||||
}
|
||||
|
||||
public void drawTriangles(final List<Vector3f> vertex, final List<Integer> indice, final Matrix4f transformationMatrix, final Color tmpColor, final Vector3f offset) {
|
||||
|
||||
public void drawTriangles(
|
||||
final List<Vector3f> vertex,
|
||||
final List<Integer> indice,
|
||||
final Matrix4f transformationMatrix,
|
||||
final Color tmpColor,
|
||||
final Vector3f offset) {
|
||||
final List<Vector3f> tmpVertices = new ArrayList<>();
|
||||
for (int iii = 0; iii < indice.size() / 3; ++iii) {
|
||||
tmpVertices.add(vertex.get(indice.get(iii * 3 + 0)).add(offset));
|
||||
tmpVertices.add(vertex.get(indice.get(iii * 3 + 1)).add(offset));
|
||||
tmpVertices.add(vertex.get(indice.get(iii * 3 + 2)).add(offset));
|
||||
//Log.info(" indices " << indice[iii*3 + 0] << " " << indice[iii*3 + 1] << " " << indice[iii*3 + 2]);
|
||||
//Log.info(" triangle " << vertex[indice[iii*3 + 0]] << " " << vertex[indice[iii*3 + 1]] << " " << vertex[indice[iii*3 + 2]]);
|
||||
//LOGGER.info(" indices " << indice[iii*3 + 0] << " " << indice[iii*3 + 1] << " " << indice[iii*3 + 2]);
|
||||
//LOGGER.info(" triangle " << vertex[indice[iii*3 + 0]] << " " << vertex[indice[iii*3 + 1]] << " " << vertex[indice[iii*3 + 2]]);
|
||||
}
|
||||
//Log.info("display " << tmpVertices.size() << " vertices form " << indice.size());
|
||||
//LOGGER.info("display " << tmpVertices.size() << " vertices form " << indice.size());
|
||||
draw(tmpVertices, tmpColor, transformationMatrix, true, true);
|
||||
}
|
||||
|
||||
|
||||
private FloatBuffer storeDataInFloatBuffer(final float[] data) {
|
||||
final FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
|
||||
buffer.put(data);
|
@ -4,22 +4,24 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.etk.Uri;
|
||||
import org.atriasoft.gale.internal.Log;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class ResourceManager {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(ResourceManager.class);
|
||||
private static final int MAX_RESOURCE_LEVEL = 9;
|
||||
private final List<Resource> resourceList = new ArrayList<>();
|
||||
private List<Resource> resourceListToUpdate = new ArrayList<>();
|
||||
private boolean contextHasBeenRemoved = true;
|
||||
private boolean exiting = false;
|
||||
|
||||
|
||||
/**
|
||||
* initialize the internal variable
|
||||
*/
|
||||
public ResourceManager() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* special end of application
|
||||
*/
|
||||
@ -27,9 +29,9 @@ public class ResourceManager {
|
||||
contextHasBeenDestroyed();
|
||||
this.exiting = true;
|
||||
}
|
||||
|
||||
|
||||
public synchronized void cleanInternalRemoved() {
|
||||
//Log.info("remove object in Manager");
|
||||
//LOGGER.info("remove object in Manager");
|
||||
updateContext();
|
||||
// TODO ...
|
||||
// for (auto it(this.resourceList.begin()); it!=this.resourceList.end(); ++it) {
|
||||
@ -39,86 +41,98 @@ public class ResourceManager {
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is to inform the resources manager that we have no more openGl context ...
|
||||
*/
|
||||
public synchronized void contextHasBeenDestroyed() {
|
||||
for (final Resource it : this.resourceList) {
|
||||
if (it.getCount() > 0) {
|
||||
it.removeContextToLate();
|
||||
synchronized (this.resourceList) {
|
||||
for (final Resource it : this.resourceList) {
|
||||
if (it.getCount() > 0) {
|
||||
it.removeContextToLate();
|
||||
}
|
||||
}
|
||||
}
|
||||
// no context preent ...
|
||||
this.contextHasBeenRemoved = true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* display in the log all the resources loaded ...
|
||||
*/
|
||||
public synchronized void display() {
|
||||
Log.info("Resources loaded : ");
|
||||
LOGGER.info("Resources loaded : ");
|
||||
// remove all resources ...
|
||||
for (final Resource it : this.resourceList) {
|
||||
Log.info(" [" + it.getId() + "]" + it.getClass().getCanonicalName() + "='" + it.getName() + "' " + it.getCount() + " elements");
|
||||
|
||||
synchronized (this.resourceList) {
|
||||
for (final Resource it : this.resourceList) {
|
||||
LOGGER.info(" [" + it.getId() + "]" + it.getClass().getCanonicalName() + "='" + it.getName() + "' "
|
||||
+ it.getCount() + " elements");
|
||||
}
|
||||
}
|
||||
Log.info("Resources ---");
|
||||
LOGGER.info("Resources ---");
|
||||
}
|
||||
|
||||
|
||||
public synchronized void localAdd(final Resource object) {
|
||||
// add at the end if no slot is free
|
||||
this.resourceList.add(object);
|
||||
synchronized (this.resourceList) {
|
||||
this.resourceList.add(object);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// internal API to extent eResources in extern Soft
|
||||
public synchronized Resource localKeep(final String filename) {
|
||||
Log.verbose("KEEP (DEFAULT) : file : '" + filename + "' in " + this.resourceList.size() + " resources");
|
||||
for (final Resource it : this.resourceList) {
|
||||
if (it == null) {
|
||||
continue;
|
||||
}
|
||||
if (it.getName() == null) {
|
||||
continue;
|
||||
}
|
||||
//Log.verbose("compare : " + filename + " ==???== " + it.getName());
|
||||
if (it.getName().contentEquals(Resource.NO_NAME_RESOURCE)) {
|
||||
continue;
|
||||
}
|
||||
if (it.getName().contentEquals(filename)) {
|
||||
return it;
|
||||
synchronized (this.resourceList) {
|
||||
LOGGER.trace("KEEP (DEFAULT) : file : '" + filename + "' in " + this.resourceList.size() + " resources");
|
||||
for (final Resource it : this.resourceList) {
|
||||
if (it == null) {
|
||||
continue;
|
||||
}
|
||||
if (it.getName() == null) {
|
||||
continue;
|
||||
}
|
||||
//LOGGER.trace("compare : " + filename + " ==???== " + it.getName());
|
||||
if (it.getName().contentEquals(Resource.NO_NAME_RESOURCE)) {
|
||||
continue;
|
||||
}
|
||||
if (it.getName().contentEquals(filename)) {
|
||||
return it;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public synchronized Resource localKeep(final Uri uri) {
|
||||
// TODO Auto-generated method stub
|
||||
return localKeep(uri.toString());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reload all resources from files, and send there in openGL card if needed.
|
||||
* @note If file is reference at THEMEXXX:///filename if the Theme change the file will reload the newOne
|
||||
*/
|
||||
public synchronized void reLoadResources() {
|
||||
Log.info("------------- Resources re-loaded -------------");
|
||||
LOGGER.info("------------- Resources re-loaded -------------");
|
||||
// remove all resources ...
|
||||
for (long jjj = 0; jjj < MAX_RESOURCE_LEVEL; jjj++) {
|
||||
Log.info(" Reload level : " + jjj + "/" + (MAX_RESOURCE_LEVEL - 1));
|
||||
for (final Resource it : this.resourceList) {
|
||||
if (jjj == it.getResourceLevel()) {
|
||||
if (it.getCount() > 0) {
|
||||
it.reload();
|
||||
Log.info(" [" + it.getId() + "]=" + it.getClass().getCanonicalName());
|
||||
for (long jjj = 0; jjj < ResourceManager.MAX_RESOURCE_LEVEL; jjj++) {
|
||||
LOGGER.info(" Reload level : " + jjj + "/" + (ResourceManager.MAX_RESOURCE_LEVEL - 1));
|
||||
synchronized (this.resourceList) {
|
||||
for (final Resource it : this.resourceList) {
|
||||
if (jjj == it.getResourceLevel()) {
|
||||
if (it.getCount() > 0) {
|
||||
it.reload();
|
||||
LOGGER.info(" [" + it.getId() + "]=" + it.getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// TODO UNderstand why it is set here ...
|
||||
//gale::requestUpdateSize();
|
||||
Log.info("------------- Resources -------------");
|
||||
LOGGER.info("------------- Resources -------------");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Uninitiamize the resource manager, free all resources previously requested
|
||||
* @note when not free == > generate warning, because the segfault can appear after...
|
||||
@ -131,12 +145,15 @@ public class ResourceManager {
|
||||
display();
|
||||
this.resourceListToUpdate.clear();
|
||||
// remove all resources ...
|
||||
for (final Resource it : this.resourceList) {
|
||||
Log.warning("Find a resource that is not removed : [" + it.getId() + "]" + "='" + it.getName() + "' " + it.getCount() + " elements");
|
||||
synchronized (this.resourceList) {
|
||||
for (final Resource it : this.resourceList) {
|
||||
LOGGER.warn("Find a resource that is not removed : [" + it.getId() + "]" + "='" + it.getName() + "' "
|
||||
+ it.getCount() + " elements");
|
||||
}
|
||||
this.resourceList.clear();
|
||||
}
|
||||
this.resourceList.clear();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Call by the system to send all the needed data on the graphic card chen they change ...
|
||||
* @param object The resources that might be updated
|
||||
@ -154,16 +171,16 @@ public class ResourceManager {
|
||||
this.resourceListToUpdate.add(object);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Call by the system chen the openGL Context has been unexpectially removed == > This reload all the texture, VBO and other ....
|
||||
*/
|
||||
public void updateContext() {
|
||||
if (this.exiting) {
|
||||
Log.error("Request update after application EXIT ...");
|
||||
LOGGER.error("Request update after application EXIT ...");
|
||||
return;
|
||||
}
|
||||
// TODO Check the number of call this ... Log.info("update open-gl context ... ");
|
||||
// TODO Check the number of call this ... LOGGER.info("update open-gl context ... ");
|
||||
if (this.contextHasBeenRemoved) {
|
||||
// need to update all ...
|
||||
this.contextHasBeenRemoved = false;
|
||||
@ -172,11 +189,12 @@ public class ResourceManager {
|
||||
}
|
||||
synchronized (this.resourceList) {
|
||||
if (this.resourceList.size() != 0) {
|
||||
for (long jjj = 0; jjj < MAX_RESOURCE_LEVEL; jjj++) {
|
||||
Log.verbose(" updateContext level (D) : " + jjj + "/" + (MAX_RESOURCE_LEVEL - 1));
|
||||
for (long jjj = 0; jjj < ResourceManager.MAX_RESOURCE_LEVEL; jjj++) {
|
||||
LOGGER.trace(" updateContext level (D) : " + jjj + "/"
|
||||
+ (ResourceManager.MAX_RESOURCE_LEVEL - 1));
|
||||
for (final Resource it : this.resourceList) {
|
||||
if (jjj == it.getResourceLevel()) {
|
||||
//Log.debug("Update context named : " + lresourceList[iii].getName());
|
||||
//LOGGER.debug("Update context named : " + lresourceList[iii].getName());
|
||||
if (!it.updateContext()) {
|
||||
// Lock error ==> postponned
|
||||
synchronized (this.resourceListToUpdate) {
|
||||
@ -195,8 +213,9 @@ public class ResourceManager {
|
||||
this.resourceListToUpdate = new ArrayList<>();
|
||||
}
|
||||
if (resourceListToUpdate.size() != 0) {
|
||||
for (long jjj = 0; jjj < MAX_RESOURCE_LEVEL; jjj++) {
|
||||
Log.verbose(" updateContext level (U) : " + jjj + "/" + (MAX_RESOURCE_LEVEL - 1));
|
||||
for (long jjj = 0; jjj < ResourceManager.MAX_RESOURCE_LEVEL; jjj++) {
|
||||
LOGGER.trace(
|
||||
" updateContext level (U) : " + jjj + "/" + (ResourceManager.MAX_RESOURCE_LEVEL - 1));
|
||||
for (final Resource it : resourceListToUpdate) {
|
||||
if (jjj == it.getResourceLevel()) {
|
||||
if (!it.updateContext()) {
|
||||
@ -209,5 +228,5 @@ public class ResourceManager {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -11,37 +11,41 @@ import org.atriasoft.etk.math.Vector2f;
|
||||
import org.atriasoft.etk.math.Vector2i;
|
||||
import org.atriasoft.etk.math.Vector3f;
|
||||
import org.atriasoft.etk.math.Vector3i;
|
||||
import org.atriasoft.etk.math.Vector4f;
|
||||
import org.atriasoft.gale.backend3d.OpenGL;
|
||||
import org.atriasoft.gale.internal.Log;
|
||||
import org.lwjgl.BufferUtils;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.opengl.GL15;
|
||||
import org.lwjgl.opengl.GL20;
|
||||
import org.lwjgl.opengl.GL40;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
class ProgAttributeElement {
|
||||
public String name; // !< Name of the element
|
||||
public int elementId; // !< openGl Id if this element == > can not exist ==> @ref m_isLinked
|
||||
public boolean isAttribute; // !< true if it was an attribute element, otherwite it was an uniform
|
||||
public boolean isLinked; // !< if this element does not exist this is false
|
||||
};
|
||||
}
|
||||
|
||||
public class ResourceProgram extends Resource {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(ResourceProgram.class);
|
||||
static final boolean DEBUG = false; // TODO externalize this ...
|
||||
|
||||
public static ResourceProgram create(final Uri uriVertexShader, final Uri uriFragmentShader) {
|
||||
ResourceProgram resource;
|
||||
final String name = uriVertexShader.getValue() + "<-->" + uriFragmentShader.getValue();
|
||||
Resource resource2 = getManager().localKeep(name);
|
||||
final Resource resource2 = Resource.getManager().localKeep(name);
|
||||
if (resource2 != null) {
|
||||
if (resource2 instanceof ResourceProgram) {
|
||||
resource2.keep();
|
||||
return (ResourceProgram) resource2;
|
||||
}
|
||||
Log.critical("Request resource file : '" + name + "' With the wrong type (dynamic cast error)");
|
||||
LOGGER.error("Request resource file : '" + name + "' With the wrong type (dynamic cast error)");
|
||||
System.exit(-1);
|
||||
return null;
|
||||
}
|
||||
resource = new ResourceProgram(uriVertexShader, uriFragmentShader);
|
||||
getManager().localAdd(resource);
|
||||
Resource.getManager().localAdd(resource);
|
||||
return resource;
|
||||
}
|
||||
|
||||
@ -97,25 +101,23 @@ public class ResourceProgram extends Resource {
|
||||
protected ResourceProgram(final Uri uriVertexShader, final Uri uriFragmentShader) {
|
||||
super(uriVertexShader.getValue() + "<-->" + uriFragmentShader.getValue());
|
||||
this.resourceLevel = 1;
|
||||
Log.debug("OGL : load PROGRAM '" + uriVertexShader + "' && '" + uriFragmentShader + "'");
|
||||
LOGGER.debug("OGL : load PROGRAM '" + uriVertexShader + "' && '" + uriFragmentShader + "'");
|
||||
this.shaderVertex = ResourceShader.create(uriVertexShader);
|
||||
if (this.shaderVertex == null) {
|
||||
Log.error("Error while getting a specific shader filename: " + uriVertexShader);
|
||||
LOGGER.error("Error while getting a specific shader filename: " + uriVertexShader);
|
||||
return;
|
||||
} else {
|
||||
Log.debug("Add shader on program: '" + uriFragmentShader + "'");
|
||||
}
|
||||
LOGGER.debug("Add shader on program: '" + uriFragmentShader + "'");
|
||||
this.shaderFragment = ResourceShader.create(uriFragmentShader);
|
||||
if (this.shaderFragment == null) {
|
||||
Log.error("Error while getting a specific shader filename: " + uriFragmentShader);
|
||||
LOGGER.error("Error while getting a specific shader filename: " + uriFragmentShader);
|
||||
return;
|
||||
} else {
|
||||
Log.debug("Add shader on program : " + uriFragmentShader + "frag");
|
||||
}
|
||||
LOGGER.debug("Add shader on program : " + uriFragmentShader + "frag");
|
||||
if (OpenGL.hasContext()) {
|
||||
updateContext();
|
||||
} else {
|
||||
getManager().update(this);
|
||||
Resource.getManager().update(this);
|
||||
}
|
||||
}
|
||||
|
||||
@ -131,15 +133,16 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
return;
|
||||
}
|
||||
|
||||
Log.error("[" + this.elementList.get(idElem).name + "] send on oglID=" + vbo.getOpenGlId(vboId) + " VBOindex=" + vboId);
|
||||
GL20.glBindBuffer(GL20.GL_ARRAY_BUFFER, vbo.getOpenGlId(vboId));
|
||||
LOGGER.error("[" + this.elementList.get(idElem).name + "] send on oglID=" + vbo.getOpenGlId(vboId)
|
||||
+ " VBOindex=" + vboId);
|
||||
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo.getOpenGlId(vboId));
|
||||
GL20.glEnableVertexAttribArray(this.elementList.get(idElem).elementId);
|
||||
this.listOfVBOUsed.add(this.elementList.get(idElem).elementId);
|
||||
}
|
||||
@ -216,17 +219,19 @@ public class ResourceProgram extends Resource {
|
||||
tmp.name = elementName;
|
||||
tmp.isAttribute = true;
|
||||
if (!OpenGL.hasContext()) {
|
||||
getManager().update(this);
|
||||
Resource.getManager().update(this);
|
||||
tmp.elementId = -1;
|
||||
tmp.isLinked = false;
|
||||
} else if (this.exist) {
|
||||
tmp.elementId = OpenGL.programGetAttributeLocation(this.program, tmp.name);
|
||||
tmp.isLinked = true;
|
||||
if (tmp.elementId < 0) {
|
||||
Log.warning(" {" + this.program + "}[" + this.elementList.size() + "] glGetAttribLocation(\"" + tmp.name + "\") = " + tmp.elementId);
|
||||
LOGGER.warn(" {" + this.program + "}[" + this.elementList.size() + "] glGetAttribLocation(\""
|
||||
+ tmp.name + "\") = " + tmp.elementId);
|
||||
tmp.isLinked = false;
|
||||
} else {
|
||||
Log.debug(" {" + this.program + "}[" + this.elementList.size() + "] glGetAttribLocation(\"" + tmp.name + "\") = " + tmp.elementId);
|
||||
LOGGER.debug(" {" + this.program + "}[" + this.elementList.size() + "] glGetAttribLocation(\""
|
||||
+ tmp.name + "\") = " + tmp.elementId);
|
||||
}
|
||||
} else {
|
||||
// program is not loaded ==> just local reister ...
|
||||
@ -262,17 +267,19 @@ public class ResourceProgram extends Resource {
|
||||
tmp.name = elementName;
|
||||
tmp.isAttribute = false;
|
||||
if (!OpenGL.hasContext()) {
|
||||
getManager().update(this);
|
||||
Resource.getManager().update(this);
|
||||
tmp.elementId = -1;
|
||||
tmp.isLinked = false;
|
||||
} else if (this.exist) {
|
||||
tmp.elementId = OpenGL.programGetUniformLocation(this.program, tmp.name);
|
||||
tmp.isLinked = true;
|
||||
if (tmp.elementId < 0) {
|
||||
Log.warning(" {" + this.program + "}[" + this.elementList.size() + "] glGetUniformLocation(\"" + tmp.name + "\") = " + tmp.elementId);
|
||||
LOGGER.warn(" {" + this.program + "}[" + this.elementList.size() + "] glGetUniformLocation(\""
|
||||
+ tmp.name + "\") = " + tmp.elementId);
|
||||
tmp.isLinked = false;
|
||||
} else {
|
||||
Log.debug(" {" + this.program + "}[" + this.elementList.size() + "] glGetUniformLocation(\"" + tmp.name + "\") = " + tmp.elementId);
|
||||
LOGGER.debug(" {" + this.program + "}[" + this.elementList.size() + "] glGetUniformLocation(\""
|
||||
+ tmp.name + "\") = " + tmp.elementId);
|
||||
}
|
||||
} else {
|
||||
// program is not loaded ==> just local reister ...
|
||||
@ -293,14 +300,14 @@ public class ResourceProgram extends Resource {
|
||||
public void reload() {
|
||||
/*
|
||||
* TODO ... etk::file file(this.name, etk::FILETYPEDATA); if (file.Exist() ==
|
||||
* false) { Log.error("File does not Exist :"" + file + "\""); return; }
|
||||
*
|
||||
* false) { LOGGER.error("File does not Exist :"" + file + "\""); return; }
|
||||
*
|
||||
* int fileSize = file.size(); if (fileSize == 0) {
|
||||
* Log.error("This file is empty : " + file); return; } if (file.fOpenRead() ==
|
||||
* false) { Log.error("Can not open the file : " + file); return; } // remove
|
||||
* LOGGER.error("This file is empty : " + file); return; } if (file.fOpenRead() ==
|
||||
* false) { LOGGER.error("Can not open the file : " + file); return; } // remove
|
||||
* previous data ... if (this.fileData != null) { del ete[] this.fileData;
|
||||
* this.fileData = 0; } // allocate data this.fileData = ne w char[fileSize+5];
|
||||
* if (this.fileData == null) { Log.error("Error Memory allocation size=" +
|
||||
* if (this.fileData == null) { LOGGER.error("Error Memory allocation size=" +
|
||||
* fileSize); return; } memset(this.fileData, 0, (fileSize+5)*sizeof(char)); //
|
||||
* load data from the file : file.fRead(this.fileData, 1, fileSize); // close
|
||||
* the file: file.fClose();
|
||||
@ -353,7 +360,7 @@ public class ResourceProgram extends Resource {
|
||||
// }
|
||||
// if ( idElem < 0
|
||||
// || (long)idElem > this.elementList.size()) {
|
||||
// Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1)
|
||||
// LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1)
|
||||
// + "]");
|
||||
// return;
|
||||
// }
|
||||
@ -362,7 +369,7 @@ public class ResourceProgram extends Resource {
|
||||
// }
|
||||
// FloatBuffer buffer = storeDataInFloatBuffer(data);
|
||||
// //GL40.glBindVertexArray(this.elementList.get(idElem).elementId);
|
||||
// Log.error("[" + this.elementList.get(idElem).name + "] send " + data.length +
|
||||
// LOGGER.error("[" + this.elementList.get(idElem).name + "] send " + data.length +
|
||||
// " element");
|
||||
// GL40.glVertexAttribPointer(
|
||||
// this.elementList.get(idElem).elementId,
|
||||
@ -381,24 +388,29 @@ public class ResourceProgram extends Resource {
|
||||
// public void sendAttribute(int idElem, List<Vector3f> data) {
|
||||
// sendAttribute3fv(idElem, convertInFloat(data));
|
||||
// }
|
||||
public void sendAttribute(final int idElem, final int nbElement, final FloatBuffer data, final int jumpBetweenSample) {
|
||||
public void sendAttribute(
|
||||
final int idElem,
|
||||
final int nbElement,
|
||||
final FloatBuffer data,
|
||||
final int jumpBetweenSample) {
|
||||
if (!this.exist) {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
return;
|
||||
}
|
||||
// GL40.glBindVertexArray(this.elementList.get(idElem).elementId);
|
||||
// Log.error("[" + this.elementList.get(idElem).name + "] send " + 3 + "
|
||||
// LOGGER.error("[" + this.elementList.get(idElem).name + "] send " + 3 + "
|
||||
// element");
|
||||
GL40.glVertexAttribPointer(this.elementList.get(idElem).elementId, nbElement, GL40.GL_FLOAT, false, jumpBetweenSample * 4, /* 4 is the size of float in the generic system... */
|
||||
GL20.glVertexAttribPointer(this.elementList.get(idElem).elementId, nbElement, GL11.GL_FLOAT, false,
|
||||
jumpBetweenSample * 4, /* 4 is the size of float in the generic system... */
|
||||
data);
|
||||
// checkGlError("glVertexAttribPointer", LINE, idElem);
|
||||
GL40.glEnableVertexAttribArray(this.elementList.get(idElem).elementId);
|
||||
GL20.glEnableVertexAttribArray(this.elementList.get(idElem).elementId);
|
||||
// checkGlError("glEnableVertexAttribArray", LINE, idElem);
|
||||
}
|
||||
|
||||
@ -420,7 +432,7 @@ public class ResourceProgram extends Resource {
|
||||
// }
|
||||
// if ( idElem < 0
|
||||
// || (long)idElem > this.elementList.size()) {
|
||||
// Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1)
|
||||
// LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size()-1)
|
||||
// + "]");
|
||||
// return;
|
||||
// }
|
||||
@ -429,17 +441,17 @@ public class ResourceProgram extends Resource {
|
||||
// }
|
||||
// // check error of the VBO goog enought ...
|
||||
// if (vbo.getElementSize(index) <= 0) {
|
||||
// Log.error("Can not bind a VBO Buffer with an element size of : " +
|
||||
// LOGGER.error("Can not bind a VBO Buffer with an element size of : " +
|
||||
// vbo.getElementSize(index) + " named=" + vbo.getName());
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// Log.verbose("[" + this.elementList.get(idElem).name + "] send " +
|
||||
// LOGGER.trace("[" + this.elementList.get(idElem).name + "] send " +
|
||||
// vbo.getElementSize(index) + " element on oglID=" + vbo.getGLID(index) + "
|
||||
// VBOindex=" + index);
|
||||
// OpenGL.bindBuffer(vbo.getGLID(index));
|
||||
// Log.verbose(" id=" + this.elementList.get(idElem).elementId);
|
||||
// Log.verbose(" eleme size=" + vbo.getElementSize(index));
|
||||
// LOGGER.trace(" id=" + this.elementList.get(idElem).elementId);
|
||||
// LOGGER.trace(" eleme size=" + vbo.getElementSize(index));
|
||||
// OpenGL.bufferData(data, Usage.staticDraw);
|
||||
// OpenGL.vertexAttribPointerFloat(this.elementList.get(idElem).elementId,
|
||||
// vbo.getElementSize(index)); // Pointer on the buffer
|
||||
@ -454,19 +466,20 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
return;
|
||||
}
|
||||
|
||||
Log.verbose("[" + this.elementList.get(idElem).name + "] send on oglID=" + vbo.getOpenGlId(index) + " VBOindex=" + index);
|
||||
GL20.glBindBuffer(GL20.GL_ARRAY_BUFFER, vbo.getOpenGlId(index));
|
||||
LOGGER.trace("[" + this.elementList.get(idElem).name + "] send on oglID=" + vbo.getOpenGlId(index)
|
||||
+ " VBOindex=" + index);
|
||||
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo.getOpenGlId(index));
|
||||
// checkGlError("glBindBuffer", __LINE__, _idElem);
|
||||
Log.verbose(" id=" + this.elementList.get(idElem).elementId);
|
||||
Log.verbose(" jump sample=" + jumpBetweenSample);
|
||||
Log.verbose(" offset=" + offset);
|
||||
LOGGER.trace(" id=" + this.elementList.get(idElem).elementId);
|
||||
LOGGER.trace(" jump sample=" + jumpBetweenSample);
|
||||
LOGGER.trace(" offset=" + offset);
|
||||
GL20.glVertexAttribPointer(this.elementList.get(idElem).elementId, // attribute ID of openGL
|
||||
vbo.getElementSize(index), // number of elements per vertex, here (r,g,b,a)
|
||||
GL11.GL_FLOAT, // the type of each element
|
||||
@ -525,7 +538,7 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -533,7 +546,21 @@ public class ResourceProgram extends Resource {
|
||||
}
|
||||
OpenGL.programLoadUniformColor(this.elementList.get(idElem).elementId, value);
|
||||
}
|
||||
|
||||
|
||||
public void uniformColorRGB(final int idElem, final Color value) {
|
||||
if (!this.exist) {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
return;
|
||||
}
|
||||
OpenGL.programLoadUniformColorRGB(this.elementList.get(idElem).elementId, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send 1 float uniform element to the spefified ID (not send if does not
|
||||
* really exist in the openGL program)
|
||||
@ -545,7 +572,7 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -567,7 +594,7 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -590,7 +617,7 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -608,13 +635,18 @@ public class ResourceProgram extends Resource {
|
||||
* @param value3 Value to send at the Uniform
|
||||
* @param value4 Value to send at the Uniform
|
||||
*/
|
||||
public void uniformFloat(final int idElem, final float value1, final float value2, final float value3, final float value4) {
|
||||
public void uniformFloat(
|
||||
final int idElem,
|
||||
final float value1,
|
||||
final float value2,
|
||||
final float value3,
|
||||
final float value4) {
|
||||
|
||||
if (!this.exist) {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -635,7 +667,7 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -657,7 +689,7 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -680,7 +712,7 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -704,7 +736,7 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -731,13 +763,13 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
return;
|
||||
}
|
||||
// Log.error("[" + this.elementList.get(idElem).name + "] send 1 matrix");
|
||||
// LOGGER.error("[" + this.elementList.get(idElem).name + "] send 1 matrix");
|
||||
// note : Android des not supported the transposition of the matrix, then we
|
||||
// will done it oursef:
|
||||
/*
|
||||
@ -748,13 +780,13 @@ public class ResourceProgram extends Resource {
|
||||
*/
|
||||
OpenGL.programLoadUniformMatrix(this.elementList.get(idElem).elementId, matrix, transpose);
|
||||
}
|
||||
|
||||
|
||||
public void uniformVector(final int idElem, final Vector2f value) {
|
||||
if (!this.exist) {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -768,7 +800,7 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -782,7 +814,7 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -796,7 +828,21 @@ public class ResourceProgram extends Resource {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
Log.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
return;
|
||||
}
|
||||
OpenGL.programLoadUniformVector(this.elementList.get(idElem).elementId, value);
|
||||
}
|
||||
|
||||
public void uniformVector(final int idElem, final Vector4f value) {
|
||||
if (!this.exist) {
|
||||
return;
|
||||
}
|
||||
if (idElem < 0 || (long) idElem > this.elementList.size()) {
|
||||
LOGGER.error("idElem = " + idElem + " not in [0.." + (this.elementList.size() - 1) + "]");
|
||||
return;
|
||||
}
|
||||
if (!this.elementList.get(idElem).isLinked) {
|
||||
@ -809,7 +855,7 @@ public class ResourceProgram extends Resource {
|
||||
* Stop the processing of this program
|
||||
*/
|
||||
public void unUse() {
|
||||
// Log.verbose("Will UN-use program : " + this.program);
|
||||
// LOGGER.trace("Will UN-use program : " + this.program);
|
||||
|
||||
if (!this.exist) {
|
||||
return;
|
||||
@ -832,7 +878,7 @@ public class ResourceProgram extends Resource {
|
||||
// Do nothing == > too dangerous ...
|
||||
} else {
|
||||
// create the Shader
|
||||
Log.debug("Create the Program ...'" + this.name + "'");
|
||||
LOGGER.debug("Create the Program ...'" + this.name + "'");
|
||||
this.program = OpenGL.programCreate();
|
||||
if (this.program < 0) {
|
||||
return true;
|
||||
@ -846,12 +892,13 @@ public class ResourceProgram extends Resource {
|
||||
}
|
||||
|
||||
OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_POSITIONS, "in_position");
|
||||
OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_TEXTURE_COORDINATES, "tin_extureCoords");
|
||||
OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_TEXTURE_COORDINATES,
|
||||
"in_extureCoords");
|
||||
OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_NORMALS, "in_normal");
|
||||
OpenGL.programBindAttribute(this.program, ResourceVirtualArrayObject.INDICE_VBO_COLORS, "in_colors");
|
||||
|
||||
if (!OpenGL.programCompile(this.program)) {
|
||||
Log.error("Could not compile'PROGRAM':'" + this.name + "'");
|
||||
LOGGER.error("Could not compile'PROGRAM':'" + this.name + "'");
|
||||
OpenGL.programRemove(this.program);
|
||||
return true;
|
||||
}
|
||||
@ -862,19 +909,23 @@ public class ResourceProgram extends Resource {
|
||||
it.elementId = OpenGL.programGetAttributeLocation(this.program, it.name);
|
||||
it.isLinked = true;
|
||||
if (it.elementId < 0) {
|
||||
Log.warning(" {" + this.program + "}[" + iii + "] openGL::getAttributeLocation(\"" + it.name + "\") = " + it.elementId);
|
||||
LOGGER.warn(" {" + this.program + "}[" + iii + "] openGL::getAttributeLocation(\"" + it.name
|
||||
+ "\") = " + it.elementId);
|
||||
it.isLinked = false;
|
||||
} else {
|
||||
Log.debug(" {" + this.program + "}[" + iii + "] openGL::getAttributeLocation(\"" + it.name + "\") = " + it.elementId);
|
||||
LOGGER.debug(" {" + this.program + "}[" + iii + "] openGL::getAttributeLocation(\"" + it.name
|
||||
+ "\") = " + it.elementId);
|
||||
}
|
||||
} else {
|
||||
it.elementId = OpenGL.programGetUniformLocation(this.program, it.name);
|
||||
it.isLinked = true;
|
||||
if (it.elementId < 0) {
|
||||
Log.warning(" {" + this.program + "}[" + iii + "] openGL::getUniformLocation(\"" + it.name + "\") = " + it.elementId);
|
||||
LOGGER.warn(" {" + this.program + "}[" + iii + "] openGL::getUniformLocation(\"" + it.name
|
||||
+ "\") = " + it.elementId);
|
||||
it.isLinked = false;
|
||||
} else {
|
||||
Log.debug(" {" + this.program + "}[" + iii + "] openGL::getUniformLocation(\"" + it.name + "\") = " + it.elementId);
|
||||
LOGGER.debug(" {" + this.program + "}[" + iii + "] openGL::getUniformLocation(\"" + it.name
|
||||
+ "\") = " + it.elementId);
|
||||
}
|
||||
}
|
||||
iii++;
|
||||
@ -889,7 +940,7 @@ public class ResourceProgram extends Resource {
|
||||
* Request the processing of this program
|
||||
*/
|
||||
public void use() {
|
||||
// Log.verbose("Will use program : " + this.program);
|
||||
// LOGGER.trace("Will use program : " + this.program);
|
||||
// event if it was 0 == > set it to prevent other use of the previous shader
|
||||
// display ...
|
||||
OpenGL.programUse(this.program);
|
@ -3,9 +3,11 @@ package org.atriasoft.gale.resource;
|
||||
import org.atriasoft.etk.Uri;
|
||||
import org.atriasoft.gale.backend3d.OpenGL;
|
||||
import org.atriasoft.gale.backend3d.OpenGL.ShaderType;
|
||||
import org.atriasoft.gale.internal.Log;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class ResourceShader extends Resource {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(ResourceShader.class);
|
||||
|
||||
public static ResourceShader create(final Uri uriShader) {
|
||||
ResourceShader resource;
|
||||
@ -14,7 +16,7 @@ public class ResourceShader extends Resource {
|
||||
if (!name.isEmpty() && !name.equals("---")) {
|
||||
resource2 = getManager().localKeep(name);
|
||||
} else {
|
||||
Log.error("Can not create a shader without a filaname");
|
||||
LOGGER.error("Can not create a shader without a filaname");
|
||||
return null;
|
||||
}
|
||||
if (resource2 != null) {
|
||||
@ -22,7 +24,8 @@ public class ResourceShader extends Resource {
|
||||
resource2.keep();
|
||||
return (ResourceShader) resource2;
|
||||
}
|
||||
Log.critical("Request resource file : '" + name + "' With the wrong type (dynamic cast error)");
|
||||
LOGGER.error("Request resource file : '" + name + "' With the wrong type (dynamic cast error)");
|
||||
System.exit(-1);
|
||||
return null;
|
||||
}
|
||||
resource = new ResourceShader(uriShader);
|
||||
@ -43,16 +46,18 @@ public class ResourceShader extends Resource {
|
||||
super(uri);
|
||||
this.uri = uri;
|
||||
this.resourceLevel = 0;
|
||||
Log.debug("OGL : load SHADER '" + uri + "'");
|
||||
LOGGER.debug("OGL : load SHADER '" + uri + "'");
|
||||
// load data from file "all the time ..."
|
||||
|
||||
if (uri.get().endsWith(".frag")) {
|
||||
this.type = ShaderType.fragment;
|
||||
this.type = ShaderType.FRAGMENT;
|
||||
} else if (uri.get().endsWith(".vert")) {
|
||||
this.type = ShaderType.vertex;
|
||||
this.type = ShaderType.VERTEX;
|
||||
} else {
|
||||
Log.error("File does not have extention '.vert' for Vertex Shader or '.frag' for Fragment Shader. but : \"" + uri + "\"");
|
||||
this.type = ShaderType.vertex;
|
||||
LOGGER.error(
|
||||
"File does not have extention '.vert' for Vertex Shader or '.frag' for Fragment Shader. but : \""
|
||||
+ uri + "\"");
|
||||
this.type = ShaderType.VERTEX;
|
||||
return;
|
||||
}
|
||||
reload();
|
||||
@ -90,15 +95,16 @@ public class ResourceShader extends Resource {
|
||||
@Override
|
||||
public void reload() {
|
||||
//!< A copy of the data loaded from the file (useful only when opengl context is removed)
|
||||
String fileData = "";
|
||||
Log.verbose("load shader:\n-----------------------------------------------------------------\n" + fileData + "\n-----------------------------------------------------------------");
|
||||
final String fileData = "";
|
||||
LOGGER.trace("load shader:\n-----------------------------------------------------------------\n" + fileData
|
||||
+ "\n-----------------------------------------------------------------");
|
||||
// now change the OGL context ...
|
||||
if (OpenGL.hasContext()) {
|
||||
Log.debug("OGL : load SHADER '" + this.name + "' ==> call update context (direct)");
|
||||
LOGGER.debug("OGL : load SHADER '" + this.name + "' ==> call update context (direct)");
|
||||
removeContext();
|
||||
updateContext();
|
||||
} else {
|
||||
Log.debug("OGL : load SHADER '" + this.name + "' ==> tagged has update context needed");
|
||||
LOGGER.debug("OGL : load SHADER '" + this.name + "' ==> tagged has update context needed");
|
||||
// TODO Check this, this is a leek ==> in the GPU ... really bad ...
|
||||
this.exist = false;
|
||||
this.shader = 0;
|
@ -6,28 +6,35 @@ import org.atriasoft.egami.ImageByteRGBA;
|
||||
import org.atriasoft.etk.Uri;
|
||||
import org.atriasoft.etk.math.Vector2i;
|
||||
import org.atriasoft.gale.backend3d.OpenGL;
|
||||
import org.atriasoft.gale.internal.Log;
|
||||
import org.atriasoft.gale.tools.ImageLoader;
|
||||
import org.atriasoft.gale.tools.ImageRawData;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.opengl.GL13;
|
||||
import org.lwjgl.opengl.GL30;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@Deprecated
|
||||
public class ResourceTexture extends Resource {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(ResourceTexture.class);
|
||||
|
||||
public enum TextureColorMode {
|
||||
rgb, //!< red/green/blue data
|
||||
rgba //!< red/green/blue/alpha data
|
||||
}
|
||||
|
||||
private static int[] textureIdBinding = { GL13.GL_TEXTURE0, GL13.GL_TEXTURE1, GL13.GL_TEXTURE2, GL13.GL_TEXTURE3, GL13.GL_TEXTURE4, GL13.GL_TEXTURE5, GL13.GL_TEXTURE6, GL13.GL_TEXTURE7,
|
||||
GL13.GL_TEXTURE8, GL13.GL_TEXTURE9, GL13.GL_TEXTURE10, GL13.GL_TEXTURE11, GL13.GL_TEXTURE12, GL13.GL_TEXTURE13, GL13.GL_TEXTURE14, GL13.GL_TEXTURE15, GL13.GL_TEXTURE16, GL13.GL_TEXTURE17,
|
||||
GL13.GL_TEXTURE18, GL13.GL_TEXTURE19, GL13.GL_TEXTURE20, GL13.GL_TEXTURE21, GL13.GL_TEXTURE22, GL13.GL_TEXTURE23, GL13.GL_TEXTURE24, GL13.GL_TEXTURE25, GL13.GL_TEXTURE26,
|
||||
GL13.GL_TEXTURE27, GL13.GL_TEXTURE28, GL13.GL_TEXTURE29, GL13.GL_TEXTURE30, GL13.GL_TEXTURE31 };;
|
||||
|
||||
|
||||
private static int[] textureIdBinding = { GL13.GL_TEXTURE0, GL13.GL_TEXTURE1, GL13.GL_TEXTURE2, GL13.GL_TEXTURE3,
|
||||
GL13.GL_TEXTURE4, GL13.GL_TEXTURE5, GL13.GL_TEXTURE6, GL13.GL_TEXTURE7, GL13.GL_TEXTURE8, GL13.GL_TEXTURE9,
|
||||
GL13.GL_TEXTURE10, GL13.GL_TEXTURE11, GL13.GL_TEXTURE12, GL13.GL_TEXTURE13, GL13.GL_TEXTURE14,
|
||||
GL13.GL_TEXTURE15, GL13.GL_TEXTURE16, GL13.GL_TEXTURE17, GL13.GL_TEXTURE18, GL13.GL_TEXTURE19,
|
||||
GL13.GL_TEXTURE20, GL13.GL_TEXTURE21, GL13.GL_TEXTURE22, GL13.GL_TEXTURE23, GL13.GL_TEXTURE24,
|
||||
GL13.GL_TEXTURE25, GL13.GL_TEXTURE26, GL13.GL_TEXTURE27, GL13.GL_TEXTURE28, GL13.GL_TEXTURE29,
|
||||
GL13.GL_TEXTURE30, GL13.GL_TEXTURE31 };;
|
||||
|
||||
public static ResourceTexture createFromPng(final Uri uriTexture) {
|
||||
return createFromPng(uriTexture, 1);
|
||||
}
|
||||
|
||||
|
||||
public static ResourceTexture createFromPng(final Uri uriTexture, final int textureUnit) {
|
||||
ResourceTexture resource;
|
||||
Resource resource2;
|
||||
@ -35,7 +42,7 @@ public class ResourceTexture extends Resource {
|
||||
if (!name.isEmpty() && !name.equals("---")) {
|
||||
resource2 = getManager().localKeep(name);
|
||||
} else {
|
||||
Log.error("Can not create a shader without a filaname");
|
||||
LOGGER.error("Can not create a shader without a filaname");
|
||||
return null;
|
||||
}
|
||||
if (resource2 != null) {
|
||||
@ -43,14 +50,22 @@ public class ResourceTexture extends Resource {
|
||||
resource2.keep();
|
||||
return (ResourceTexture) resource2;
|
||||
}
|
||||
Log.critical("Request resource file : '" + name + "' With the wrong type (dynamic cast error)");
|
||||
LOGGER.error("Request resource file : '" + name + "' With the wrong type (dynamic cast error)");
|
||||
System.exit(-1);
|
||||
return null;
|
||||
}
|
||||
resource = new ResourceTexture(uriTexture, textureUnit);
|
||||
final ImageRawData decodedData = ImageLoader.decodePngFile(uriTexture);
|
||||
ImageByteRGBA img = new ImageByteRGBA(decodedData.getWidth(), decodedData.getHeight());
|
||||
ByteBuffer mlklmklm = decodedData.getBuffer();
|
||||
byte[] elemData = new byte[mlklmklm.remaining()];
|
||||
ImageRawData decodedData;
|
||||
try {
|
||||
decodedData = ImageLoader.decodePngFile(uriTexture);
|
||||
} catch (final Exception e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
final ImageByteRGBA img = new ImageByteRGBA(decodedData.getWidth(), decodedData.getHeight());
|
||||
final ByteBuffer mlklmklm = decodedData.getBuffer();
|
||||
final byte[] elemData = new byte[mlklmklm.remaining()];
|
||||
mlklmklm.get(elemData);
|
||||
if (decodedData.isHasAlpha()) {
|
||||
for (int yyy = 0; yyy < decodedData.getHeight(); yyy++) {
|
||||
@ -64,18 +79,19 @@ public class ResourceTexture extends Resource {
|
||||
} else {
|
||||
for (int yyy = 0; yyy < decodedData.getHeight(); yyy++) {
|
||||
for (int xxx = 0; xxx < decodedData.getWidth(); xxx++) {
|
||||
img.setAFloat(xxx, yyy, 0xFF);
|
||||
img.setAByte(xxx, yyy, (byte) 0xFF);
|
||||
img.setRByte(xxx, yyy, elemData[(yyy * decodedData.getWidth() + xxx) * 3 + 0]);
|
||||
img.setGByte(xxx, yyy, elemData[(yyy * decodedData.getWidth() + xxx) * 3 + 1]);
|
||||
img.setBByte(xxx, yyy, elemData[(yyy * decodedData.getWidth() + xxx) * 3 + 2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
resource.setTexture(img, new Vector2i(decodedData.getWidth(), decodedData.getHeight()), (decodedData.isHasAlpha() ? TextureColorMode.rgba : TextureColorMode.rgb), textureUnit);
|
||||
resource.setTexture(img, new Vector2i(decodedData.getWidth(), decodedData.getHeight()),
|
||||
(decodedData.isHasAlpha() ? TextureColorMode.rgba : TextureColorMode.rgb), textureUnit);
|
||||
resource.flush();
|
||||
return resource;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the next power 2 if the input
|
||||
* @param value Value that we want the next power of 2
|
||||
@ -89,10 +105,11 @@ public class ResourceTexture extends Resource {
|
||||
}
|
||||
val *= 2;
|
||||
}
|
||||
Log.critical("impossible CASE....");
|
||||
LOGGER.error("impossible CASE....");
|
||||
System.exit(-1);
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
protected int texId = -1; //!< openGl textureID.
|
||||
// some image are not square == > we need to sqared it to prevent some openGl api error the the displayable size is not all the time 0.0 . 1.0.
|
||||
protected Vector2i endPointSize = new Vector2i(-1, -1);
|
||||
@ -108,16 +125,14 @@ public class ResourceTexture extends Resource {
|
||||
private TextureColorMode dataColorSpace = TextureColorMode.rgb;
|
||||
// number of lines and colomns in the texture (multiple texturing in a single texture)
|
||||
private int textureUnit = 0;
|
||||
|
||||
protected ResourceTexture() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
protected ResourceTexture() {}
|
||||
|
||||
protected ResourceTexture(final Uri filename, final int textureUnit) {
|
||||
super(filename.toString() + "__" + textureUnit);
|
||||
this.textureUnit = textureUnit;
|
||||
}
|
||||
|
||||
|
||||
public void bindForRendering(final int idTexture) {
|
||||
if (!this.loaded) {
|
||||
return;
|
||||
@ -129,49 +144,53 @@ public class ResourceTexture extends Resource {
|
||||
OpenGL.enable(OpenGL.Flag.flag_back);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void cleanUp() {
|
||||
removeContext();
|
||||
}
|
||||
|
||||
|
||||
// Flush the data to send it at the openGl system
|
||||
public synchronized void flush() {
|
||||
// request to the manager to be call at the next update ...
|
||||
Log.verbose("Request UPDATE of Element");
|
||||
LOGGER.trace("Request UPDATE of Element");
|
||||
getManager().update(this);
|
||||
}
|
||||
|
||||
|
||||
public Vector2i getOpenGlSize() {
|
||||
return this.size;
|
||||
};
|
||||
|
||||
|
||||
public int getRendererId() {
|
||||
return this.texId;
|
||||
}
|
||||
|
||||
|
||||
public Vector2i getUsableSize() {
|
||||
return this.endPointSize;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public synchronized void removeContext() {
|
||||
if (this.loaded) {
|
||||
// Request remove texture ...
|
||||
Log.info("TEXTURE: Rm [" + getId() + "] texId=" + this.texId);
|
||||
LOGGER.info("TEXTURE: Rm [" + getId() + "] texId=" + this.texId);
|
||||
// TODO Check if we are in the correct thread
|
||||
OpenGL.glDeleteTextures(this.texId);
|
||||
this.loaded = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public synchronized void removeContextToLate() {
|
||||
this.loaded = false;
|
||||
this.texId = -1;
|
||||
}
|
||||
|
||||
public void setTexture(final ImageByteRGBA data, final Vector2i size, final TextureColorMode dataColorSpace, final int textureUnit) {
|
||||
|
||||
public void setTexture(
|
||||
final ImageByteRGBA data,
|
||||
final Vector2i size,
|
||||
final TextureColorMode dataColorSpace,
|
||||
final int textureUnit) {
|
||||
this.data = data;
|
||||
this.size = size;
|
||||
this.textureUnit = textureUnit;
|
||||
@ -179,7 +198,7 @@ public class ResourceTexture extends Resource {
|
||||
this.dataColorSpace = dataColorSpace;
|
||||
flush();
|
||||
}
|
||||
|
||||
|
||||
public void unBindForRendering() {
|
||||
if (!this.loaded) {
|
||||
return;
|
||||
@ -189,7 +208,7 @@ public class ResourceTexture extends Resource {
|
||||
OpenGL.disable(OpenGL.Flag.flag_back);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Gale internal API:
|
||||
@Override
|
||||
public boolean updateContext() {
|
||||
@ -200,24 +219,26 @@ public class ResourceTexture extends Resource {
|
||||
this.texId = GL11.glGenTextures();
|
||||
GL13.glActiveTexture(this.textureUnit);
|
||||
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.texId);
|
||||
|
||||
|
||||
// All RGB bytes are aligned to each other and each component is 1 byte
|
||||
GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
|
||||
Log.info("TEXTURE: add [" + getId() + "]=" + this.size + " OGlId=" + this.texId);
|
||||
LOGGER.info("TEXTURE: add [" + getId() + "]=" + this.size + " OGlId=" + this.texId);
|
||||
if (this.dataColorSpace == TextureColorMode.rgb) {
|
||||
OpenGL.glTexImage2D(0, GL11.GL_RGBA, this.size.x(), this.size.y(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, this.data.getRaw());
|
||||
//The local image has not RGB but only RGBA data ...
|
||||
OpenGL.glTexImage2D(0, GL11.GL_RGBA, this.size.x(), this.size.y(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE,
|
||||
this.data.getRaw());
|
||||
//The local image has not RGB but only RGBA data ...
|
||||
//OpenGL.glTexImage2D(0, GL11.GL_RGBA, this.size.x(), this.size.y(), 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, this.data.getRaw());
|
||||
} else {
|
||||
OpenGL.glTexImage2D(0, GL11.GL_RGBA, this.size.x(), this.size.y(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, this.data.getRaw());
|
||||
OpenGL.glTexImage2D(0, GL11.GL_RGBA, this.size.x(), this.size.y(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE,
|
||||
this.data.getRaw());
|
||||
}
|
||||
// generate multi-texture mapping
|
||||
GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);
|
||||
|
||||
|
||||
// Setup the ST coordinate system
|
||||
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
|
||||
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
|
||||
|
||||
|
||||
// Setup what to do when the texture has to be scaled
|
||||
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
|
||||
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
|
305
src/main/org/atriasoft/gale/resource/ResourceTexture2.java
Normal file
305
src/main/org/atriasoft/gale/resource/ResourceTexture2.java
Normal file
@ -0,0 +1,305 @@
|
||||
/** @file
|
||||
* @author Edouard DUPIN
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
* @license MPL v2.0 (see license file)
|
||||
*/
|
||||
package org.atriasoft.gale.resource;
|
||||
|
||||
import org.atriasoft.egami.ImageByte;
|
||||
import org.atriasoft.egami.ImageByteRGBA;
|
||||
import org.atriasoft.etk.Tools;
|
||||
import org.atriasoft.etk.Uri;
|
||||
import org.atriasoft.etk.math.Vector2i;
|
||||
import org.atriasoft.gale.TextureFilter;
|
||||
import org.atriasoft.gale.backend3d.OpenGL;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class ResourceTexture2 extends Resource {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(ResourceTexture2.class);
|
||||
|
||||
public enum TextureColorMode {
|
||||
rgb, // !< red/green/blue data
|
||||
rgba // !< red/green/blue/alpha data
|
||||
}
|
||||
|
||||
public static ResourceTexture2 create() {
|
||||
LOGGER.trace("KEEP: Resource Texture Dynamic: ");
|
||||
return new ResourceTexture2();
|
||||
}
|
||||
|
||||
public static ResourceTexture2 create(final Uri uri) {
|
||||
LOGGER.trace("KEEP: Resource Texture: " + uri);
|
||||
final Resource object2 = Resource.getManager().localKeep(uri);
|
||||
if (object2 != null) {
|
||||
if (object2 instanceof final ResourceTexture2 tmpp) {
|
||||
return tmpp;
|
||||
}
|
||||
LOGGER.error("Request resource file : '" + uri + "' With the wrong type (dynamic cast error)");
|
||||
System.exit(-1);
|
||||
return null;
|
||||
}
|
||||
LOGGER.trace("CREATE: new Texture: " + uri);
|
||||
return new ResourceTexture2(uri);
|
||||
}
|
||||
|
||||
public static ResourceTexture2 createNamed(final String uri) {
|
||||
LOGGER.trace("KEEP: Resource Texture Named: " + uri);
|
||||
final Resource object2 = Resource.getManager().localKeep(uri);
|
||||
if (object2 != null) {
|
||||
if (object2 instanceof final ResourceTexture2 tmpp) {
|
||||
return tmpp;
|
||||
}
|
||||
LOGGER.error("Request resource file : '" + uri + "' With the wrong type (dynamic cast error)");
|
||||
System.exit(-1);
|
||||
return null;
|
||||
}
|
||||
LOGGER.debug("CREATE: new Texture Named: " + uri);
|
||||
return new ResourceTexture2(uri);
|
||||
}
|
||||
|
||||
/*
|
||||
* public static ResourceTexture2 createFromPng(final Uri uriTexture) { return
|
||||
* createFromPng(uriTexture, 1); }
|
||||
*
|
||||
* public static ResourceTexture2 createFromPng(final Uri uriTexture, final int
|
||||
* textureUnit) { ResourceTexture2 resource; Resource resource2; final String
|
||||
* name = uriTexture.getValue(); if (name.isEmpty() == false && name != "---") {
|
||||
* resource2 = getManager().localKeep(name); } else {
|
||||
* LOGGER.error("Can not create a shader without a filaname"); return null; } if
|
||||
* (resource2 != null) { if (resource2 instanceof ResourceTexture2) {
|
||||
* resource2.keep(); return (ResourceTexture2) resource2; }
|
||||
* LOGGER.critical("Request resource file : '" + name +
|
||||
* "' With the wrong type (dynamic cast error)");
|
||||
* System.exit(-1);
|
||||
* return null; } resource = new
|
||||
* ResourceTexture2(uriTexture, textureUnit); final ImageRawData decodedData =
|
||||
* ImageLoader.decodePngFile(uriTexture);
|
||||
* resource.setTexture(decodedData.getBuffer(), new
|
||||
* Vector2i(decodedData.getWidth(), decodedData.getHeight()),
|
||||
* (decodedData.isHasAlpha() == true ? TextureColorMode.rgba :
|
||||
* TextureColorMode.rgb), textureUnit); resource.flush(); return resource; }
|
||||
*/
|
||||
|
||||
// openGl Context properties :
|
||||
protected ImageByte data = new ImageByteRGBA(32, 32);
|
||||
// !< Color space of the image.
|
||||
private final TextureColorMode dataColorSpace = TextureColorMode.rgba;
|
||||
// Filter apply at the image when rendering it
|
||||
protected TextureFilter filter = TextureFilter.LINEAR;
|
||||
// ! Last loaded size in the system openGL
|
||||
protected Vector2i lastSize = new Vector2i(1, 1);
|
||||
protected int lastSizeObject = 0;
|
||||
protected int lastTypeObject = 0;
|
||||
// internal state of the openGl system.
|
||||
protected boolean loaded = false;
|
||||
// ! some image are not square == > we need to sqared it to prevent some openGl
|
||||
// api error the the displayable size is not all the time 0.0 . 1.0
|
||||
protected Vector2i realImageSize = new Vector2i(1, 1);
|
||||
|
||||
// repeat mode of the image (repeat the image if out of range [0..1])
|
||||
protected boolean repeat = false;
|
||||
|
||||
protected int texId = -1; // !< openGl textureID.
|
||||
|
||||
public ResourceTexture2() {}
|
||||
|
||||
public ResourceTexture2(final String filename) {
|
||||
super(filename);
|
||||
}
|
||||
|
||||
/*
|
||||
* public void bindForRendering(final int idTexture) { if (this.loaded == false)
|
||||
* { return; } GL13.glActiveTexture(textureIdBinding[idTexture]);
|
||||
* GL11.glBindTexture(GL11.GLTEXTURE2D, this.texId); if (this.dataColorSpace
|
||||
* == TextureColorMode.rgb) { OpenGL.enable(OpenGL.Flag.flagcullFace);
|
||||
* OpenGL.enable(OpenGL.Flag.flagback); } }
|
||||
*/
|
||||
|
||||
public ResourceTexture2(final Uri filename) {
|
||||
super(filename);
|
||||
}
|
||||
|
||||
public void bindForRendering(final int idTexture) {
|
||||
if (!this.loaded) {
|
||||
return;
|
||||
}
|
||||
OpenGL.activeTexture(idTexture);
|
||||
OpenGL.bindTexture2D(this.texId);
|
||||
if (this.dataColorSpace == TextureColorMode.rgb) {
|
||||
OpenGL.enable(OpenGL.Flag.flag_cullFace);
|
||||
OpenGL.enable(OpenGL.Flag.flag_back);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cleanUp() {
|
||||
removeContext();
|
||||
}
|
||||
|
||||
// Flush the data to send it at the openGl system
|
||||
public synchronized void flush() {
|
||||
// request to the manager to be call at the next update ...
|
||||
LOGGER.trace("Request UPDATE of Element");
|
||||
Resource.getManager().update(this);
|
||||
}
|
||||
|
||||
// Get the reference on this image to draw something on it ...
|
||||
public ImageByte get() {
|
||||
return this.data;
|
||||
}
|
||||
|
||||
public Vector2i getOpenGlSize() {
|
||||
return this.data.getSize();
|
||||
}
|
||||
|
||||
public int getRendererId() {
|
||||
return this.texId;
|
||||
}
|
||||
|
||||
public Vector2i getUsableSize() {
|
||||
return this.realImageSize;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void removeContext() {
|
||||
if (this.loaded) {
|
||||
// Request remove texture ...
|
||||
LOGGER.info("TEXTURE: Rm [" + getId() + "] texId=" + this.texId);
|
||||
// TODO Check if we are in the correct thread
|
||||
OpenGL.glDeleteTextures(this.texId);
|
||||
this.loaded = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void removeContextToLate() {
|
||||
this.loaded = false;
|
||||
this.texId = -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the image in the texture system
|
||||
* @note It will resize in square2 if needed by the system.
|
||||
* @param image Image to set.
|
||||
*/
|
||||
public synchronized void set(final ImageByte image) {
|
||||
LOGGER.info("Set a new image in a texture: size={}", image.getSize());
|
||||
this.data = image;
|
||||
this.realImageSize = this.data.getSize();
|
||||
// Disable compatibility size for embended ...
|
||||
// final Vector2i compatibilityHWSize = new Vector2i(Tools.nextP2(this.realImageSize.x()), Tools.nextP2(this.realImageSize.y()));
|
||||
// if (!this.realImageSize.equals(compatibilityHWSize)) {
|
||||
// LOGGER.warn("RESIZE Image for HArwareCompatibility:" + this.realImageSize + " => " + compatibilityHWSize);
|
||||
// this.data.resize(compatibilityHWSize.x(), compatibilityHWSize.y());
|
||||
// }
|
||||
flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the Filter mode to apply at the image when display with a scale
|
||||
* (not 1:1 ratio)
|
||||
* @param filter Value of the new filter mode
|
||||
*/
|
||||
public void setFilterMode(final TextureFilter filter) {
|
||||
this.filter = filter;
|
||||
}
|
||||
|
||||
// You must set the size here, because it will be set in multiple of pow(2)
|
||||
public synchronized void setImageSize(Vector2i newSize) {
|
||||
newSize = new Vector2i(Tools.nextP2(newSize.x()), Tools.nextP2(newSize.y()));
|
||||
this.data.resize(newSize.x(), newSize.y());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the repeat mode of the images if UV range is out of [0..1]
|
||||
* @param value Value of the new repeat mode
|
||||
*/
|
||||
public void setRepeat(final boolean value) {
|
||||
this.repeat = value;
|
||||
}
|
||||
|
||||
public void unBindForRendering() {
|
||||
if (!this.loaded) {
|
||||
return;
|
||||
}
|
||||
if (this.dataColorSpace == TextureColorMode.rgb) {
|
||||
OpenGL.disable(OpenGL.Flag.flag_cullFace);
|
||||
OpenGL.disable(OpenGL.Flag.flag_back);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized boolean updateContext() {
|
||||
LOGGER.trace("updateContext [START]");
|
||||
//final Steady tic = Steady.now();
|
||||
/*
|
||||
* TODO : use unlockable synchronized ... if (lock.tryLock() == false) { //Lock
|
||||
* error ==> try later ... return false; }
|
||||
*/
|
||||
final int typeObject = this.data.hasAlpha() ? OpenGL.GL_RGBA : OpenGL.GL_RGB;
|
||||
final int sizeObject = OpenGL.GL_UNSIGNED_BYTE;
|
||||
if (this.loaded) {
|
||||
if (this.lastTypeObject != typeObject || this.lastSizeObject != sizeObject
|
||||
|| !this.lastSize.equals(this.data.getSize())) {
|
||||
LOGGER.trace("TEXTURE: Rm [" + getId() + "] texId=" + this.texId);
|
||||
OpenGL.glDeleteTextures(this.texId);
|
||||
this.loaded = false;
|
||||
}
|
||||
}
|
||||
if (!this.loaded) {
|
||||
// Request a new texture at openGl :
|
||||
this.texId = OpenGL.glGenTextures();
|
||||
this.lastSize = this.data.getSize();
|
||||
this.lastTypeObject = typeObject;
|
||||
this.lastSizeObject = sizeObject;
|
||||
LOGGER.debug("TEXTURE: add [" + getId() + "]=" + this.data.getSize() + "=>" + this.data.getGPUSize()
|
||||
+ " OGlId=" + this.texId + " type=" + this.data.getClass().getCanonicalName());
|
||||
} else {
|
||||
LOGGER.debug("TEXTURE: update [" + getId() + "]=" + this.data.getSize() + "=>" + this.data.getGPUSize()
|
||||
+ " OGlId=" + this.texId + " type=" + this.data.getClass().getCanonicalName());
|
||||
}
|
||||
// in all case we set the texture properties :
|
||||
// TODO check error ???
|
||||
OpenGL.bindTexture2D(this.texId);
|
||||
|
||||
if (!this.loaded) {
|
||||
if (!this.repeat) {
|
||||
OpenGL.setTexture2DWrapClampToEdge();
|
||||
} else {
|
||||
OpenGL.setTexture2DWrapRepeat();
|
||||
}
|
||||
if (this.filter == TextureFilter.LINEAR) {
|
||||
OpenGL.setTexture2DFilterLinear();
|
||||
} else {
|
||||
OpenGL.setTexture2DFilterNearest();
|
||||
}
|
||||
}
|
||||
// glPixelStorei(GLUNPACKALIGNMENT,1);
|
||||
//final Steady toc1 = Steady.now();
|
||||
//LOGGER.trace(" BIND ==> " + toc1.less(tic));
|
||||
// egami::store(this.data, String("~/texture") + etk::toString(getId()) + ".bmp");
|
||||
if (!this.loaded) {
|
||||
OpenGL.glTexImage2D(0, // Level
|
||||
typeObject, // Format internal
|
||||
this.data.getWidth(), this.data.getHeight(), 0, // Border
|
||||
typeObject, // format
|
||||
sizeObject, // type
|
||||
this.data.getRaw());
|
||||
|
||||
} else {
|
||||
OpenGL.glTexSubImage2D(0, // Level
|
||||
0, // x offset
|
||||
0, // y offset
|
||||
this.data.getWidth(), this.data.getHeight(), typeObject, // format
|
||||
sizeObject, // type
|
||||
this.data.getRaw());
|
||||
}
|
||||
// now the data is loaded
|
||||
this.loaded = true;
|
||||
// final Steady toc = Steady.now();
|
||||
// LOGGER.error(" updateContext [STOP] ==> " + (toc - toc1));
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,99 @@
|
||||
package org.atriasoft.gale.resource;
|
||||
|
||||
import org.atriasoft.egami.ImageByte;
|
||||
import org.atriasoft.etk.Tools;
|
||||
import org.atriasoft.etk.Uri;
|
||||
import org.atriasoft.etk.math.Vector2i;
|
||||
import org.atriasoft.iogami.IOgami;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
// TODO : Change tis file name ...
|
||||
|
||||
public class ResourceTextureFile extends ResourceTexture2 {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(ResourceTextureFile.class);
|
||||
public static Vector2i sizeAuto = new Vector2i(-1, -1);
|
||||
public static Vector2i sizeDefault = Vector2i.ZERO;
|
||||
|
||||
public static ResourceTextureFile create(final Uri filename) {
|
||||
return ResourceTextureFile.create(filename, ResourceTextureFile.sizeAuto);
|
||||
}
|
||||
|
||||
public static ResourceTextureFile create(final Uri filename, final Vector2i size) {
|
||||
return ResourceTextureFile.create(filename, size, ResourceTextureFile.sizeAuto);
|
||||
}
|
||||
|
||||
/**
|
||||
* keep the resource pointer.
|
||||
* @note Never free this pointer by your own...
|
||||
* @param uri Name of the image file.
|
||||
* @param size size of the image (usefull when loading .svg to
|
||||
* automatic rescale)
|
||||
* @param sizeRegister size register in named (When you preaload the images
|
||||
* the size write here will be )
|
||||
* @return pointer on the resource or null if an error occured.
|
||||
*/
|
||||
public static ResourceTextureFile create(final Uri uri, final Vector2i inSize, final Vector2i sizeRegister) {
|
||||
LOGGER.trace("KEEP: TextureFile: '" + uri + "' size=" + inSize + " sizeRegister=" + sizeRegister);
|
||||
Vector2i size = inSize;
|
||||
if (uri == null) {
|
||||
return new ResourceTextureFile();
|
||||
}
|
||||
if (size.x() == 0) {
|
||||
size = size.withX(-1);
|
||||
// LOGGER.error("Error Request the image size.x() =0 ???");
|
||||
}
|
||||
if (size.y() == 0) {
|
||||
size = size.withY(-1);
|
||||
// LOGGER.error("Error Request the image size.y() =0 ???");
|
||||
}
|
||||
if (!uri.getExtention().toLowerCase().contentEquals("svg")) {
|
||||
size = ResourceTextureFile.sizeAuto;
|
||||
}
|
||||
if (size.x() > 0 && size.y() > 0) {
|
||||
LOGGER.trace(" == > specific size : " + size);
|
||||
size = new Vector2i(Tools.nextP2(size.x()), Tools.nextP2(size.y()));
|
||||
if (!sizeRegister.equals(ResourceTextureFile.sizeAuto)) {
|
||||
if (!sizeRegister.equals(ResourceTextureFile.sizeDefault)) {
|
||||
// tmpFilename.getQuery().set("x", "" + size.x));
|
||||
// tmpFilename.getQuery().set("y", "" + size.y));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LOGGER.trace("KEEP: TextureFile: '" + uri + "' new size=" + size);
|
||||
final Resource object2 = Resource.getManager().localKeep(uri.toString());
|
||||
if (object2 != null) {
|
||||
if (object2 instanceof final ResourceTextureFile out) {
|
||||
object2.keep();
|
||||
return out;
|
||||
}
|
||||
LOGGER.error("Request resource file : '" + uri + "' With the wrong type (dynamic cast error)");
|
||||
System.exit(-1);
|
||||
return null;
|
||||
}
|
||||
LOGGER.debug("CREATE: TextureFile: '" + uri + "' size=" + size);
|
||||
// need to crate a new one ...
|
||||
final ResourceTextureFile object = new ResourceTextureFile(uri.toString(), uri, size);
|
||||
Resource.getManager().localAdd(object);
|
||||
return object;
|
||||
}
|
||||
|
||||
protected ResourceTextureFile() {}
|
||||
|
||||
protected ResourceTextureFile(final String genName, final Uri uri, final Vector2i size) {
|
||||
super(genName);
|
||||
LOGGER.debug("create a new resource::Image : genName=" + genName + " uri=" + uri + " size=" + size);
|
||||
final ImageByte tmp = IOgami.load(uri, size);
|
||||
if (tmp == null) {
|
||||
LOGGER.error("Can not load the file : " + uri);
|
||||
return;
|
||||
}
|
||||
set(tmp);
|
||||
}
|
||||
|
||||
public Vector2i getRealSize() {
|
||||
return this.realImageSize;
|
||||
}
|
||||
|
||||
}
|
@ -12,57 +12,73 @@ import org.atriasoft.etk.math.Vector3f;
|
||||
import org.atriasoft.gale.backend3d.OpenGL;
|
||||
import org.atriasoft.gale.backend3d.OpenGL.RenderMode;
|
||||
import org.atriasoft.gale.backend3d.OpenGL.Usage;
|
||||
import org.atriasoft.gale.internal.Log;
|
||||
import org.lwjgl.BufferUtils;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.opengl.GL15;
|
||||
import org.lwjgl.opengl.GL20;
|
||||
import org.lwjgl.opengl.GL30;
|
||||
|
||||
//import models.RawModel;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class ResourceVirtualArrayObject extends Resource {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(ResourceVirtualArrayObject.class);
|
||||
public static final int INDICE_VBO_POSITIONS = 0;
|
||||
public static final int INDICE_VBO_TEXTURE_COORDINATES = 1;
|
||||
public static final int INDICE_VBO_NORMALS = 2;
|
||||
public static final int INDICE_VBO_COLORS = 3;
|
||||
|
||||
public static int[] convertIntegers(final List<Integer> integers) {
|
||||
int[] ret = new int[integers.size()];
|
||||
Iterator<Integer> iterator = integers.iterator();
|
||||
final int[] ret = new int[integers.size()];
|
||||
final Iterator<Integer> iterator = integers.iterator();
|
||||
for (int i = 0; i < ret.length; i++) {
|
||||
ret[i] = iterator.next().intValue();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static ResourceVirtualArrayObject create(final float[] positions, final float[] colors, final float[] textureCoordinates, final float[] normals, final int[] indices) {
|
||||
final ResourceVirtualArrayObject resource = new ResourceVirtualArrayObject(positions, colors, textureCoordinates, normals, indices, indices.length);
|
||||
getManager().localAdd(resource);
|
||||
public static ResourceVirtualArrayObject create(
|
||||
final float[] positions,
|
||||
final float[] colors,
|
||||
final float[] textureCoordinates,
|
||||
final float[] normals,
|
||||
final int[] indices) {
|
||||
final ResourceVirtualArrayObject resource = new ResourceVirtualArrayObject(positions, colors,
|
||||
textureCoordinates, normals, indices, indices.length);
|
||||
Resource.getManager().localAdd(resource);
|
||||
return resource;
|
||||
}
|
||||
|
||||
public static ResourceVirtualArrayObject create(final float[] positions, final float[] textureCoordinates, final float[] normals, final int[] indices) {
|
||||
final ResourceVirtualArrayObject resource = new ResourceVirtualArrayObject(positions, null, textureCoordinates, normals, indices, indices.length);
|
||||
getManager().localAdd(resource);
|
||||
public static ResourceVirtualArrayObject create(
|
||||
final float[] positions,
|
||||
final float[] textureCoordinates,
|
||||
final float[] normals,
|
||||
final int[] indices) {
|
||||
final ResourceVirtualArrayObject resource = new ResourceVirtualArrayObject(positions, null, textureCoordinates,
|
||||
normals, indices, indices.length);
|
||||
Resource.getManager().localAdd(resource);
|
||||
return resource;
|
||||
}
|
||||
|
||||
public static ResourceVirtualArrayObject create(final float[] positions, final float[] colors, final int[] indices) {
|
||||
final ResourceVirtualArrayObject resource = new ResourceVirtualArrayObject(positions, colors, null, null, indices, indices.length);
|
||||
getManager().localAdd(resource);
|
||||
public static ResourceVirtualArrayObject create(
|
||||
final float[] positions,
|
||||
final float[] colors,
|
||||
final int[] indices) {
|
||||
final ResourceVirtualArrayObject resource = new ResourceVirtualArrayObject(positions, colors, null, null,
|
||||
indices, indices.length);
|
||||
Resource.getManager().localAdd(resource);
|
||||
return resource;
|
||||
}
|
||||
|
||||
public static ResourceVirtualArrayObject create(final float[] positions, final int dimentions) {
|
||||
final ResourceVirtualArrayObject resource = new ResourceVirtualArrayObject(positions, null, null, null, null, positions.length / dimentions);
|
||||
getManager().localAdd(resource);
|
||||
final ResourceVirtualArrayObject resource = new ResourceVirtualArrayObject(positions, null, null, null, null,
|
||||
positions.length / dimentions);
|
||||
Resource.getManager().localAdd(resource);
|
||||
return resource;
|
||||
}
|
||||
|
||||
public static ResourceVirtualArrayObject createDynamic() {
|
||||
final ResourceVirtualArrayObject resource = new ResourceVirtualArrayObject();
|
||||
getManager().localAdd(resource);
|
||||
Resource.getManager().localAdd(resource);
|
||||
return resource;
|
||||
}
|
||||
|
||||
@ -99,14 +115,13 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
int vertexCount = -1;
|
||||
|
||||
protected ResourceVirtualArrayObject() {
|
||||
super();
|
||||
this.resourceLevel = 3;
|
||||
this.dynamic = true;
|
||||
Log.debug("OGL: load VBO count (dynamic)");
|
||||
LOGGER.debug("OGL: load VBO count (dynamic)");
|
||||
}
|
||||
|
||||
protected ResourceVirtualArrayObject(final float[] positions, final float[] colors, final float[] textureCoordinates, final float[] normals, final int[] indices, final int vertexCount) {
|
||||
super();
|
||||
protected ResourceVirtualArrayObject(final float[] positions, final float[] colors,
|
||||
final float[] textureCoordinates, final float[] normals, final int[] indices, final int vertexCount) {
|
||||
this.resourceLevel = 3;
|
||||
this.positions = positions;
|
||||
this.colors = colors;
|
||||
@ -114,7 +129,7 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
this.normals = normals;
|
||||
this.indices = indices;
|
||||
this.vertexCount = vertexCount;
|
||||
Log.debug("OGL: load VBO count");
|
||||
LOGGER.debug("OGL: load VBO count");
|
||||
}
|
||||
|
||||
public void bindForRendering() {
|
||||
@ -123,17 +138,17 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
}
|
||||
GL30.glBindVertexArray(this.vaoID);
|
||||
if (this.positions != null) {
|
||||
GL20.glEnableVertexAttribArray(INDICE_VBO_POSITIONS);
|
||||
//Log.info("unbind POSITION");
|
||||
GL20.glEnableVertexAttribArray(ResourceVirtualArrayObject.INDICE_VBO_POSITIONS);
|
||||
//LOGGER.info("unbind POSITION");
|
||||
}
|
||||
if (this.textureCoordinates != null) {
|
||||
GL20.glEnableVertexAttribArray(INDICE_VBO_TEXTURE_COORDINATES);
|
||||
GL20.glEnableVertexAttribArray(ResourceVirtualArrayObject.INDICE_VBO_TEXTURE_COORDINATES);
|
||||
}
|
||||
if (this.normals != null) {
|
||||
GL20.glEnableVertexAttribArray(INDICE_VBO_NORMALS);
|
||||
GL20.glEnableVertexAttribArray(ResourceVirtualArrayObject.INDICE_VBO_NORMALS);
|
||||
}
|
||||
if (this.colors != null) {
|
||||
GL20.glEnableVertexAttribArray(INDICE_VBO_COLORS);
|
||||
GL20.glEnableVertexAttribArray(ResourceVirtualArrayObject.INDICE_VBO_COLORS);
|
||||
}
|
||||
}
|
||||
|
||||
@ -141,7 +156,7 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
final int vboId = OpenGL.genBuffers();
|
||||
this.vbo.add(vboId);
|
||||
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboId);
|
||||
final IntBuffer buffer = storeDataInIntBuffer(indices);
|
||||
final IntBuffer buffer = ResourceVirtualArrayObject.storeDataInIntBuffer(indices);
|
||||
if (this.dynamic) {
|
||||
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, buffer, GL15.GL_DYNAMIC_DRAW);
|
||||
} else {
|
||||
@ -161,7 +176,7 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
* clear buffers
|
||||
*/
|
||||
public void clear() {
|
||||
//Log.verbose(" Clear: [" + getId() + "] '" + getName() + "' (size=" + buffer.get(0).length + ")");
|
||||
//LOGGER.trace(" Clear: [" + getId() + "] '" + getName() + "' (size=" + buffer.get(0).length + ")");
|
||||
this.positions = null;
|
||||
this.colors = null;
|
||||
this.textureCoordinates = null;
|
||||
@ -171,7 +186,7 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
}
|
||||
|
||||
private void createVAO() {
|
||||
Log.verbose("create VAO...");
|
||||
LOGGER.trace("create VAO...");
|
||||
this.vaoID = GL30.glGenVertexArrays();
|
||||
GL30.glBindVertexArray(this.vaoID);
|
||||
}
|
||||
@ -181,8 +196,8 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
*/
|
||||
public void flush() {
|
||||
// request to the manager to be call at the next update ...
|
||||
getManager().update(this);
|
||||
Log.verbose("Request flush of VBO: [" + getId() + "] '" + getName() + "'");
|
||||
Resource.getManager().update(this);
|
||||
LOGGER.trace("Request flush of VAO: [" + getId() + "] '" + getName() + "'");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -198,51 +213,55 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
}
|
||||
|
||||
public void loadAgainToVAO() {
|
||||
createVAO();
|
||||
GL30.glBindVertexArray(this.vaoID);
|
||||
LOGGER.trace("push VAO: [" + getId() + "] '" + getName() + "'");
|
||||
if (this.indices != null) {
|
||||
Log.verbose("Set indices");
|
||||
LOGGER.trace("Set indices");
|
||||
bindIndicesBuffer(this.indices);
|
||||
}
|
||||
if (this.positions != null) {
|
||||
Log.verbose("Set positions");
|
||||
storeDataInAttributeList(0, 3, this.positions);
|
||||
LOGGER.trace("Set positions");
|
||||
storeDataInAttributeList(ResourceVirtualArrayObject.INDICE_VBO_POSITIONS, 3, this.positions);
|
||||
}
|
||||
if (this.textureCoordinates != null) {
|
||||
Log.verbose("Set textureCoordinates");
|
||||
storeDataInAttributeList(1, 2, this.textureCoordinates);
|
||||
LOGGER.trace("Set textureCoordinates");
|
||||
storeDataInAttributeList(ResourceVirtualArrayObject.INDICE_VBO_TEXTURE_COORDINATES, 2,
|
||||
this.textureCoordinates);
|
||||
}
|
||||
if (this.normals != null) {
|
||||
Log.verbose("Set normals");
|
||||
storeDataInAttributeList(2, 3, this.normals);
|
||||
LOGGER.trace("Set normals");
|
||||
storeDataInAttributeList(ResourceVirtualArrayObject.INDICE_VBO_NORMALS, 3, this.normals);
|
||||
}
|
||||
if (this.colors != null) {
|
||||
Log.verbose("Set colors");
|
||||
storeDataInAttributeList(3, 4, this.colors);
|
||||
LOGGER.trace("Set colors");
|
||||
storeDataInAttributeList(ResourceVirtualArrayObject.INDICE_VBO_COLORS, 4, this.colors);
|
||||
}
|
||||
unbindVAO();
|
||||
}
|
||||
|
||||
public void loadToVAO() {
|
||||
GL30.glBindVertexArray(this.vaoID);
|
||||
createVAO();
|
||||
LOGGER.trace("push VAO: [" + getId() + "] '" + getName() + "'");
|
||||
if (this.indices != null) {
|
||||
Log.verbose("Set indices");
|
||||
LOGGER.trace("Set indices");
|
||||
bindIndicesBuffer(this.indices);
|
||||
}
|
||||
if (this.positions != null) {
|
||||
Log.verbose("Set positions");
|
||||
storeDataInAttributeList(0, 3, this.positions);
|
||||
LOGGER.trace("Set positions");
|
||||
storeDataInAttributeList(ResourceVirtualArrayObject.INDICE_VBO_POSITIONS, 3, this.positions);
|
||||
}
|
||||
if (this.textureCoordinates != null) {
|
||||
Log.verbose("Set textureCoordinates");
|
||||
storeDataInAttributeList(1, 2, this.textureCoordinates);
|
||||
LOGGER.trace("Set textureCoordinates");
|
||||
storeDataInAttributeList(ResourceVirtualArrayObject.INDICE_VBO_TEXTURE_COORDINATES, 2,
|
||||
this.textureCoordinates);
|
||||
}
|
||||
if (this.normals != null) {
|
||||
Log.verbose("Set normals");
|
||||
storeDataInAttributeList(2, 3, this.normals);
|
||||
LOGGER.trace("Set normals");
|
||||
storeDataInAttributeList(ResourceVirtualArrayObject.INDICE_VBO_NORMALS, 3, this.normals);
|
||||
}
|
||||
if (this.colors != null) {
|
||||
Log.verbose("Set colors");
|
||||
storeDataInAttributeList(3, 4, this.colors);
|
||||
LOGGER.trace("Set colors");
|
||||
storeDataInAttributeList(ResourceVirtualArrayObject.INDICE_VBO_COLORS, 4, this.colors);
|
||||
}
|
||||
unbindVAO();
|
||||
}
|
||||
@ -280,12 +299,16 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
}
|
||||
|
||||
public void render(final RenderMode mode) {
|
||||
Log.verbose("request rendering indices : " + this.vertexCount);
|
||||
LOGGER.trace("request rendering indices : " + this.vertexCount);
|
||||
OpenGL.drawElements(mode, this.vertexCount);
|
||||
}
|
||||
|
||||
public void render(final RenderMode mode, final int start, final int stop) {
|
||||
OpenGL.drawArrays(mode, start, stop);
|
||||
}
|
||||
|
||||
public void renderArrays(final RenderMode mode) {
|
||||
Log.verbose("request rendering direct : " + this.vertexCount);
|
||||
LOGGER.trace("request rendering direct : " + this.vertexCount);
|
||||
OpenGL.drawArrays(mode, 0, this.vertexCount);
|
||||
}
|
||||
|
||||
@ -297,12 +320,17 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
this.colors = colors;
|
||||
}
|
||||
|
||||
public void setColors(final List<Color> colors) {
|
||||
setColors(colors.toArray(Color[]::new));
|
||||
|
||||
}
|
||||
|
||||
public void setIndices(final int[] indices) {
|
||||
this.indices = indices;
|
||||
}
|
||||
|
||||
public void setIndices(final List<Integer> indices) {
|
||||
this.indices = convertIntegers(indices);
|
||||
this.indices = ResourceVirtualArrayObject.convertIntegers(indices);
|
||||
this.vertexCount = this.indices.length;
|
||||
}
|
||||
|
||||
@ -310,6 +338,10 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
this.normals = normals;
|
||||
}
|
||||
|
||||
public void setNormals(final List<Vector3f> normals) {
|
||||
setNormals(normals.toArray(Vector3f[]::new));
|
||||
}
|
||||
|
||||
public void setNormals(final Vector3f[] normals) {
|
||||
this.normals = normals;
|
||||
}
|
||||
@ -318,6 +350,11 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
this.positions = positions;
|
||||
}
|
||||
|
||||
public void setPosition(final List<Vector3f> outPosition) {
|
||||
setPosition(outPosition.toArray(Vector3f[]::new));
|
||||
|
||||
}
|
||||
|
||||
public void setPosition(final Vector3f[] positions) {
|
||||
this.positions = positions;
|
||||
}
|
||||
@ -326,6 +363,10 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
this.textureCoordinates = textureCoordinates;
|
||||
}
|
||||
|
||||
public void setTextureCoordinate(final List<Vector2f> outTexturePosition) {
|
||||
setTextureCoordinate(outTexturePosition.toArray(Vector2f[]::new));
|
||||
}
|
||||
|
||||
public void setTextureCoordinate(final Vector2f[] textureCoordinates) {
|
||||
this.textureCoordinates = textureCoordinates;
|
||||
}
|
||||
@ -343,18 +384,18 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
usage = Usage.streamDraw;
|
||||
}
|
||||
// select the buffer to set data inside it ...
|
||||
if (data instanceof float[]buffer) {
|
||||
if (data instanceof final float[] buffer) {
|
||||
OpenGL.bufferData(buffer, usage);
|
||||
} else if (data instanceof int[]buffer) {
|
||||
} else if (data instanceof final int[] buffer) {
|
||||
OpenGL.bufferData(buffer, usage);
|
||||
} else if (data instanceof Vector2f[]buffer) {
|
||||
} else if (data instanceof final Vector2f[] buffer) {
|
||||
OpenGL.bufferData(buffer, usage);
|
||||
} else if (data instanceof Vector3f[]buffer) {
|
||||
} else if (data instanceof final Vector3f[] buffer) {
|
||||
OpenGL.bufferData(buffer, usage);
|
||||
} else if (data instanceof Color[]buffer) {
|
||||
} else if (data instanceof final Color[] buffer) {
|
||||
OpenGL.bufferData(buffer, usage);
|
||||
} else {
|
||||
Log.error("Not managed VBO model : " + data.getClass().getCanonicalName());
|
||||
LOGGER.error("Not managed VBO model : " + data.getClass().getCanonicalName());
|
||||
}
|
||||
GL20.glVertexAttribPointer(attributeNumber, coordinateSize, GL11.GL_FLOAT, false, 0, 0);
|
||||
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
|
||||
@ -365,22 +406,22 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
return;
|
||||
}
|
||||
if (this.positions != null) {
|
||||
GL20.glDisableVertexAttribArray(INDICE_VBO_POSITIONS);
|
||||
GL20.glDisableVertexAttribArray(ResourceVirtualArrayObject.INDICE_VBO_POSITIONS);
|
||||
}
|
||||
if (this.textureCoordinates != null) {
|
||||
GL20.glDisableVertexAttribArray(INDICE_VBO_TEXTURE_COORDINATES);
|
||||
GL20.glDisableVertexAttribArray(ResourceVirtualArrayObject.INDICE_VBO_TEXTURE_COORDINATES);
|
||||
}
|
||||
if (this.normals != null) {
|
||||
GL20.glDisableVertexAttribArray(INDICE_VBO_NORMALS);
|
||||
GL20.glDisableVertexAttribArray(ResourceVirtualArrayObject.INDICE_VBO_NORMALS);
|
||||
}
|
||||
if (this.colors != null) {
|
||||
GL20.glDisableVertexAttribArray(INDICE_VBO_COLORS);
|
||||
GL20.glDisableVertexAttribArray(ResourceVirtualArrayObject.INDICE_VBO_COLORS);
|
||||
}
|
||||
GL30.glBindVertexArray(0);
|
||||
}
|
||||
|
||||
private void unbindVAO() {
|
||||
Log.verbose("Unbind VAO ...");
|
||||
LOGGER.trace("Unbind VAO ...");
|
||||
GL30.glBindVertexArray(0);
|
||||
}
|
||||
|
||||
@ -389,21 +430,22 @@ public class ResourceVirtualArrayObject extends Resource {
|
||||
*/
|
||||
@Override
|
||||
public boolean updateContext() {
|
||||
Log.verbose(" Start: [" + getId() + "] '" + getName() + "' (size=" + this.vertexCount + ") ********************************");
|
||||
LOGGER.trace(" Start: [" + getId() + "] '" + getName() + "' (size=" + this.vertexCount
|
||||
+ ") ********************************");
|
||||
if (!this.exist) {
|
||||
Log.error(" ==> ALLOCATE new handle");
|
||||
LOGGER.trace(" ==> ALLOCATE new handle");
|
||||
// Allocate and assign a Vertex Array Object to our handle
|
||||
loadToVAO();
|
||||
} else {
|
||||
// Update VAO (only for dynamic:
|
||||
if (!this.dynamic) {
|
||||
Log.error(" Request update a VAO with a static buffer !!!" + this.name);
|
||||
LOGGER.error(" Request update a VAO with a static buffer !!!" + this.name);
|
||||
}
|
||||
loadAgainToVAO();
|
||||
|
||||
}
|
||||
this.exist = true;
|
||||
Log.verbose(" Stop: [" + getId() + "] '" + getName() + "'");
|
||||
LOGGER.trace(" Stop: [" + getId() + "] '" + getName() + "'");
|
||||
return true;
|
||||
}
|
||||
|
@ -12,39 +12,41 @@ import org.atriasoft.etk.math.Vector2f;
|
||||
import org.atriasoft.etk.math.Vector3f;
|
||||
import org.atriasoft.gale.backend3d.OpenGL;
|
||||
import org.atriasoft.gale.backend3d.OpenGL.Usage;
|
||||
import org.atriasoft.gale.internal.Log;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* ResourceVirtualBufferObject is a specific resources for opengl, this load the data directly in the graphic card ad keep these inside
|
||||
*/
|
||||
public class ResourceVirtualBufferObject extends Resource {
|
||||
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(ResourceVirtualBufferObject.class);
|
||||
|
||||
public static ResourceVirtualBufferObject create(final int count) {
|
||||
return new ResourceVirtualBufferObject(count);
|
||||
}
|
||||
|
||||
|
||||
private boolean exist = false; //!< This data is available in the Graphic card
|
||||
private final int[] vbo; //!< openGl ID of this VBO
|
||||
private final Object[] buffer; //!< data that is available in the VBO system ...
|
||||
|
||||
|
||||
/**
|
||||
* Constructor of this VBO.
|
||||
* @param accesMode Access mode : ???
|
||||
*/
|
||||
protected ResourceVirtualBufferObject(final int number) {
|
||||
super();
|
||||
this.vbo = new int[number]; // 0
|
||||
this.buffer = new Object[number];
|
||||
Log.debug("OGL : load VBO count=\"" + number + "\"");
|
||||
LOGGER.debug("OGL : load VBO count=\"" + number + "\"");
|
||||
this.resourceLevel = 3;
|
||||
}
|
||||
|
||||
|
||||
public int bufferSize(final int vboidcoord) {
|
||||
if (this.buffer[vboidcoord] != null) {
|
||||
// select the buffer to set data inside it ...
|
||||
if (this.buffer[vboidcoord] instanceof float[]) {
|
||||
return ((float[]) (this.buffer[vboidcoord])).length;
|
||||
} else if (this.buffer[vboidcoord] instanceof int[]) {
|
||||
}
|
||||
if (this.buffer[vboidcoord] instanceof int[]) {
|
||||
return ((int[]) (this.buffer[vboidcoord])).length;
|
||||
} else if (this.buffer[vboidcoord] instanceof Vector2f[]) {
|
||||
return ((Vector2f[]) (this.buffer[vboidcoord])).length;
|
||||
@ -53,41 +55,42 @@ public class ResourceVirtualBufferObject extends Resource {
|
||||
} else if (this.buffer[vboidcoord] instanceof Color[]) {
|
||||
return ((Color[]) (this.buffer[vboidcoord])).length;
|
||||
} else {
|
||||
Log.error("Not managed VBO model : " + this.buffer[vboidcoord].getClass().getCanonicalName());
|
||||
LOGGER.error("Not managed VBO model : " + this.buffer[vboidcoord].getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void cleanUp() {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* clear buffers
|
||||
*/
|
||||
public void clear() {
|
||||
Log.verbose(" Clear: [" + getId() + "] '" + getName() + "' (size=" + this.buffer.length + ")");
|
||||
LOGGER.trace(" Clear: [" + getId() + "] '" + getName() + "' (size=" + this.buffer.length + ")");
|
||||
// DO not clear the this.vbo indexed in the graphic cards ...
|
||||
Arrays.fill(this.buffer, null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send the data to the graphic card.
|
||||
*/
|
||||
public synchronized void flush() {
|
||||
// request to the manager to be call at the next update ...
|
||||
getManager().update(this);
|
||||
Log.verbose("Request flush of VBO: [" + getId() + "] '" + getName() + "'");
|
||||
Resource.getManager().update(this);
|
||||
LOGGER.trace("Request flush of VBO: [" + getId() + "] '" + getName() + "'");
|
||||
}
|
||||
|
||||
|
||||
public int getElementSize(final int index) {
|
||||
if (this.buffer[index] != null) {
|
||||
// select the buffer to set data inside it ...
|
||||
if (this.buffer[index] instanceof float[]) {
|
||||
return 1;
|
||||
} else if (this.buffer[index] instanceof int[]) {
|
||||
}
|
||||
if (this.buffer[index] instanceof int[]) {
|
||||
return 1;
|
||||
} else if (this.buffer[index] instanceof Vector2f[]) {
|
||||
return 2;
|
||||
@ -96,12 +99,12 @@ public class ResourceVirtualBufferObject extends Resource {
|
||||
} else if (this.buffer[index] instanceof Color[]) {
|
||||
return 4;
|
||||
} else {
|
||||
Log.error("Not managed VBO model : " + this.buffer[index].getClass().getCanonicalName());
|
||||
LOGGER.error("Not managed VBO model : " + this.buffer[index].getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the real openGL ID.
|
||||
* @return the Ogl id reference of this VBO.
|
||||
@ -109,7 +112,7 @@ public class ResourceVirtualBufferObject extends Resource {
|
||||
public int getOpenGlId(final int id) {
|
||||
return this.vbo[id];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Relode the shader from the file. used when a request of resouces reload is done.
|
||||
* @note this is really usefull when we tested the new themes or shader developpements.
|
||||
@ -119,7 +122,7 @@ public class ResourceVirtualBufferObject extends Resource {
|
||||
removeContext();
|
||||
updateContext();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* remove the data from the opengl context.
|
||||
*/
|
||||
@ -130,7 +133,7 @@ public class ResourceVirtualBufferObject extends Resource {
|
||||
this.exist = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Special android spec! It inform us that all context is removed and after notify us...
|
||||
*/
|
||||
@ -139,56 +142,58 @@ public class ResourceVirtualBufferObject extends Resource {
|
||||
this.exist = false;
|
||||
Arrays.fill(this.vbo, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the data from the graphic card.
|
||||
*/
|
||||
public void retreiveData() {
|
||||
Log.error("TODO ... ");
|
||||
LOGGER.error("TODO ... ");
|
||||
}
|
||||
|
||||
|
||||
public void setVboData(final int vboId, final Color[] data) {
|
||||
this.buffer[vboId] = data;
|
||||
}
|
||||
|
||||
|
||||
public void setVboData(final int vboId, final float[] data) {
|
||||
this.buffer[vboId] = data;
|
||||
}
|
||||
|
||||
|
||||
public void setVboData(final int vboId, final int[] data) {
|
||||
this.buffer[vboId] = data;
|
||||
}
|
||||
|
||||
|
||||
public void setVboData(final int vboId, final Vector2f[] data) {
|
||||
this.buffer[vboId] = data;
|
||||
}
|
||||
|
||||
|
||||
public void setVboData(final int vboId, final Vector3f[] data) {
|
||||
this.buffer[vboId] = data;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This load/reload the data in the opengl context, needed when removed previously.
|
||||
*/
|
||||
@Override
|
||||
public synchronized boolean updateContext() {
|
||||
Log.warning("updateContext (VBO Start: [" + getId() + "] '" + getName() + "' (size=" + this.buffer.length + ")");
|
||||
LOGGER.trace(
|
||||
"updateContext (VBO Start: [" + getId() + "] '" + getName() + "' (size=" + this.buffer.length + ")");
|
||||
/*
|
||||
if (lock.tryLock() == false) {
|
||||
//Lock error ==> try later ...
|
||||
Log.warning(" ==> Lock error on VBO");
|
||||
LOGGER.warn(" ==> Lock error on VBO");
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
if (!this.exist) {
|
||||
Log.debug(" ==> ALLOCATE new handle");
|
||||
LOGGER.debug(" ==> ALLOCATE new handle");
|
||||
// Allocate and assign a Vertex Array Object to our handle
|
||||
OpenGL.genBuffers(this.vbo);
|
||||
}
|
||||
this.exist = true;
|
||||
for (int iii = 0; iii < this.vbo.length; iii++) {
|
||||
if (this.buffer[iii] != null) {
|
||||
Log.verbose("VBO : add [" + getId() + "]=" + this.buffer[iii].getClass().getCanonicalName() + "*sizeof(float) OGl_Id=" + this.vbo[iii]);
|
||||
LOGGER.trace("VBO : add [" + getId() + "]=" + this.buffer[iii].getClass().getCanonicalName()
|
||||
+ "*sizeof(float) OGl_Id=" + this.vbo[iii]);
|
||||
OpenGL.bindBuffer(this.vbo[iii]);
|
||||
// select the buffer to set data inside it ...
|
||||
if (this.buffer[iii] instanceof float[]) {
|
||||
@ -202,13 +207,13 @@ public class ResourceVirtualBufferObject extends Resource {
|
||||
} else if (this.buffer[iii] instanceof Color[]) {
|
||||
OpenGL.bufferData((Color[]) (this.buffer[iii]), Usage.streamDraw);
|
||||
} else {
|
||||
Log.error("Not managed VBO model : " + this.buffer[iii].getClass().getCanonicalName());
|
||||
LOGGER.error("Not managed VBO model : " + this.buffer[iii].getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
}
|
||||
// un-bind it to permet to have no error in the next display ...
|
||||
OpenGL.unbindBuffer();
|
||||
Log.verbose(" Stop: [" + getId() + "] '" + getName() + "'");
|
||||
LOGGER.trace(" Stop: [" + getId() + "] '" + getName() + "'");
|
||||
return true;
|
||||
}
|
||||
}
|
@ -14,23 +14,26 @@ import org.atriasoft.gale.key.KeyStatus;
|
||||
import org.atriasoft.gale.key.KeyType;
|
||||
import org.atriasoft.gale.resource.ResourceProgram;
|
||||
import org.atriasoft.gale.resource.ResourceVirtualArrayObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class Sample1Application extends GaleApplication {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(Sample1Application.class);
|
||||
//float[] vertices = { 0.2f, 0.1f, 0.0f, 0.3f, 0.4f, 0.0f, 0.1f, 0.4f, 0.0f };
|
||||
private static final float[] VERTICES = { -0.5f, -0.5f, -1.0f, 0.0f, 0.5f, -1.0f, 0.5f, -0.5f, -1.0f };
|
||||
private static final float[] COLORS = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, };
|
||||
private static final int[] INDICES = { 0, 1, 2 };
|
||||
|
||||
|
||||
private static final boolean TEST_STATIC_MODE = false;
|
||||
|
||||
|
||||
private ResourceProgram oGLprogram;
|
||||
private int oGLMatrixTransformation;
|
||||
private int oGLMatrixProjection;
|
||||
private int oGLMatrixView;
|
||||
|
||||
|
||||
private float angle;
|
||||
private ResourceVirtualArrayObject verticesVBO;
|
||||
|
||||
|
||||
@Override
|
||||
public void onCreate(final GaleContext context) {
|
||||
//setSize(new Vector2f(800, 600));
|
||||
@ -41,7 +44,7 @@ public class Sample1Application extends GaleApplication {
|
||||
this.oGLMatrixProjection = this.oGLprogram.getUniform("in_matrixProjection");
|
||||
this.oGLMatrixView = this.oGLprogram.getUniform("in_matrixView");
|
||||
}
|
||||
|
||||
|
||||
// this is the properties of the buffer requested : "r"/"w" + "-" + buffer type "f"=float "i"=integer
|
||||
if (TEST_STATIC_MODE) {
|
||||
this.verticesVBO = ResourceVirtualArrayObject.create(VERTICES, COLORS, INDICES);
|
||||
@ -52,54 +55,54 @@ public class Sample1Application extends GaleApplication {
|
||||
this.verticesVBO.setName("[VBO] of basic SAMPLE");
|
||||
// update all the VBO elements ...
|
||||
this.verticesVBO.flush();
|
||||
Log.info("==> Init APPL (END)");
|
||||
LOGGER.info("==> Init APPL (END)");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onDraw(final GaleContext context) {
|
||||
this.angle += 0.01;
|
||||
//Log.info("==> appl Draw ...");
|
||||
Vector2f size = getSize();
|
||||
//LOGGER.info("==> appl Draw ...");
|
||||
final Vector2f size = getSize();
|
||||
// set the basic openGL view port: (position drawed in the windows)
|
||||
OpenGL.setViewPort(Vector2f.ZERO, size);
|
||||
// Clear all the stacked matrix ...
|
||||
OpenGL.setBasicMatrix(Matrix4f.IDENTITY);
|
||||
// clear background
|
||||
Color bgColor = Color.CYAN;
|
||||
final Color bgColor = Color.CYAN;
|
||||
OpenGL.clearColor(bgColor);
|
||||
// real clear request:
|
||||
OpenGL.clear(OpenGL.ClearFlag.clearFlag_colorBuffer);
|
||||
// create a local matrix environment.
|
||||
OpenGL.push();
|
||||
|
||||
Matrix4f tmpProjection = Matrix4f.createMatrixOrtho(-getAspectRatio(), getAspectRatio(), -1, 1, -50, 50);
|
||||
|
||||
final Matrix4f tmpProjection = Matrix4f.createMatrixOrtho(-getAspectRatio(), getAspectRatio(), -1, 1, -50, 50);
|
||||
//Matrix4f tmpProjection = Matrix4f.IDENTITY;
|
||||
// set internal matrix system:
|
||||
OpenGL.setMatrix(tmpProjection);
|
||||
if (this.oGLprogram == null) {
|
||||
Log.info("No shader ...");
|
||||
LOGGER.info("No shader ...");
|
||||
return;
|
||||
}
|
||||
//EWOL_DEBUG(" display " + this.coord.size() + " elements" );
|
||||
this.oGLprogram.use();
|
||||
|
||||
|
||||
// set Matrix: translation/positionMatrix
|
||||
Matrix4f projectionMatrix = tmpProjection; //OpenGL.getMatrix();
|
||||
Matrix4f transforamtionMatrix = Matrix4f.createMatrixRotate(new Vector3f(0, 0, 1), this.angle);
|
||||
Matrix4f viewMatrix = OpenGL.getCameraMatrix();
|
||||
final Matrix4f projectionMatrix = tmpProjection; //OpenGL.getMatrix();
|
||||
final Matrix4f transforamtionMatrix = Matrix4f.createMatrixRotate(new Vector3f(0, 0, 1), this.angle);
|
||||
final Matrix4f viewMatrix = OpenGL.getCameraMatrix();
|
||||
//Matrix4f tmpMatrix = projMatrix * camMatrix;
|
||||
|
||||
|
||||
this.verticesVBO.bindForRendering();
|
||||
this.oGLprogram.uniformMatrix(this.oGLMatrixView, viewMatrix);
|
||||
this.oGLprogram.uniformMatrix(this.oGLMatrixProjection, projectionMatrix);
|
||||
// Change the position for each element with the same pipeline you need to render ...
|
||||
this.oGLprogram.uniformMatrix(this.oGLMatrixTransformation, transforamtionMatrix);
|
||||
|
||||
|
||||
// Request the draw of the elements:
|
||||
if (TEST_STATIC_MODE) {
|
||||
this.verticesVBO.render(OpenGL.RenderMode.triangle);
|
||||
this.verticesVBO.render(OpenGL.RenderMode.TRIANGLE);
|
||||
} else {
|
||||
this.verticesVBO.renderArrays(OpenGL.RenderMode.triangle);
|
||||
this.verticesVBO.renderArrays(OpenGL.RenderMode.TRIANGLE);
|
||||
}
|
||||
this.verticesVBO.unBindForRendering();
|
||||
this.oGLprogram.unUse();
|
||||
@ -107,7 +110,7 @@ public class Sample1Application extends GaleApplication {
|
||||
OpenGL.pop();
|
||||
// mark to redraw the screen ==> demo only....
|
||||
markDrawingIsNeeded();
|
||||
|
||||
|
||||
if (!TEST_STATIC_MODE) {
|
||||
this.verticesVBO.clear();
|
||||
this.verticesVBO.setPosition(VERTICES);
|
||||
@ -116,20 +119,29 @@ public class Sample1Application extends GaleApplication {
|
||||
this.verticesVBO.flush();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onKeyboard(final KeySpecial special, final KeyKeyboard type, final Character value, final KeyStatus state) {
|
||||
Log.info("Keyboard event: special=" + special);
|
||||
Log.info(" type=" + type);
|
||||
Log.info(" value='" + value + "'");
|
||||
Log.info(" state=" + state);
|
||||
public void onKeyboard(
|
||||
final KeySpecial special,
|
||||
final KeyKeyboard type,
|
||||
final Character value,
|
||||
final KeyStatus state) {
|
||||
LOGGER.info("Keyboard event: special=" + special);
|
||||
LOGGER.info(" type=" + type);
|
||||
LOGGER.info(" value='" + value + "'");
|
||||
LOGGER.info(" state=" + state);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onPointer(final KeySpecial special, final KeyType type, final int pointerID, final Vector2f pos, final KeyStatus state) {
|
||||
// Log.info("input event: type=" + type);
|
||||
// Log.info(" id=" + pointerID);
|
||||
// Log.info(" pos=" + pos);
|
||||
// Log.info(" state=" + state);
|
||||
public void onPointer(
|
||||
final KeySpecial special,
|
||||
final KeyType type,
|
||||
final int pointerID,
|
||||
final Vector2f pos,
|
||||
final KeyStatus state) {
|
||||
// LOGGER.info("input event: type=" + type);
|
||||
// LOGGER.info(" id=" + pointerID);
|
||||
// LOGGER.info(" pos=" + pos);
|
||||
// LOGGER.info(" state=" + state);
|
||||
}
|
||||
}
|
@ -15,8 +15,11 @@ import org.atriasoft.gale.key.KeyType;
|
||||
import org.atriasoft.gale.resource.ResourceProgram;
|
||||
import org.atriasoft.gale.resource.ResourceTexture;
|
||||
import org.atriasoft.gale.resource.ResourceVirtualArrayObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class Sample2Application extends GaleApplication {
|
||||
static final Logger LOGGER = LoggerFactory.getLogger(Sample2Application.class);
|
||||
private ResourceProgram oGLprogram;
|
||||
private int oGLMatrixTransformation;
|
||||
private int oGLMatrixProjection;
|
||||
@ -26,7 +29,7 @@ public class Sample2Application extends GaleApplication {
|
||||
private float angleZ = 0;
|
||||
private ResourceVirtualArrayObject verticesVBO;
|
||||
private ResourceTexture texture;
|
||||
|
||||
|
||||
@Override
|
||||
public void onCreate(final GaleContext context) {
|
||||
setSize(new Vector2f(800, 600));
|
||||
@ -37,88 +40,88 @@ public class Sample2Application extends GaleApplication {
|
||||
this.oGLMatrixView = this.oGLprogram.getUniform("in_matrixView");
|
||||
}
|
||||
//@formatter:off
|
||||
float[] vertices = {
|
||||
-0.5f,0.5f,-0.5f,
|
||||
-0.5f,-0.5f,-0.5f,
|
||||
0.5f,-0.5f,-0.5f,
|
||||
0.5f,0.5f,-0.5f,
|
||||
|
||||
-0.5f,0.5f,0.5f,
|
||||
-0.5f,-0.5f,0.5f,
|
||||
0.5f,-0.5f,0.5f,
|
||||
0.5f,0.5f,0.5f,
|
||||
|
||||
0.5f,0.5f,-0.5f,
|
||||
0.5f,-0.5f,-0.5f,
|
||||
0.5f,-0.5f,0.5f,
|
||||
0.5f,0.5f,0.5f,
|
||||
|
||||
-0.5f,0.5f,-0.5f,
|
||||
-0.5f,-0.5f,-0.5f,
|
||||
-0.5f,-0.5f,0.5f,
|
||||
final float[] vertices = {
|
||||
-0.5f,0.5f,-0.5f,
|
||||
-0.5f,-0.5f,-0.5f,
|
||||
0.5f,-0.5f,-0.5f,
|
||||
0.5f,0.5f,-0.5f,
|
||||
|
||||
-0.5f,0.5f,0.5f,
|
||||
|
||||
-0.5f,-0.5f,0.5f,
|
||||
0.5f,-0.5f,0.5f,
|
||||
0.5f,0.5f,0.5f,
|
||||
|
||||
0.5f,0.5f,-0.5f,
|
||||
0.5f,-0.5f,-0.5f,
|
||||
0.5f,-0.5f,0.5f,
|
||||
0.5f,0.5f,0.5f,
|
||||
|
||||
-0.5f,0.5f,-0.5f,
|
||||
-0.5f,-0.5f,-0.5f,
|
||||
-0.5f,-0.5f,0.5f,
|
||||
-0.5f,0.5f,0.5f,
|
||||
|
||||
-0.5f,0.5f,0.5f,
|
||||
-0.5f,0.5f,-0.5f,
|
||||
0.5f,0.5f,-0.5f,
|
||||
0.5f,0.5f,0.5f,
|
||||
|
||||
|
||||
-0.5f,-0.5f,0.5f,
|
||||
-0.5f,-0.5f,-0.5f,
|
||||
0.5f,-0.5f,-0.5f,
|
||||
0.5f,-0.5f,0.5f
|
||||
|
||||
|
||||
};
|
||||
|
||||
float[] textureCoords = {
|
||||
0,0, 0,1, 1,1, 1,0,
|
||||
0,0, 0,1, 1,1, 1,0,
|
||||
|
||||
final float[] textureCoords = {
|
||||
0,0, 0,1, 1,1, 1,0,
|
||||
0,0, 0,1, 1,1, 1,0,
|
||||
0,0, 0,1, 1,1, 1,0,
|
||||
0,0, 0,1, 1,1, 1,0,
|
||||
0,0, 0,1, 1,1, 1,0,
|
||||
0,0, 0,1, 1,1, 1,0
|
||||
};
|
||||
|
||||
int[] indices = {
|
||||
1,0,3, 1,3,2,
|
||||
4,5,7, 7,5,6,
|
||||
|
||||
final int[] indices = {
|
||||
1,0,3, 1,3,2,
|
||||
4,5,7, 7,5,6,
|
||||
9,8,11, 9,11,10,
|
||||
12,13,15, 15,13,14,
|
||||
12,13,15, 15,13,14,
|
||||
17,16,19, 17,19,18,
|
||||
20,21,23, 23,21,22
|
||||
|
||||
};
|
||||
//@formatter:on
|
||||
|
||||
|
||||
// this is the properties of the buffer requested : "r"/"w" + "-" + buffer type "f"=float "i"=integer
|
||||
this.verticesVBO = ResourceVirtualArrayObject.create(vertices, textureCoords, null, indices);
|
||||
// TO facilitate some debugs we add a name of the VBO:
|
||||
this.verticesVBO.setName("[VBO] of basic SAMPLE");
|
||||
// update all the VBO elements ...
|
||||
this.verticesVBO.flush();
|
||||
|
||||
|
||||
this.texture = ResourceTexture.createFromPng(new Uri("DATA", "tree_sample.png"));
|
||||
if (this.texture == null) {
|
||||
Log.error("can not instanciate Texture ...");
|
||||
LOGGER.error("can not instanciate Texture ...");
|
||||
return;
|
||||
}
|
||||
Log.info("==> Init APPL (END)");
|
||||
LOGGER.info("==> Init APPL (END)");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onDraw(final GaleContext context) {
|
||||
this.angleX += 0.001;
|
||||
this.angleY += 0.005;
|
||||
this.angleZ += 0.01;
|
||||
//Log.info("==> appl Draw ...");
|
||||
Vector2f size = getSize();
|
||||
//Log.info("==> Windows size = " + size);
|
||||
//LOGGER.info("==> appl Draw ...");
|
||||
final Vector2f size = getSize();
|
||||
//LOGGER.info("==> Windows size = " + size);
|
||||
// set the basic openGL view port: (position drawed in the windows)
|
||||
OpenGL.setViewPort(new Vector2f(0, 0), size);
|
||||
// Clear all the stacked matrix ...
|
||||
OpenGL.setBasicMatrix(Matrix4f.IDENTITY);
|
||||
// clear background
|
||||
Color bgColor = new Color(0.0f, 1.0f, 1.0f, 0.75f);
|
||||
final Color bgColor = new Color(0.0f, 1.0f, 1.0f, 0.75f);
|
||||
OpenGL.enable(OpenGL.Flag.flag_depthTest);
|
||||
OpenGL.clearColor(bgColor);
|
||||
// real clear request:
|
||||
@ -126,26 +129,30 @@ public class Sample2Application extends GaleApplication {
|
||||
OpenGL.clear(OpenGL.ClearFlag.clearFlag_depthBuffer);
|
||||
// create a local matrix environnement.
|
||||
OpenGL.push();
|
||||
|
||||
|
||||
//Matrix4f tmpProjection = Matrix4f.createMatrixOrtho(-getAspectRatio(), getAspectRatio(), -1, 1, -50, 50);
|
||||
Matrix4f tmpProjection = Matrix4f.createMatrixPerspective(1.30f, getAspectRatio(), 1, 50);
|
||||
final Matrix4f tmpProjection = Matrix4f.createMatrixPerspective(1.30f, getAspectRatio(), 1, 50);
|
||||
// set internal matrix system:
|
||||
OpenGL.setMatrix(tmpProjection);
|
||||
if (this.oGLprogram == null) {
|
||||
Log.info("No shader ...");
|
||||
LOGGER.info("No shader ...");
|
||||
return;
|
||||
}
|
||||
//EWOL_DEBUG(" display " + this.coord.size() + " elements" );
|
||||
this.oGLprogram.use();
|
||||
|
||||
|
||||
// set Matrix : translation/positionMatrix
|
||||
Matrix4f projectionMatrix = tmpProjection; //OpenGL.getMatrix();
|
||||
final Matrix4f projectionMatrix = tmpProjection; //OpenGL.getMatrix();
|
||||
Matrix4f transforamtionMatrix = Matrix4f.IDENTITY;
|
||||
transforamtionMatrix = transforamtionMatrix.multiply(Matrix4f.createMatrixTranslate(new Vector3f(0, 0, -1)));
|
||||
transforamtionMatrix = transforamtionMatrix.multiply(Matrix4f.createMatrixRotate(new Vector3f(1, 0, 0), this.angleX));
|
||||
transforamtionMatrix = transforamtionMatrix.multiply(Matrix4f.createMatrixRotate(new Vector3f(0, 1, 0), this.angleY));
|
||||
transforamtionMatrix = transforamtionMatrix.multiply(Matrix4f.createMatrixRotate(new Vector3f(0, 0, 1), this.angleZ));
|
||||
Matrix4f viewMatrix = OpenGL.getCameraMatrix().multiply(Matrix4f.createMatrixTranslate(new Vector3f(0, 0, -2)));
|
||||
transforamtionMatrix = transforamtionMatrix
|
||||
.multiply(Matrix4f.createMatrixRotate(new Vector3f(1, 0, 0), this.angleX));
|
||||
transforamtionMatrix = transforamtionMatrix
|
||||
.multiply(Matrix4f.createMatrixRotate(new Vector3f(0, 1, 0), this.angleY));
|
||||
transforamtionMatrix = transforamtionMatrix
|
||||
.multiply(Matrix4f.createMatrixRotate(new Vector3f(0, 0, 1), this.angleZ));
|
||||
final Matrix4f viewMatrix = OpenGL.getCameraMatrix()
|
||||
.multiply(Matrix4f.createMatrixTranslate(new Vector3f(0, 0, -2)));
|
||||
//Matrix4f tmpMatrix = projMatrix * camMatrix;
|
||||
this.verticesVBO.bindForRendering();
|
||||
this.oGLprogram.uniformMatrix(this.oGLMatrixView, viewMatrix);
|
||||
@ -156,8 +163,8 @@ public class Sample2Application extends GaleApplication {
|
||||
// update of flags is done asyncronously ==> need update befor drawing...
|
||||
OpenGL.updateAllFlags();
|
||||
// Request the draw od the elements:
|
||||
this.verticesVBO.render(OpenGL.RenderMode.triangle);
|
||||
|
||||
this.verticesVBO.render(OpenGL.RenderMode.TRIANGLE);
|
||||
|
||||
this.verticesVBO.unBindForRendering();
|
||||
this.texture.unBindForRendering();
|
||||
this.oGLprogram.unUse();
|
||||
@ -165,20 +172,29 @@ public class Sample2Application extends GaleApplication {
|
||||
OpenGL.pop();
|
||||
markDrawingIsNeeded();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onKeyboard(final KeySpecial special, final KeyKeyboard type, final Character value, final KeyStatus state) {
|
||||
Log.info("Keyboard event: special=" + special);
|
||||
Log.info(" type=" + type);
|
||||
Log.info(" value='" + value + "'");
|
||||
Log.info(" state=" + state);
|
||||
public void onKeyboard(
|
||||
final KeySpecial special,
|
||||
final KeyKeyboard type,
|
||||
final Character value,
|
||||
final KeyStatus state) {
|
||||
LOGGER.info("Keyboard event: special=" + special);
|
||||
LOGGER.info(" type=" + type);
|
||||
LOGGER.info(" value='" + value + "'");
|
||||
LOGGER.info(" state=" + state);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onPointer(final KeySpecial special, final KeyType type, final int pointerID, final Vector2f pos, final KeyStatus state) {
|
||||
// Log.info("input event: type=" + type);
|
||||
// Log.info(" id=" + pointerID);
|
||||
// Log.info(" pos=" + pos);
|
||||
// Log.info(" state=" + state);
|
||||
public void onPointer(
|
||||
final KeySpecial special,
|
||||
final KeyType type,
|
||||
final int pointerID,
|
||||
final Vector2f pos,
|
||||
final KeyStatus state) {
|
||||
// LOGGER.info("input event: type=" + type);
|
||||
// LOGGER.info(" id=" + pointerID);
|
||||
// LOGGER.info(" pos=" + pos);
|
||||
// LOGGER.info(" state=" + state);
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
@ -5,12 +5,11 @@ import java.io.InputStream;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import org.atriasoft.etk.Uri;
|
||||
|
||||
import de.matthiasmann.twl.utils.PNGDecoder;
|
||||
import de.matthiasmann.twl.utils.PNGDecoder.Format;
|
||||
import org.atriasoft.pngdecoder.PNGDecoder;
|
||||
import org.atriasoft.pngdecoder.PNGDecoder.Format;
|
||||
|
||||
public class ImageLoader {
|
||||
public static ImageRawData decodePngFile(final Uri filename) {
|
||||
public static ImageRawData decodePngFile(final Uri filename) throws Exception {
|
||||
ByteBuffer buf = null;
|
||||
int tWidth = 0;
|
||||
int tHeight = 0;
|
||||
@ -18,6 +17,9 @@ public class ImageLoader {
|
||||
try {
|
||||
// Open the PNG file as an InputStream
|
||||
final InputStream in = Uri.getStream(filename);
|
||||
if (in == null) {
|
||||
throw new Exception("fail to get th estream ...");
|
||||
}
|
||||
// Link the PNG decoder to this stream
|
||||
final PNGDecoder decoder = new PNGDecoder(in);
|
||||
// Get the width and height of the texture
|
@ -1,35 +0,0 @@
|
||||
/**
|
||||
* Basic module interface.
|
||||
*
|
||||
* @author Edouard DUPIN
|
||||
*/
|
||||
|
||||
open module org.atriasoft.gale {
|
||||
exports org.atriasoft.gale;
|
||||
exports org.atriasoft.gale.backend3d;
|
||||
exports org.atriasoft.gale.context;
|
||||
// exports org.atriasoft.gale.context.JOGL;
|
||||
exports org.atriasoft.gale.context.LWJG_AWT;
|
||||
exports org.atriasoft.gale.key;
|
||||
exports org.atriasoft.gale.resource;
|
||||
|
||||
requires transitive org.atriasoft.etk;
|
||||
requires transitive org.atriasoft.egami;
|
||||
|
||||
requires transitive org.lwjgl;
|
||||
requires transitive org.lwjgl.natives;
|
||||
requires transitive org.lwjgl.glfw;
|
||||
requires transitive org.lwjgl.glfw.natives;
|
||||
requires transitive org.lwjgl.assimp;
|
||||
requires transitive org.lwjgl.assimp.natives;
|
||||
requires transitive org.lwjgl.stb;
|
||||
requires transitive org.lwjgl.stb.natives;
|
||||
requires transitive org.lwjgl.jawt;
|
||||
requires transitive org.lwjgl.opengl;
|
||||
requires transitive org.lwjgl.opengl.natives;
|
||||
|
||||
requires transitive java.desktop;
|
||||
requires transitive pngdecoder;
|
||||
requires transitive lwjgl3.awt;
|
||||
requires io.scenarium.logger;
|
||||
}
|
@ -1,88 +0,0 @@
|
||||
package org.atriasoft.gale;
|
||||
|
||||
public class Fps {
|
||||
private long startTime = 0;
|
||||
private long nbCallTime = 0;
|
||||
private long nbDisplayTime = 0;
|
||||
private float min = 99999999;
|
||||
private float avg = 0;
|
||||
private float max = 0;
|
||||
private float minIdle = 99999999;
|
||||
private float avgIdle = 0;
|
||||
private float maxIdle = 0;
|
||||
private long ticTime = 0;
|
||||
private boolean display = false;
|
||||
private boolean drawingDone = false;
|
||||
private String displayName = null;
|
||||
private boolean displayFPS;
|
||||
public Fps(String displayName, boolean displayFPS) {
|
||||
this.displayName = displayName;
|
||||
this.displayFPS = displayFPS;
|
||||
}
|
||||
public void tic() {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
ticTime = currentTime;
|
||||
nbCallTime++;
|
||||
if (startTime == 0) {
|
||||
startTime = currentTime;
|
||||
}
|
||||
if ( (currentTime - startTime) > 10000) {
|
||||
display = true;
|
||||
}
|
||||
}
|
||||
public void toc() {
|
||||
toc(false);
|
||||
}
|
||||
public void toc(boolean displayTime) {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
long processTimeLocal = (currentTime - ticTime);
|
||||
if (displayTime) {
|
||||
System.out.println(displayName + ": processTime: " + processTimeLocal);
|
||||
}
|
||||
if (drawingDone) {
|
||||
min = Math.min(min, processTimeLocal);
|
||||
max = Math.max(max, processTimeLocal);
|
||||
avg += processTimeLocal;
|
||||
drawingDone = false;
|
||||
} else {
|
||||
minIdle = Math.min(minIdle, processTimeLocal);
|
||||
maxIdle = Math.max(maxIdle, processTimeLocal);
|
||||
avgIdle += processTimeLocal;
|
||||
}
|
||||
}
|
||||
|
||||
public void incrementCounter() {
|
||||
nbDisplayTime++;
|
||||
drawingDone = true;
|
||||
}
|
||||
|
||||
public void draw() {
|
||||
if (display) {
|
||||
if (nbDisplayTime > 0) {
|
||||
System.out.println(displayName + " : Active : "
|
||||
+ min + " "
|
||||
+ avg / nbDisplayTime + "ms "
|
||||
+ max + " ");
|
||||
}
|
||||
if (nbCallTime-nbDisplayTime>0) {
|
||||
System.out.println(displayName + " : idle : "
|
||||
+ minIdle + " "
|
||||
+ avgIdle / (nbCallTime-nbDisplayTime) + "ms "
|
||||
+ maxIdle + " ");
|
||||
}
|
||||
if (displayFPS) {
|
||||
System.out.println("FPS : " + nbDisplayTime + "/" + nbCallTime + "fps");
|
||||
}
|
||||
max = 0;
|
||||
min = 99999999;
|
||||
avg = 0;
|
||||
maxIdle = 0;
|
||||
minIdle = 99999999;
|
||||
avgIdle = 0;
|
||||
nbCallTime = 0;
|
||||
nbDisplayTime = 0;
|
||||
startTime = 0;
|
||||
display = false;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
package org.atriasoft.gale.context;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.gale.internal.Log;
|
||||
|
||||
public class CommandLine {
|
||||
private List<String> listArgs = new ArrayList<String>();
|
||||
|
||||
public void parse(String[] args) {
|
||||
for (int iii=1 ; iii<args.length; iii++) {
|
||||
Log.info("commandLine : '" + args[iii] + "'" );
|
||||
listArgs.add(args[iii]);
|
||||
}
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return listArgs.size();
|
||||
}
|
||||
|
||||
public String get(int id) {
|
||||
return listArgs.get(id);
|
||||
}
|
||||
|
||||
public void add(String newElement) {
|
||||
listArgs.add(newElement);
|
||||
}
|
||||
|
||||
public void remove(int id) {
|
||||
listArgs.remove(id);
|
||||
}
|
||||
}
|
@ -1,75 +0,0 @@
|
||||
package org.atriasoft.gale.internal;
|
||||
|
||||
import io.scenarium.logger.LogLevel;
|
||||
import io.scenarium.logger.Logger;
|
||||
|
||||
public class Log {
|
||||
private static final String LIB_NAME = "gale";
|
||||
private static final String LIB_NAME_DRAW = Logger.getDrawableName(LIB_NAME);
|
||||
private static final boolean PRINT_CRITICAL = Logger.getNeedPrint(LIB_NAME, LogLevel.CRITICAL);
|
||||
private static final boolean PRINT_ERROR = Logger.getNeedPrint(LIB_NAME, LogLevel.ERROR);
|
||||
private static final boolean PRINT_WARNING = Logger.getNeedPrint(LIB_NAME, LogLevel.WARNING);
|
||||
private static final boolean PRINT_INFO = Logger.getNeedPrint(LIB_NAME, LogLevel.INFO);
|
||||
private static final boolean PRINT_DEBUG = Logger.getNeedPrint(LIB_NAME, LogLevel.DEBUG);
|
||||
private static final boolean PRINT_VERBOSE = Logger.getNeedPrint(LIB_NAME, LogLevel.VERBOSE);
|
||||
private static final boolean PRINT_TODO = Logger.getNeedPrint(LIB_NAME, LogLevel.TODO);
|
||||
private static final boolean PRINT_PRINT = Logger.getNeedPrint(LIB_NAME, LogLevel.PRINT);
|
||||
|
||||
public static void critical(final String data) {
|
||||
if (PRINT_CRITICAL) {
|
||||
Logger.critical(LIB_NAME_DRAW, data);
|
||||
}
|
||||
}
|
||||
|
||||
public static void critical(final String data, final Exception e) {
|
||||
e.printStackTrace();
|
||||
if (PRINT_CRITICAL) {
|
||||
Logger.critical(LIB_NAME_DRAW, data + " : " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static void debug(final String data) {
|
||||
if (PRINT_DEBUG) {
|
||||
Logger.debug(LIB_NAME_DRAW, data);
|
||||
}
|
||||
}
|
||||
|
||||
public static void error(final String data) {
|
||||
if (PRINT_ERROR) {
|
||||
Logger.error(LIB_NAME_DRAW, data);
|
||||
}
|
||||
}
|
||||
|
||||
public static void info(final String data) {
|
||||
if (PRINT_INFO) {
|
||||
Logger.info(LIB_NAME_DRAW, data);
|
||||
}
|
||||
}
|
||||
|
||||
public static void print(final String data) {
|
||||
if (PRINT_PRINT) {
|
||||
Logger.print(LIB_NAME_DRAW, data);
|
||||
}
|
||||
}
|
||||
|
||||
public static void todo(final String data) {
|
||||
if (PRINT_TODO) {
|
||||
Logger.todo(LIB_NAME_DRAW, data);
|
||||
}
|
||||
}
|
||||
|
||||
public static void verbose(final String data) {
|
||||
if (PRINT_VERBOSE) {
|
||||
Logger.verbose(LIB_NAME_DRAW, data);
|
||||
}
|
||||
}
|
||||
|
||||
public static void warning(final String data) {
|
||||
if (PRINT_WARNING) {
|
||||
Logger.warning(LIB_NAME_DRAW, data);
|
||||
}
|
||||
}
|
||||
|
||||
private Log() {}
|
||||
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
package org.atriasoft.gale.test.sample1;
|
||||
|
||||
public class Log {
|
||||
private Log() {}
|
||||
private static final String LIBNAME = "Sample1";
|
||||
public static void print(String data) {
|
||||
System.out.println(data);
|
||||
}
|
||||
public static void critical(String data) {
|
||||
System.out.println("[C] " + LIBNAME + " | " + data);
|
||||
}
|
||||
public static void error(String data) {
|
||||
System.out.println("[E] " + LIBNAME + " | " + data);
|
||||
}
|
||||
public static void warning(String data) {
|
||||
System.out.println("[W] " + LIBNAME + " | " + data);
|
||||
}
|
||||
public static void info(String data) {
|
||||
System.out.println("[I] " + LIBNAME + " | " + data);
|
||||
}
|
||||
public static void debug(String data) {
|
||||
System.out.println("[D] " + LIBNAME + " | " + data);
|
||||
}
|
||||
public static void verbose(String data) {
|
||||
System.out.println("[V] " + LIBNAME + " | " + data);
|
||||
}
|
||||
public static void todo(String data) {
|
||||
System.out.println("[TODO] " + LIBNAME + " | " + data);
|
||||
}
|
||||
}
|
2
test/.gitignore
vendored
2
test/.gitignore
vendored
@ -1 +1,3 @@
|
||||
|
||||
/__pycache__/
|
||||
/bin/
|
||||
|
@ -1,59 +0,0 @@
|
||||
package test.atriasoft.gale;
|
||||
|
||||
import io.scenarium.logger.LogLevel;
|
||||
import io.scenarium.logger.Logger;
|
||||
|
||||
public class Log {
|
||||
private static final String LIB_NAME = "gale-test";
|
||||
private static final String LIB_NAME_DRAW = Logger.getDrawableName(LIB_NAME);
|
||||
private static final boolean PRINT_CRITICAL = Logger.getNeedPrint(LIB_NAME, LogLevel.CRITICAL);
|
||||
private static final boolean PRINT_ERROR = Logger.getNeedPrint(LIB_NAME, LogLevel.ERROR);
|
||||
private static final boolean PRINT_WARNING = Logger.getNeedPrint(LIB_NAME, LogLevel.WARNING);
|
||||
private static final boolean PRINT_INFO = Logger.getNeedPrint(LIB_NAME, LogLevel.INFO);
|
||||
private static final boolean PRINT_DEBUG = Logger.getNeedPrint(LIB_NAME, LogLevel.DEBUG);
|
||||
private static final boolean PRINT_VERBOSE = Logger.getNeedPrint(LIB_NAME, LogLevel.VERBOSE);
|
||||
private static final boolean PRINT_TODO = Logger.getNeedPrint(LIB_NAME, LogLevel.TODO);
|
||||
private static final boolean PRINT_PRINT = Logger.getNeedPrint(LIB_NAME, LogLevel.PRINT);
|
||||
|
||||
private Log() {}
|
||||
|
||||
public static void print(String data) {
|
||||
if (PRINT_PRINT)
|
||||
Logger.print(LIB_NAME_DRAW, data);
|
||||
}
|
||||
|
||||
public static void critical(String data) {
|
||||
if (PRINT_CRITICAL)
|
||||
Logger.critical(LIB_NAME_DRAW, data);
|
||||
}
|
||||
|
||||
public static void error(String data) {
|
||||
if (PRINT_ERROR)
|
||||
Logger.error(LIB_NAME_DRAW, data);
|
||||
}
|
||||
|
||||
public static void warning(String data) {
|
||||
if (PRINT_WARNING)
|
||||
Logger.warning(LIB_NAME_DRAW, data);
|
||||
}
|
||||
|
||||
public static void info(String data) {
|
||||
if (PRINT_INFO)
|
||||
Logger.info(LIB_NAME_DRAW, data);
|
||||
}
|
||||
|
||||
public static void debug(String data) {
|
||||
if (PRINT_DEBUG)
|
||||
Logger.debug(LIB_NAME_DRAW, data);
|
||||
}
|
||||
|
||||
public static void verbose(String data) {
|
||||
if (PRINT_VERBOSE)
|
||||
Logger.verbose(LIB_NAME_DRAW, data);
|
||||
}
|
||||
|
||||
public static void todo(String data) {
|
||||
if (PRINT_TODO)
|
||||
Logger.todo(LIB_NAME_DRAW, data);
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
package test.atriasoft.gale;
|
||||
|
||||
import io.scenarium.logger.LogLevel;
|
||||
import io.scenarium.logger.Logger;
|
||||
|
||||
public class Log2 {
|
||||
private static final String LIB_NAME = "gale-test-2";
|
||||
private static final String LIB_NAME_DRAW = Logger.getDrawableName(LIB_NAME);
|
||||
private static final boolean PRINT_DEBUG = Logger.getNeedPrint(LIB_NAME, LogLevel.DEBUG);
|
||||
|
||||
private Log2() {}
|
||||
|
||||
public static void debug(String data) {
|
||||
if (PRINT_DEBUG)
|
||||
Logger.debug(LIB_NAME_DRAW, data);
|
||||
}
|
||||
|
||||
}
|
@ -11,20 +11,18 @@ package test.atriasoft.gale;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import io.scenarium.logger.Logger;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
|
||||
import org.junit.jupiter.api.Order;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestMethodOrder;
|
||||
|
||||
@TestMethodOrder(OrderAnnotation.class)
|
||||
public class TestBasicLog {
|
||||
|
||||
// JUST keep a kanva ...
|
||||
@Test
|
||||
@Order(1)
|
||||
public void aaFirstInitialisation() {
|
||||
List<String> args = new ArrayList<>();
|
||||
final List<String> args = new ArrayList<>();
|
||||
args.add("--log-level=999");
|
||||
args.add("--log-level=1");
|
||||
args.add("--log-no-color");
|
||||
@ -37,66 +35,6 @@ public class TestBasicLog {
|
||||
args.add("--log-lib=sc-log-test");
|
||||
args.add("--log-with-stupid-parameter=sdkfjsqdlkf");
|
||||
args.add("--help");
|
||||
Logger.init(args);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(2)
|
||||
public void bbSecondInitialisation() {
|
||||
List<String> args = new ArrayList<>();
|
||||
Logger.init(args);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(3)
|
||||
public void ccBasicLogCall() {
|
||||
Log.print("Simple print");
|
||||
Log.todo("Simple todo");
|
||||
Log.error("Simple error");
|
||||
Log.warning("Simple warning");
|
||||
Log.info("Simple info");
|
||||
Log.debug("Simple debug");
|
||||
Log.verbose("Simple verbose");
|
||||
}
|
||||
|
||||
// TODO REFACTO REMOVE this and set it in the Test of the logger.
|
||||
public static String getAAAAAAA(int dfsdf) {
|
||||
int hhh = 0;
|
||||
for (int kkk = 0; kkk < dfsdf; kkk++)
|
||||
for (int iii = 0; iii < 10000; iii++)
|
||||
for (int jjj = 0; jjj < 100000; jjj++)
|
||||
for (int lll = 0; lll < 100000; lll++)
|
||||
hhh++;
|
||||
return "kkk" + hhh;
|
||||
}
|
||||
|
||||
public static void testLog() {
|
||||
Log.print("test direct [START]");
|
||||
// test de 10 secondes contre 0.0?? second quand le niveau n'est pas assez grand ...
|
||||
long timeStart = System.currentTimeMillis();
|
||||
for (int iii = 0; iii < 100000000; iii++)
|
||||
Log2.debug("test direct");
|
||||
long timeStop = System.currentTimeMillis();
|
||||
Log.print("test direct [END] : " + timeStart + " to " + timeStop + " ==> delta=" + (timeStop - timeStart));
|
||||
Log.print("test concat [START]");
|
||||
// C'est très long dans les 2 cas ...
|
||||
timeStart = System.currentTimeMillis();
|
||||
for (int iii = 0; iii < 6; iii++)
|
||||
Log2.debug("test concat: non fonctionnel, il applelle le get a chaque log ... " + getAAAAAAA(iii));
|
||||
timeStop = System.currentTimeMillis();
|
||||
Log.print("test concat [END] : " + timeStart + " to " + timeStop + " ==> delta=" + (timeStop - timeStart));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(4)
|
||||
public void ddTestSimpleLog() {
|
||||
testLog();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(4)
|
||||
public void eeUsage() {
|
||||
Logger.usage();
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user