Initial commit

This commit is contained in:
rnentjes
2014-01-17 12:34:48 +01:00
commit 9f68d51064
35 changed files with 1732 additions and 0 deletions

1
.idea/.name generated Normal file
View File

@@ -0,0 +1 @@
jogl-compute-shaders-fireworks

23
.idea/compiler.xml generated Normal file
View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<option name="DEFAULT_COMPILER" value="Javac" />
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
</project>

5
.idea/encodings.xml generated Normal file
View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
</project>

10
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" assert-keyword="true" jdk-15="true" project-jdk-name="1.7" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

9
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/jogl-compute-shaders-fireworks.iml" filepath="$PROJECT_DIR$/jogl-compute-shaders-fireworks.iml" />
</modules>
</component>
</project>

5
.idea/scopes/scope_settings.xml generated Normal file
View File

@@ -0,0 +1,5 @@
<component name="DependencyValidationManager">
<state>
<option name="SKIP_IMPORT_STATEMENTS" value="false" />
</state>
</component>

8
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="" />
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

630
.idea/workspace.xml generated Normal file
View File

@@ -0,0 +1,630 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="0193c0b3-1608-4943-8e86-0ee275fde56d" name="Default" comment="">
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/gluegen-rt-natives-linux-amd64.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/gluegen-rt-natives-linux-i586.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/gluegen-rt-natives-macosx-universal.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/gluegen-rt-natives-windows-amd64.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/gluegen-rt-natives-windows-i586.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/gluegen-rt.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/jogl-all-natives-linux-amd64.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/jogl-all-natives-linux-i586.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/jogl-all-natives-macosx-universal.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/jogl-all-natives-windows-amd64.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/jogl-all-natives-windows-i586.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/jogl-all-noawt.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/slf4j-api-1.7.5.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/slf4j-simple-1.7.2.jar" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/.name" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/persesgames/jogl/shader/ComputeProgram.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/persesgames/jogl/explosion/ExplosionComputeHandler.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/persesgames/jogl/Keyboard.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/persesgames/jogl/Renderer.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/persesgames/jogl/shader/ShaderProgram.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/persesgames/jogl/TestJogl.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/persesgames/jogl/Timer.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/persesgames/jogl/Util.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/compiler.xml" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/encodings.xml" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/persesgames/jogl/explosion/explShader.frag" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/persesgames/jogl/explosion/explShader.vert" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/persesgames/jogl/explosion/explosion.comp" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/com/persesgames/jogl/explosion/explosionCleanUp.comp" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/jogl-compute-shaders-fireworks.iml" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/misc.xml" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/modules.xml" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/scopes/scope_settings.xml" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/vcs.xml" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
</list>
<ignored path="jogl-compute-shaders-fireworks.iws" />
<ignored path=".idea/workspace.xml" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ChangesViewManager" flattened_view="true" show_ignored="false" />
<component name="CreatePatchCommitExecutor">
<option name="PATCH_PATH" value="" />
</component>
<component name="DaemonCodeAnalyzer">
<disable_hints />
</component>
<component name="DebuggerManager">
<breakpoint_any default_suspend_policy="SuspendAll" default_condition_enabled="true">
<breakpoint>
<option name="NOTIFY_CAUGHT" value="true" />
<option name="NOTIFY_UNCAUGHT" value="true" />
<option name="ENABLED" value="false" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="REMOVE_AFTER_HIT" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="SUSPEND" value="true" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="true" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
<breakpoint>
<option name="NOTIFY_CAUGHT" value="true" />
<option name="NOTIFY_UNCAUGHT" value="true" />
<option name="ENABLED" value="false" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="REMOVE_AFTER_HIT" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="SUSPEND" value="true" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="true" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
</breakpoint_any>
<ui_properties default_suspend_policy="SuspendAll" default_condition_enabled="true" />
<breakpoint_rules />
<ui_properties />
</component>
<component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
<component name="FavoritesManager">
<favorites_list name="jogl-compute-shaders-fireworks" />
</component>
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="Util.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/Util.java">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="0" selection-start="694" selection-end="694" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="558">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="explShader.frag" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/explosion/explShader.frag">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="450">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="explShader.vert" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/explosion/explShader.vert">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="0" selection-start="485" selection-end="485" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="504">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="ExplosionComputeHandler.java" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/explosion/ExplosionComputeHandler.java">
<provider selected="true" editor-type-id="text-editor">
<state line="19" column="3" selection-start="490" selection-end="490" vertical-scroll-proportion="0.3051643" vertical-offset="147" max-vertical-offset="3726">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Renderer.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/Renderer.java">
<provider selected="true" editor-type-id="text-editor">
<state line="216" column="0" selection-start="6298" selection-end="6298" vertical-scroll-proportion="0.0" vertical-offset="3212" max-vertical-offset="3852">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Timer.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/Timer.java">
<provider selected="true" editor-type-id="text-editor">
<state line="13" column="13" selection-start="230" selection-end="230" vertical-scroll-proportion="0.0" vertical-offset="1299" max-vertical-offset="1926">
<folding />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FindManager">
<FindUsagesManager>
<setting name="OPEN_NEW_TAB" value="false" />
</FindUsagesManager>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="changedFiles">
<list>
<option value="$PROJECT_DIR$/src/jogl/Util.java" />
<option value="$PROJECT_DIR$/src/com/persesgames/jogl/Renderer.java" />
<option value="$PROJECT_DIR$/src/com/persesgames/jogl/explosion/explShader.vert" />
<option value="$PROJECT_DIR$/src/com/persesgames/jogl/explosion/ExplosionComputeHandler.java" />
</list>
</option>
</component>
<component name="ProjectFrameBounds">
<option name="x" value="439" />
<option name="y" value="34" />
<option name="width" value="1481" />
<option name="height" value="1142" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="true">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectReloadState">
<option name="STATE" value="2" />
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1" splitterProportion="0.5">
<flattenPackages />
<showMembers />
<showModules />
<showLibraryContents />
<hideEmptyPackages />
<abbreviatePackageNames />
<autoscrollToSource />
<autoscrollFromSource />
<sortByType />
</navigator>
<panes>
<pane id="ProjectPane">
<subPane>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="jogl-compute-shaders-fireworks" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="jogl-compute-shaders-fireworks" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="jogl-compute-shaders-fireworks" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
<pane id="Scope" />
<pane id="PackagesPane" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="GoToClass.includeLibraries" value="false" />
<property name="GoToClass.toSaveIncludeLibraries" value="false" />
<property name="GoToFile.includeJavaFiles" value="false" />
<property name="MemberChooser.sorted" value="false" />
<property name="MemberChooser.showClasses" value="true" />
<property name="MemberChooser.copyJavadoc" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/lib" />
<property name="project.structure.last.edited" value="Modules" />
<property name="project.structure.proportion" value="0.0" />
<property name="project.structure.side.proportion" value="0.2" />
<property name="recentsLimit" value="5" />
<property name="dynamic.classpath" value="false" />
<property name="options.lastSelected" value="settings.github" />
<property name="options.splitter.main.proportions" value="0.3" />
<property name="options.splitter.details.proportions" value="0.2" />
<property name="options.searchVisible" value="true" />
</component>
<component name="PsiViewer.ProjectComponent">
<option name="HIGHLIGHT" value="false" />
<option name="FILTER_WHITESPACE" value="false" />
<option name="SHOW_PROPERTIES" value="true" />
<option name="SPLIT_DIVIDER_POSITION" value="300" />
<option name="AUTOSCROLL_TO_SOURCE" value="false" />
<option name="AUTOSCROLL_FROM_SOURCE" value="false" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/src" />
<recent name="$PROJECT_DIR$/lib" />
</key>
</component>
<component name="RunManager" selected="Application.TestJogl (1)">
<configuration default="false" name="TestJogl" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="jogl.TestJogl" />
<option name="VM_PARAMETERS" />
<option name="PROGRAM_PARAMETERS" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="ENABLE_SWING_INSPECTOR" value="false" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<module name="jogl-compute-shaders-fireworks" />
<envs />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method />
</configuration>
<configuration default="false" name="TestJogl (1)" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.persesgames.jogl.TestJogl" />
<option name="VM_PARAMETERS" />
<option name="PROGRAM_PARAMETERS" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="ENABLE_SWING_INSPECTOR" value="false" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<module name="jogl-compute-shaders-fireworks" />
<envs />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method />
</configuration>
<configuration default="true" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" factoryName="Plugin" singleton="true">
<module name="" />
<option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea" />
<option name="PROGRAM_PARAMETERS" />
<method />
</configuration>
<configuration default="true" type="DartCommandLineRunConfigurationType" factoryName="Dart Command Line Application">
<option name="VMOptions" />
<option name="arguments" />
<option name="filePath" />
<option name="name" value="Dart" />
<option name="saveOutputToFile" value="false" />
<option name="showConsoleOnStdErr" value="false" />
<option name="showConsoleOnStdOut" value="false" />
<method />
</configuration>
<configuration default="true" type="DartUnitRunConfigurationType" factoryName="DartUnit">
<option name="VMOptions" />
<option name="arguments" />
<option name="filePath" />
<option name="scope" value="ALL" />
<option name="testName" />
<method />
</configuration>
<configuration default="true" type="Remote" factoryName="Remote">
<option name="USE_SOCKET_TRANSPORT" value="true" />
<option name="SERVER_MODE" value="false" />
<option name="SHMEM_ADDRESS" value="javadebug" />
<option name="HOST" value="localhost" />
<option name="PORT" value="5005" />
<method />
</configuration>
<configuration default="true" type="JavascriptDebugType" factoryName="JavaScript Debug" singleton="true">
<method />
</configuration>
<configuration default="true" type="Applet" factoryName="Applet">
<module name="" />
<option name="MAIN_CLASS_NAME" />
<option name="HTML_FILE_NAME" />
<option name="HTML_USED" value="false" />
<option name="WIDTH" value="400" />
<option name="HEIGHT" value="300" />
<option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
<option name="VM_PARAMETERS" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<method />
</configuration>
<configuration default="true" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" />
<option name="VM_PARAMETERS" />
<option name="PROGRAM_PARAMETERS" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="ENABLE_SWING_INSPECTOR" value="false" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<module name="" />
<envs />
<method />
</configuration>
<configuration default="true" type="JUnit" factoryName="JUnit">
<module name="" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="PACKAGE_NAME" />
<option name="MAIN_CLASS_NAME" />
<option name="METHOD_NAME" />
<option name="TEST_OBJECT" value="class" />
<option name="VM_PARAMETERS" value="-ea" />
<option name="PARAMETERS" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<patterns />
<method />
</configuration>
<list size="2">
<item index="0" class="java.lang.String" itemvalue="Application.TestJogl" />
<item index="1" class="java.lang.String" itemvalue="Application.TestJogl (1)" />
</list>
<recent_temporary>
<list size="2">
<item index="0" class="java.lang.String" itemvalue="Application.TestJogl (1)" />
<item index="1" class="java.lang.String" itemvalue="Application.TestJogl" />
</list>
</recent_temporary>
<configuration name="&lt;template&gt;" type="TestNG" default="true" selected="false">
<option name="MAIN_CLASS_NAME" />
<option name="VM_PARAMETERS" value="-ea" />
<option name="PARAMETERS" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
</configuration>
<configuration name="&lt;template&gt;" type="WebApp" default="true" selected="false">
<Host>localhost</Host>
<Port>5050</Port>
</configuration>
</component>
<component name="ShelveChangesManager" show_recycled="false" />
<component name="SvnConfiguration" maxAnnotateRevisions="500" myUseAcceleration="nothing" myAutoUpdateAfterCommit="false" cleanupOnStartRun="false" SSL_PROTOCOLS="all">
<option name="USER" value="" />
<option name="PASSWORD" value="" />
<option name="mySSHConnectionTimeout" value="30000" />
<option name="mySSHReadTimeout" value="30000" />
<option name="LAST_MERGED_REVISION" />
<option name="MERGE_DRY_RUN" value="false" />
<option name="MERGE_DIFF_USE_ANCESTRY" value="true" />
<option name="UPDATE_LOCK_ON_DEMAND" value="false" />
<option name="IGNORE_SPACES_IN_MERGE" value="false" />
<option name="CHECK_NESTED_FOR_QUICK_MERGE" value="false" />
<option name="IGNORE_SPACES_IN_ANNOTATE" value="true" />
<option name="SHOW_MERGE_SOURCES_IN_ANNOTATE" value="true" />
<option name="FORCE_UPDATE" value="false" />
<option name="IGNORE_EXTERNALS" value="false" />
<myIsUseDefaultProxy>false</myIsUseDefaultProxy>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="0193c0b3-1608-4943-8e86-0ee275fde56d" name="Default" comment="" />
<created>1389957748775</created>
<updated>1389957748775</updated>
<workItem from="1389957751293" duration="57000" />
<workItem from="1389957808723" duration="676000" />
</task>
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="733000" />
</component>
<component name="ToolWindowManager">
<frame x="439" y="34" width="1481" height="1142" extended-state="0" />
<editor active="true" />
<layout>
<window_info id="Palette&#9;" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Kotlin" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.33065328" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Application Servers" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.2546973" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32964823" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="PsiViewer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
</layout>
</component>
<component name="Vcs.Log.UiProperties">
<option name="RECENTLY_FILTERED_USERS">
<collection />
</option>
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="VcsManagerConfiguration">
<option name="myTodoPanelSettings">
<TodoPanelSettings />
</option>
<MESSAGE value="Initial commit" />
<option name="LAST_COMMIT_MESSAGE" value="Initial commit" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager />
</component>
<component name="antWorkspaceConfiguration">
<option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />
<option name="FILTER_TARGETS" value="false" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/Util.java">
<provider selected="true" editor-type-id="text-editor">
<state line="10" column="13" selection-start="167" selection-end="167" vertical-scroll-proportion="0.0" vertical-offset="180" max-vertical-offset="558">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/Renderer.java">
<provider selected="true" editor-type-id="text-editor">
<state line="216" column="0" selection-start="6298" selection-end="6298" vertical-scroll-proportion="0.0" vertical-offset="3212" max-vertical-offset="3852">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/Timer.java">
<provider selected="true" editor-type-id="text-editor">
<state line="13" column="13" selection-start="230" selection-end="230" vertical-scroll-proportion="0.0" vertical-offset="1299" max-vertical-offset="1926">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/Util.java">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="0" selection-start="694" selection-end="694" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="558">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/explosion/explShader.frag">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="640">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/explosion/explShader.vert">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="0" selection-start="485" selection-end="485" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="504">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/com/persesgames/jogl/explosion/ExplosionComputeHandler.java">
<provider selected="true" editor-type-id="text-editor">
<state line="19" column="3" selection-start="490" selection-end="490" vertical-scroll-proportion="0.3051643" vertical-offset="147" max-vertical-offset="3726">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
</component>
<component name="masterDetails">
<states>
<state key="ArtifactsStructureConfigurable.UI">
<settings>
<artifact-editor />
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="FacetStructureConfigurable.UI">
<settings>
<last-edited>No facets are configured</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="GlobalLibrariesConfigurable.UI">
<settings>
<last-edited>Dart SDK</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="JdkListConfigurable.UI">
<settings>
<last-edited>1.7</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="ModuleStructureConfigurable.UI">
<settings>
<last-edited>jogl-compute-shaders-fireworks</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
<option value="0.6" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="ProjectJDKs.UI">
<settings>
<last-edited>1.7</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="ProjectLibrariesConfigurable.UI">
<settings>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
</states>
</component>
</project>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="file://$MODULE_DIR$/lib" />
</CLASSES>
<JAVADOC />
<SOURCES />
<jarDirectory url="file://$MODULE_DIR$/lib" recursive="false" />
</library>
</orderEntry>
</component>
</module>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/gluegen-rt.jar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/jogl-all-noawt.jar Normal file

Binary file not shown.

BIN
lib/slf4j-api-1.7.5.jar Normal file

Binary file not shown.

BIN
lib/slf4j-simple-1.7.2.jar Normal file

Binary file not shown.

View File

@@ -0,0 +1,41 @@
package com.persesgames.jogl;
import com.jogamp.newt.event.KeyEvent;
import com.jogamp.newt.event.KeyListener;
/**
* Date: 12/30/13
* Time: 9:25 PM
*/
public class Keyboard implements KeyListener {
private boolean [] pressed = new boolean[127];
private boolean [] released = new boolean[127];
@Override
public void keyPressed(KeyEvent keyEvent) {
if (keyEvent.getKeyCode() > 0 && keyEvent.getKeyCode() < pressed.length) {
pressed[keyEvent.getKeyCode()] = true;
}
}
@Override
public void keyReleased(KeyEvent keyEvent) {
if (keyEvent.getKeyCode() > 0 && keyEvent.getKeyCode() < pressed.length) {
pressed[keyEvent.getKeyCode()] = false;
released[keyEvent.getKeyCode()] = true;
}
}
public boolean isPressed(short keyCode) {
return keyCode < pressed.length && pressed[keyCode];
}
public boolean isReleased(short keyCode) {
boolean result = keyCode < pressed.length && released[keyCode];
released[keyCode] = false;
return result;
}
}

View File

@@ -0,0 +1,216 @@
package com.persesgames.jogl;
import com.jogamp.newt.event.KeyEvent;
import com.jogamp.newt.opengl.GLWindow;
import com.persesgames.jogl.explosion.ExplosionComputeHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.media.opengl.*;
import java.util.Random;
import java.util.concurrent.TimeUnit;
/**
* Date: 10/25/13
* Time: 7:42 PM
*/
public class Renderer implements GLEventListener {
private final static Logger logger = LoggerFactory.getLogger(Renderer.class);
private final static int MAX_ENTITIES_PER_COLOR = 2000000;
private final Random random = new Random(System.nanoTime());
private volatile boolean stopped = false;
private volatile boolean dirty = true;
private final GLWindow glWindow;
private int width = 100, height = 100;
private Keyboard keyboard;
private boolean checkError = false;
private long lastLog = System.nanoTime();
private long start = System.currentTimeMillis();
private Timer timer = new Timer(TimeUnit.SECONDS, 1);
private ExplosionComputeHandler explosionComputeHandler;
public Renderer(GLWindow glWindow, Keyboard keyboard) {
this.glWindow = glWindow;
this.keyboard = keyboard;
}
public void stop() {
stopped = true;
}
public void redraw() {
dirty = true;
}
public void run() {
Renderer.this.glWindow.display();
while(!stopped) {
if (dirty) {
//logger.info("rendering+" + System.currentTimeMillis());
Renderer.this.glWindow.display();
//Renderer.this.glWindow.swapBuffers();
dirty = true;
} else {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
logger.warn(e.getMessage(), e);
}
}
stopped = keyboard.isPressed(KeyEvent.VK_ESCAPE);
}
Renderer.this.glWindow.destroy();
}
@Override
public void init(GLAutoDrawable drawable) {
timer.start("init");
GL4 gl = drawable.getGL().getGL4();
gl.setSwapInterval(0);
// debug init
//gl = new DebugGL4(gl);
logger.info("Chosen GLCapabilities: " + drawable.getChosenGLCapabilities());
logger.info("INIT GL IS: " + gl.getClass().getName());
logger.info("GL_VENDOR: " + gl.glGetString(GL.GL_VENDOR));
logger.info("GL_RENDERER: " + gl.glGetString(GL.GL_RENDERER));
logger.info("GL_VERSION: " + gl.glGetString(GL.GL_VERSION));
int [] result = new int[3];
gl.glGetIntegerv(GL2.GL_MAX_VERTEX_ATTRIBS, result, 0);
logger.info("GL_MAX_VERTEX_ATTRIBS=" + result[0]);
gl.glGetIntegerv(GL4.GL_MAX_COMPUTE_WORK_GROUP_SIZE, result, 0);
logger.info("GL_MAX_COMPUTE_WORK_GROUP_SIZE= {},{},{}", result[0], result[1], result[2]);
gl.glGetIntegerv(GL4.GL_MAX_COMPUTE_WORK_GROUP_COUNT, result, 0);
logger.info("GL_MAX_COMPUTE_WORK_GROUP_COUNT= {},{},{}", result[0], result[1], result[2]);
explosionComputeHandler = new ExplosionComputeHandler(gl);
explosionComputeHandler.init();
explosionComputeHandler.createNewExplosionData();
explosionComputeHandler.updateGpu();
timer.stop("init");
}
@Override
public void dispose(GLAutoDrawable drawable) {
explosionComputeHandler.dispose();
}
private long lastDelta = System.nanoTime();
private float delta = 0f;
private void calculateCurrentDelta() {
long nanoDelta = System.nanoTime() - lastDelta;
delta = (nanoDelta / 1000000000f);
lastDelta = System.nanoTime();
}
@Override
public void display(GLAutoDrawable drawable) {
//logger.info("display+" + System.currentTimeMillis());
calculateCurrentDelta();
GL4 gl = drawable.getGL().getGL4();
if (checkError) {
// debug
gl.glGetError();
gl = new DebugGL4(gl);
}
if (keyboard.isPressed(KeyEvent.VK_SHIFT)) {
explosionComputeHandler.createNewExplosionData();
explosionComputeHandler.updateGpu();
}
if (keyboard.isReleased(KeyEvent.VK_SPACE)) {
explosionComputeHandler.createNewExplosionData();
explosionComputeHandler.updateGpu();
}
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_DST_ALPHA);
gl.glViewport(0, 0, width, height);
// Clear screen
gl.glClearColor(0.1f, 0.0f, 0.1f, 1f);
gl.glClear(GL2ES2.GL_COLOR_BUFFER_BIT);
timer.start("getCount");
/*
timer.start("BindBuffer");
gl.glBindBuffer(GL4.GL_ATOMIC_COUNTER_BUFFER, atomicHandle);
timer.stop("BindBuffer");
// again we map the buffer to userCounters, but this time for read-only access
timer.start("MapBufferRange");
ByteBuffer last = gl.glMapBufferRange(GL4.GL_ATOMIC_COUNTER_BUFFER, 0, 4, GL4.GL_MAP_READ_BIT);
timer.stop("MapBufferRange");
particleCount = last.getInt();
timer.start("UnmapBuffer");
gl.glUnmapBuffer(GL4.GL_ATOMIC_COUNTER_BUFFER);
timer.stop("UnmapBuffer");
*/
timer.stop("getCount");
timer.start("compute");
explosionComputeHandler.execute(delta);
explosionComputeHandler.cleanUp();
timer.stop("compute");
timer.start("getGpuData");
explosionComputeHandler.getGpuData();
timer.stop("getGpuData");
timer.start("draw");
explosionComputeHandler.render();
timer.stop("draw");
timer.log();
if (lastLog < System.nanoTime() - TimeUnit.SECONDS.toNanos(1)) {
lastLog = System.nanoTime();
logger.info("Explosion particles: {}", explosionComputeHandler.getParticleCount());
}
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
logger.info("reshape+" + System.currentTimeMillis());
this.width = w;
this.height = h;
}
}

View File

@@ -0,0 +1,50 @@
package com.persesgames.jogl;
import com.jogamp.newt.opengl.GLWindow;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLProfile;
/**
* Date: 10/25/13
* Time: 7:27 PM
*/
public class TestJogl {
public static void main(String [] args) {
TestJogl test = new TestJogl();
test.run();
}
private final Renderer renderer;
public TestJogl() {
GLCapabilities caps = new GLCapabilities(GLProfile.get(GLProfile.GL4ES3));
caps.setDoubleBuffered(true);
GLWindow glWindow = GLWindow.create(caps);
glWindow.setTitle("jogl-triangle");
glWindow.setSize(800, 800);
glWindow.setFullscreen(false);
glWindow.setUndecorated(false);
glWindow.setPointerVisible(true);
glWindow.setVisible(true);
Keyboard keyboard = new Keyboard();
glWindow.addKeyListener(keyboard);
renderer = new Renderer(glWindow, keyboard);
glWindow.addGLEventListener(renderer);
}
public void run() {
renderer.run();
}
}

View File

@@ -0,0 +1,106 @@
package com.persesgames.jogl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* Date: 1/4/14
* Time: 8:00 PM
*/
public class Timer {
private final static Logger logger = LoggerFactory.getLogger(Timer.class);
private Map<String, Long> start = new HashMap<>();
private Map<String, Long> times = new HashMap<>();
private Map<String, Long> calls = new HashMap<>();
private long nanoStart = System.nanoTime();
private final TimeUnit unit;
private final int units;
private long lastLog = System.nanoTime();
public Timer(TimeUnit unit, int units) {
this.unit = unit;
this.units = units;
}
private long getStart(String timer) {
Long result = start.get(timer);
if (result == null) {
result = System.nanoTime();
start.put(timer, result);
}
return result;
}
private long getTime(String timer) {
Long result = times.get(timer);
if (result == null) {
result = 0l;
times.put(timer, result);
}
return result;
}
private long getCalls(String timer) {
Long result = calls.get(timer);
if (result == null) {
result = 0l;
calls.put(timer, result);
}
return result;
}
public void start(String timer) {
start.put(timer, System.nanoTime());
}
public void stop(String timer) {
long start = getStart(timer);
long delta = System.nanoTime() - start;
long time = getTime(timer);
time += delta;
times.put(timer, time);
calls.put(timer, getCalls(timer) + 1);
}
public void reset() {
lastLog = System.nanoTime();
start.clear();
times.clear();
calls.clear();
}
public void log() {
if (System.nanoTime() > (lastLog + unit.toNanos(units))) {
for (String timer : times.keySet()) {
logger.info("Timer '{}' calls '{}' time '{}ms' time/call '{}ms'", timer, getCalls(timer), (getTime(timer) / 1000000d), (getTime(timer) / 1000000d) / (double)getCalls(timer));
}
reset();
}
}
}

View File

@@ -0,0 +1,27 @@
package com.persesgames.jogl;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* Date: 10/25/13
* Time: 11:03 PM
*/
public class Util {
public static String loadAsText(Class cls, String name) {
byte [] buffer = new byte[1024];
int nr;
try (InputStream in = cls.getResourceAsStream(name); ByteArrayOutputStream out = new ByteArrayOutputStream()) {
while((nr = in.read(buffer)) > 0) {
out.write(buffer,0,nr);
}
return new String(out.toByteArray(), "UTF-8");
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
}

View File

@@ -0,0 +1,203 @@
package com.persesgames.jogl.explosion;
import com.jogamp.common.nio.Buffers;
import com.persesgames.jogl.shader.ComputeProgram;
import com.persesgames.jogl.shader.ShaderProgram;
import com.persesgames.jogl.Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.media.opengl.GL;
import javax.media.opengl.GL2ES2;
import javax.media.opengl.GL4;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.Random;
/**
* Date: 1/15/14
* Time: 8:23 PM
*/
public class ExplosionComputeHandler {
private final static Logger logger = LoggerFactory.getLogger(ExplosionComputeHandler.class);
private final static int EXPLOSION_PARTICLES = 256;
private final static int MAX_EXPLOSION_PARTICLES = 1000000;
private final Random random = new Random(System.nanoTime());
private GL4 gl;
private ShaderProgram explProgram;
private ComputeProgram explosionProgram;
private ComputeProgram explCleanUpProgram;
private FloatBuffer explBuffer = Buffers.newDirectFloatBuffer(MAX_EXPLOSION_PARTICLES * 8);
private IntBuffer atomicBuffer = Buffers.newDirectIntBuffer(5);
private int newParticleCount = 0;
private int particleCount = 0;
// opengl handles
private int explHandle;
private int atomicHandle;
public ExplosionComputeHandler(GL4 gl) {
this.gl = gl;
}
public void createNewExplosionData() {
float x = random.nextFloat() * 2f - 1f;
float y = random.nextFloat() * 2f - 1f;
if (newParticleCount > (MAX_EXPLOSION_PARTICLES - EXPLOSION_PARTICLES)) {
return;
}
float r = random.nextFloat() * 0.25f;
float g = random.nextFloat() * 0.25f;
float b = random.nextFloat() * 0.25f;
for (int i = newParticleCount; i < newParticleCount + EXPLOSION_PARTICLES; i++) {
int offset = i * 8;
float angle = (float) (random.nextFloat() * Math.PI * 2f);
float velocity = (random.nextFloat() * 0.25f) + (random.nextFloat() * 0.25f);
explBuffer.put(offset + 0, x);
explBuffer.put(offset + 1, y);
explBuffer.put(offset + 2, (float) (Math.sin(angle) * velocity));
explBuffer.put(offset + 3, (float) (Math.cos(angle) * velocity));
explBuffer.put(offset + 4, r);
explBuffer.put(offset + 5, g);
explBuffer.put(offset + 6, b);
explBuffer.put(offset + 7, random.nextFloat() * 0.5f + 0.5f);
}
newParticleCount = newParticleCount + EXPLOSION_PARTICLES;
}
public void init() {
explosionProgram = new ComputeProgram(gl, Util.loadAsText(getClass(), "explosion.comp"));
explosionProgram.getUniformLocation("delta");
explCleanUpProgram = new ComputeProgram(gl, Util.loadAsText(getClass(), "explosionCleanUp.comp"));
explProgram = new ShaderProgram(gl,
Util.loadAsText(getClass(), "explShader.vert"),
Util.loadAsText(getClass(), "explShader.frag"));
int[] tmpHandle = new int[2];
gl.glGenBuffers(2, tmpHandle, 0);
explHandle = tmpHandle[0];
atomicHandle = tmpHandle[1];
// Select the VBO, GPU memory data, to use for vertices
gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, explHandle);
// transfer data to VBO, this perform the copy of data from CPU -> GPU memory
gl.glBufferData(GL.GL_ARRAY_BUFFER, explBuffer.limit() * 4, explBuffer, GL.GL_DYNAMIC_DRAW);
}
public void updateGpu() {
// Select the VBO, GPU memory data, to use for vertices
gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, explHandle);
// transfer data to VBO, this perform the copy of data from CPU -> GPU memory
// gl.glBufferData(GL.GL_ARRAY_BUFFER, particleCount * 4 * 8, explBuffer, GL.GL_DYNAMIC_DRAW);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER, particleCount * 4 * 8, newParticleCount * 4 * 8, explBuffer);
// Select the VBO, GPU memory data, to use for vertices
gl.glBindBuffer(GL4.GL_ATOMIC_COUNTER_BUFFER, atomicHandle);
atomicBuffer.put(0, particleCount + newParticleCount);
// transfer data to VBO, this perform the copy of data from CPU -> GPU memory
gl.glBufferData(GL4.GL_ATOMIC_COUNTER_BUFFER, 4, atomicBuffer, GL.GL_DYNAMIC_DRAW);
gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL4.GL_ATOMIC_COUNTER_BUFFER, 0);
newParticleCount = 0;
}
public void execute(float delta) {
explosionProgram.begin();
gl.glUniform1f(explosionProgram.getUniformLocation("delta"), delta);
gl.glBindBufferBase(GL4.GL_SHADER_STORAGE_BUFFER, 0, explHandle);
gl.glBindBufferBase(GL4.GL_ATOMIC_COUNTER_BUFFER, 1, atomicHandle);
explosionProgram.compute((particleCount / 512) + 1, 1, 1);
gl.glBindBufferBase(GL4.GL_SHADER_STORAGE_BUFFER, 0, 0);
gl.glBindBufferBase(GL4.GL_ATOMIC_COUNTER_BUFFER, 1, 0);
explosionProgram.end();
}
public void cleanUp() {
explCleanUpProgram.begin();
gl.glBindBufferBase(GL4.GL_SHADER_STORAGE_BUFFER, 0, explHandle);
gl.glBindBufferBase(GL4.GL_ATOMIC_COUNTER_BUFFER, 1, atomicHandle);
explCleanUpProgram.compute((particleCount / 512) + 1, 1, 1);
gl.glBindBufferBase(GL4.GL_SHADER_STORAGE_BUFFER, 0, 0);
gl.glBindBufferBase(GL4.GL_ATOMIC_COUNTER_BUFFER, 1, 0);
explCleanUpProgram.end();
}
public void render() {
explProgram.begin();
if (particleCount > 0) {
gl.glEnableVertexAttribArray(0);
gl.glEnableVertexAttribArray(1);
gl.glBindBuffer(GL2ES2.GL_ARRAY_BUFFER, explHandle);
// Associate Vertex attribute 0 with the last bound VBO
gl.glVertexAttribPointer(0 /* the vertex attribute */, 2,
GL2ES2.GL_FLOAT, false /* normalized? */, 32 /* stride */,
0 /* The bound VBO data offset */);
// Associate Vertex attribute 0 with the last bound VBO
gl.glVertexAttribPointer(1 /* the vertex attribute */, 4,
GL2ES2.GL_FLOAT, false /* normalized? */, 32 /* stride */,
16 /* The bound VBO data offset */);
gl.glDrawArrays(GL2ES2.GL_POINTS, 0, particleCount);
gl.glDisableVertexAttribArray(0);
gl.glDisableVertexAttribArray(1);
}
explProgram.end();
}
public void getGpuData() {
gl.glBindBuffer(GL4.GL_ATOMIC_COUNTER_BUFFER, atomicHandle);
gl.glGetBufferSubData(GL4.GL_ATOMIC_COUNTER_BUFFER, 0, 4, atomicBuffer);
particleCount = atomicBuffer.get(0);
newParticleCount = 0;
gl.glBindBuffer(GL4.GL_ATOMIC_COUNTER_BUFFER, 0);
}
public int getParticleCount() {
return particleCount;
}
public void dispose() {
explProgram.dispose();
explosionProgram.dispose();
explCleanUpProgram.dispose();
}
}

View File

@@ -0,0 +1,19 @@
#if __VERSION__ >= 130
#define varying in
out vec4 mgl_FragColor;
#define texture2D texture
#define gl_FragColor mgl_FragColor
#endif
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
varying vec4 varying_Color;
void main (void) {
float alpha = 1 - smoothstep(0, 1, 2 * distance(gl_PointCoord.st, vec2(0.5, 0.5)));
gl_FragColor = vec4(varying_Color.rgb, varying_Color.a * alpha);
}

View File

@@ -0,0 +1,22 @@
#if __VERSION__ >= 130
#define attribute in
#define varying out
#endif
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
attribute vec4 attribute_Position;
attribute vec4 attribute_Color;
varying vec4 varying_Color;
void main(void) {
mat4 uniform_Projection = mat4(1);
gl_PointSize = 15f;
gl_Position = uniform_Projection * attribute_Position; //vec4(attribute_Position.x, attribute_Position.y, 0, 1);
varying_Color = attribute_Color;
}

View File

@@ -0,0 +1,42 @@
#version 430 core
#define pi 3.141592653589793238462643383279
precision mediump float;
precision mediump int;
struct explosion {
vec4 positionVelocity;
vec4 color;
};
layout (std430, binding = 0) buffer entities {
explosion e[];
};
layout(binding = 1, offset = 0) uniform atomic_uint lastCounter;
uniform float delta;
layout(local_size_x = 512) in;
void main() {
uint gid = gl_GlobalInvocationID.x;
uint last = atomicCounter(lastCounter);
if (gid < last) {
vec2 position = e[gid].positionVelocity.xy;
vec2 velocity = e[gid].positionVelocity.zw;
vec4 color = e[gid].color;
if (color.a > 0.0) {
//velocity = velocity * 0.99;
position = position + velocity * delta * color.a;
color.a = color.a - (delta / 2);
} else {
color.a = 0.0;
}
e[gid].positionVelocity = vec4(position, velocity);
e[gid].color = color;
}
}

View File

@@ -0,0 +1,36 @@
#version 430 core
#define pi 3.141592653589793238462643383279
precision mediump float;
precision mediump int;
struct explosion {
vec4 positionVelocity;
vec4 color;
};
layout (std430, binding = 0) buffer entities {
explosion e[];
};
layout(binding = 1, offset = 0) uniform atomic_uint lastCounter;
layout (local_size_x = 512) in;
void main() {
uint gid = gl_GlobalInvocationID.x;
uint last = atomicCounter(lastCounter);
if (gid < last && last > 0) {
vec4 color = e[gid].color;
if (color.a == 0.0) {
uint old = atomicCounterDecrement(lastCounter);
e[gid].positionVelocity = e[old].positionVelocity;
e[gid].color = e[old].color;
e[old].color.a = 0;
}
}
}

View File

@@ -0,0 +1,126 @@
package com.persesgames.jogl.shader;
import com.persesgames.jogl.Renderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.media.opengl.GL2ES2;
import javax.media.opengl.GL4;
import java.util.HashMap;
import java.util.Map;
/*-----------------------------------------------------+
| App |
| pPPAPPp |
| APP PPa |
| APA pPP PapA PapA |
| PPA APA pP P pP P |
| APPPPPPPA PPp Ap Ap Ap Ap |
| apPPA aPP P P |
| APA pPP p p |
| pPP PPA |
| PPp PPPp |
| |
| Created by: App Software |
| Email: info@appsoftware.nl |
| Web: http://www.appsoftware.nl/ |
| |
+-----------------------------------------------------*/
public class ComputeProgram {
private final static Logger logger = LoggerFactory.getLogger(Renderer.class);
protected GL4 gl;
private int shaderProgram;
private int computeShader;
private Map<String, Integer> uniformLocations = new HashMap<>();
private Map<String, Integer> attribLocations = new HashMap<>();
public ComputeProgram(GL4 gl, String compute) {
this.gl = gl;
computeShader = createAndCompileShader(GL4.GL_COMPUTE_SHADER, compute);
shaderProgram = gl.glCreateProgram();
gl.glAttachShader(shaderProgram, computeShader);
gl.glLinkProgram(shaderProgram);
}
public int getUniformLocation(String uniform) {
Integer result = uniformLocations.get(uniform);
if (result == null) {
result = gl.glGetUniformLocation(shaderProgram, uniform);
uniformLocations.put(uniform, result);
}
return result;
}
public int getAttribLocation(String attrib) {
Integer result = attribLocations.get(attrib);
if (result == null) {
result = gl.glGetAttribLocation(shaderProgram, attrib);
attribLocations.put(attrib, result);
}
return result;
}
public void bindAttributeLocation(int location, String name) {
gl.glBindAttribLocation(shaderProgram, location, name);
}
public void begin() {
gl.glUseProgram(shaderProgram);
}
public void compute(int x, int y, int z) {
gl.glDispatchCompute(x, y, z);
}
public void end() {
gl.glUseProgram(0);
}
public void dispose() {
gl.glDetachShader(shaderProgram, computeShader);
gl.glDeleteShader(computeShader);
gl.glDeleteProgram(shaderProgram);
}
private int createAndCompileShader(int type, String shaderString) {
int shader = gl.glCreateShader(type);
String[] vlines = new String[]{shaderString};
int[] vlengths = new int[]{vlines[0].length()};
gl.glShaderSource(shader, vlines.length, vlines, vlengths, 0);
gl.glCompileShader(shader);
int[] compiled = new int[1];
gl.glGetShaderiv(shader, GL2ES2.GL_COMPILE_STATUS, compiled, 0);
if (compiled[0] == 0) {
int[] logLength = new int[1];
gl.glGetShaderiv(shader, GL2ES2.GL_INFO_LOG_LENGTH, logLength, 0);
byte[] log = new byte[logLength[0]];
gl.glGetShaderInfoLog(shader, logLength[0], (int[]) null, 0, log, 0);
throw new IllegalStateException("Error compiling the shader: " + new String(log));
}
return shader;
}
}

View File

@@ -0,0 +1,131 @@
package com.persesgames.jogl.shader;
import com.persesgames.jogl.Renderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.media.opengl.GL2ES2;
import java.util.HashMap;
import java.util.Map;
/*-----------------------------------------------------+
| App |
| pPPAPPp |
| APP PPa |
| APA pPP PapA PapA |
| PPA APA pP P pP P |
| APPPPPPPA PPp Ap Ap Ap Ap |
| apPPA aPP P P |
| APA pPP p p |
| pPP PPA |
| PPp PPPp |
| |
| Created by: App Software |
| Email: info@appsoftware.nl |
| Web: http://www.appsoftware.nl/ |
| |
+-----------------------------------------------------*/
public class ShaderProgram {
private final static Logger logger = LoggerFactory.getLogger(Renderer.class);
private GL2ES2 gl;
private int shaderProgram;
private int vertShader;
private int fragShader;
private Map<String, Integer> uniformLocations = new HashMap<>();
private Map<String, Integer> attribLocations = new HashMap<>();
public ShaderProgram(GL2ES2 gl, String vertex, String fragment) {
this.gl = gl;
if (gl.isGL3core()) {
logger.info("GL3 core detected: explicit adding #version 130 to shaders");
vertex = "#version 130\n" + vertex;
fragment = "#version 130\n" + fragment;
}
vertShader = createAndCompileShader(GL2ES2.GL_VERTEX_SHADER, vertex);
fragShader = createAndCompileShader(GL2ES2.GL_FRAGMENT_SHADER, fragment);
shaderProgram = gl.glCreateProgram();
gl.glAttachShader(shaderProgram, vertShader);
gl.glAttachShader(shaderProgram, fragShader);
gl.glLinkProgram(shaderProgram);
}
public int getUniformLocation(String uniform) {
Integer result = uniformLocations.get(uniform);
if (result == null) {
result = gl.glGetUniformLocation(shaderProgram, uniform);
uniformLocations.put(uniform, result);
}
return result;
}
public int getAttribLocation(String attrib) {
Integer result = attribLocations.get(attrib);
if (result == null) {
result = gl.glGetAttribLocation(shaderProgram, attrib);
attribLocations.put(attrib, result);
}
return result;
}
public void bindAttributeLocation(int location, String name) {
gl.glBindAttribLocation(shaderProgram, location, name);
}
public void begin() {
gl.glUseProgram(shaderProgram);
}
public void end() {
gl.glUseProgram(0);
}
public void dispose() {
gl.glDetachShader(shaderProgram, vertShader);
gl.glDeleteShader(vertShader);
gl.glDetachShader(shaderProgram, fragShader);
gl.glDeleteShader(fragShader);
gl.glDeleteProgram(shaderProgram);
}
private int createAndCompileShader(int type, String shaderString) {
int shader = gl.glCreateShader(type);
String[] vlines = new String[]{shaderString};
int[] vlengths = new int[]{vlines[0].length()};
gl.glShaderSource(shader, vlines.length, vlines, vlengths, 0);
gl.glCompileShader(shader);
int[] compiled = new int[1];
gl.glGetShaderiv(shader, GL2ES2.GL_COMPILE_STATUS, compiled, 0);
if (compiled[0] == 0) {
int[] logLength = new int[1];
gl.glGetShaderiv(shader, GL2ES2.GL_INFO_LOG_LENGTH, logLength, 0);
byte[] log = new byte[logLength[0]];
gl.glGetShaderInfoLog(shader, logLength[0], (int[]) null, 0, log, 0);
throw new IllegalStateException("Error compiling the shader: " + new String(log));
}
return shader;
}
}