Jelajahi Sumber

Started restructuring materials, restored screen shaders in new renderer

Ivan Safrin 10 tahun lalu
induk
melakukan
e1bf75b509
36 mengubah file dengan 287 tambahan dan 178 penghapusan
  1. TEMPAT SAMPAH
      assets/default/default.pak
  2. 19 0
      assets/default/default/BlurH.frag
  3. 20 0
      assets/default/default/BlurV.frag
  4. 24 0
      assets/default/default/default.mat
  5. TEMPAT SAMPAH
      assets/default/hdr.pak
  6. 7 3
      assets/default/hdr/ExtractBloom.frag
  7. 11 11
      assets/default/hdr/HDRBloomH.frag
  8. 11 11
      assets/default/hdr/HDRBloomV.frag
  9. 2 1
      assets/default/hdr/HDRProcess.frag
  10. 3 2
      assets/default/hdr/HDRProcessBloom.frag
  11. 3 0
      assets/default/hdr/hdr.mat
  12. 8 4
      build/osx/TemplateApp/TemplateApp.xcodeproj/project.pbxproj
  13. 1 1
      build/osx/TemplateApp/TemplateApp/PolycodeTemplateApp.h
  14. 24 7
      build/osx/TemplateApp/TemplateApp/PolycodeTemplateApp.mm
  15. 3 18
      include/polycode/core/PolyCamera.h
  16. 1 0
      include/polycode/core/PolyMaterial.h
  17. 1 1
      include/polycode/core/PolyRenderer.h
  18. 3 2
      include/polycode/core/PolySceneRenderTexture.h
  19. 4 1
      include/polycode/core/PolyTexture.h
  20. 68 50
      src/core/PolyCamera.cpp
  21. 15 14
      src/core/PolyMaterial.cpp
  22. 2 10
      src/core/PolyMaterialManager.cpp
  23. 14 8
      src/core/PolyOpenGLGraphicsInterface.cpp
  24. 8 6
      src/core/PolyRenderer.cpp
  25. 0 1
      src/core/PolySceneEntityInstance.cpp
  26. 1 1
      src/core/PolySceneLight.cpp
  27. 1 0
      src/core/PolySceneManager.cpp
  28. 1 0
      src/core/PolySceneMesh.cpp
  29. 3 3
      src/core/PolySceneRenderTexture.cpp
  30. 1 0
      src/core/PolyShader.cpp
  31. 8 3
      src/core/PolyTexture.cpp
  32. 4 4
      src/ide/PolycodeEntityEditor.cpp
  33. 3 3
      src/ide/PolycodeIDEApp.cpp
  34. 3 3
      src/ide/PolycodeMaterialEditor.cpp
  35. 1 1
      src/ide/PolycodeMeshEditor.cpp
  36. 9 9
      src/ide/PolycodeProps.cpp

TEMPAT SAMPAH
assets/default/default.pak


+ 19 - 0
assets/default/default/BlurH.frag

@@ -0,0 +1,19 @@
+uniform sampler2D screenTexture;
+uniform float blurSize;
+varying vec2 texCoordVar;
+
+void main(void)
+{
+   vec4 sum = vec4(0.0);
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 4.0*blurSize, texCoordVar.y)) * 0.05;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 3.0*blurSize, texCoordVar.y)) * 0.09;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 2.0*blurSize, texCoordVar.y)) * 0.12;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - blurSize, texCoordVar.y)) * 0.15;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y)) * 0.16;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + blurSize, texCoordVar.y)) * 0.15;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 2.0*blurSize, texCoordVar.y)) * 0.12;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 3.0*blurSize, texCoordVar.y)) * 0.09;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 4.0*blurSize, texCoordVar.y)) * 0.05;
+   
+   gl_FragColor = sum;
+}

+ 20 - 0
assets/default/default/BlurV.frag

@@ -0,0 +1,20 @@
+uniform sampler2D screenTexture;
+uniform float blurSize;
+varying vec2 texCoordVar;
+
+void main(void)
+{
+   vec4 sum = vec4(0.0);
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y - 4.0*blurSize)) * 0.05;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y - 3.0*blurSize)) * 0.09;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y - 2.0*blurSize)) * 0.12;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y - blurSize)) * 0.15;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y)) * 0.16;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y + blurSize)) * 0.15;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y + 2.0*blurSize)) * 0.12;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y + 3.0*blurSize)) * 0.09;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y + 4.0*blurSize)) * 0.05;
+   
+   gl_FragColor = sum;
+
+}

+ 24 - 0
assets/default/default/default.mat

@@ -36,9 +36,33 @@
 		<shader type="glsl" name="InvertShader" screen="true">		
 			<vp source="default/ScreenShader.vert"/>
 			<fp source="default/Invert.frag"/>
+		</shader>	
+		<shader type="glsl" name="BlurHShader" screen="true">		
+			<vp source="default/ScreenShader.vert"/>
+			<fp source="default/BlurH.frag"/>
+		</shader>
+		<shader type="glsl" name="BlurVShader" screen="true">		
+			<vp source="default/ScreenShader.vert"/>
+			<fp source="default/BlurV.frag"/>
 		</shader>		
 	</shaders>	
 	<materials>
+		<material name="Blur">
+			<rendertargets type="rgba">
+				<rendertarget id="blurtarget" sizeMode="pixels" width="512" height="512"/>
+			</rendertargets>		
+			<shader name="BlurHShader">
+				<targettextures>
+					<targettexture mode="color" name="screenTexture"/>
+					<targettexture mode="out" id="blurtarget"/>					
+				</targettextures>				
+			</shader>
+			<shader name="BlurVShader">
+				<targettextures>
+					<targettexture mode="in" name="screenTexture" id="blurtarget"/>
+				</targettextures>				
+			</shader>			
+		</material>	
 		<material name="Invert">
 			<shader name="InvertShader">
 				<targettextures>			

TEMPAT SAMPAH
assets/default/hdr.pak


+ 7 - 3
assets/default/hdr/ExtractBloom.frag

@@ -1,12 +1,16 @@
 uniform sampler2D screenColorBuffer;
 uniform float brightThreshold;
- 
+varying vec2 texCoordVar;
+
 void main(void)
 {	
-	vec4 color =  texture2D(screenColorBuffer,gl_TexCoord[0].st);
+	vec4 color =  texture2D(screenColorBuffer, texCoordVar);
 	float lum = dot(vec4(0.30, 0.59, 0.11, 0.0), color);
+
     if (lum > brightThreshold)
         gl_FragColor = color;
     else
-        gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);		
+        gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);		
+
+
 }

+ 11 - 11
assets/default/hdr/HDRBloomH.frag

@@ -1,19 +1,19 @@
 uniform sampler2D screenTexture;
 uniform float blurSize;
- 
+varying vec2 texCoordVar;
+
 void main(void)
 {
-   vec2 vTexCoord = gl_TexCoord[0].st;
    vec4 sum = vec4(0.0);
-   sum += texture2D(screenTexture, vec2(vTexCoord.x - 4.0*blurSize, vTexCoord.y)) * 0.05;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x - 3.0*blurSize, vTexCoord.y)) * 0.09;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x - 2.0*blurSize, vTexCoord.y)) * 0.12;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x - blurSize, vTexCoord.y)) * 0.15;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x, vTexCoord.y)) * 0.16;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x + blurSize, vTexCoord.y)) * 0.15;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x + 2.0*blurSize, vTexCoord.y)) * 0.12;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x + 3.0*blurSize, vTexCoord.y)) * 0.09;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x + 4.0*blurSize, vTexCoord.y)) * 0.05;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 4.0*blurSize, texCoordVar.y)) * 0.05;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 3.0*blurSize, texCoordVar.y)) * 0.09;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 2.0*blurSize, texCoordVar.y)) * 0.12;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - blurSize, texCoordVar.y)) * 0.15;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y)) * 0.16;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + blurSize, texCoordVar.y)) * 0.15;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 2.0*blurSize, texCoordVar.y)) * 0.12;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 3.0*blurSize, texCoordVar.y)) * 0.09;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 4.0*blurSize, texCoordVar.y)) * 0.05;
    
    gl_FragColor = sum;
 }

+ 11 - 11
assets/default/hdr/HDRBloomV.frag

@@ -1,19 +1,19 @@
 uniform sampler2D screenTexture;
 uniform float blurSize;
- 
+varying vec2 texCoordVar;
+
 void main(void)
 {
-   vec2 vTexCoord = gl_TexCoord[0].st;
    vec4 sum = vec4(0.0);
-   sum += texture2D(screenTexture, vec2(vTexCoord.x, vTexCoord.y - 4.0*blurSize)) * 0.05;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x, vTexCoord.y - 3.0*blurSize)) * 0.09;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x, vTexCoord.y - 2.0*blurSize)) * 0.12;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x, vTexCoord.y - blurSize)) * 0.15;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x, vTexCoord.y)) * 0.16;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x, vTexCoord.y + blurSize)) * 0.15;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x, vTexCoord.y + 2.0*blurSize)) * 0.12;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x, vTexCoord.y + 3.0*blurSize)) * 0.09;
-   sum += texture2D(screenTexture, vec2(vTexCoord.x, vTexCoord.y + 4.0*blurSize)) * 0.05;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y - 4.0*blurSize)) * 0.05;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y - 3.0*blurSize)) * 0.09;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y - 2.0*blurSize)) * 0.12;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y - blurSize)) * 0.15;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y)) * 0.16;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y + blurSize)) * 0.15;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y + 2.0*blurSize)) * 0.12;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y + 3.0*blurSize)) * 0.09;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y + 4.0*blurSize)) * 0.05;
    
    gl_FragColor = sum;
 }

+ 2 - 1
assets/default/hdr/HDRProcess.frag

@@ -1,10 +1,11 @@
 uniform sampler2D screenColorBuffer;
 uniform float exposure;
+varying vec2 texCoordVar;
 
 void main(void)
 {
 	float brightMax = 1.0;
 	float YD = exposure * (exposure/brightMax + 1.0) / (exposure + 1.0);
-	gl_FragColor = texture2D(screenColorBuffer,gl_TexCoord[0].st) * YD;
+	gl_FragColor = texture2D(screenColorBuffer, texCoordVar) * YD;
 	gl_FragColor.a = 1.0;
 }

+ 3 - 2
assets/default/hdr/HDRProcessBloom.frag

@@ -2,13 +2,14 @@ uniform sampler2D baseTexture;
 uniform sampler2D bloomTexture;
 uniform float exposure;
 uniform float bloomFactor;
+varying vec2 texCoordVar;
 
 void main(void)
 {
 	float brightMax = 1.0;
 	
-	vec4 colorBloom = texture2D(bloomTexture, gl_TexCoord[0].st);
-	vec4 color = texture2D(baseTexture,gl_TexCoord[0].st);
+	vec4 colorBloom = texture2D(bloomTexture, texCoordVar);
+	vec4 color = texture2D(baseTexture, texCoordVar);
 	
 	color += colorBloom * bloomFactor;
 //	color = colorBloom * bloomFactor;

+ 3 - 0
assets/default/hdr/hdr.mat

@@ -41,6 +41,9 @@
 		</material>									
 		<material name="HDRProcess" screen="true">
 			<shader name="HDRProcessShader">
+				<targettextures>			
+					<targettexture mode="color" name="screenColorBuffer"/>
+				</targettextures>			
 			</shader>
 		</material>	
 		<material name="HDRProcessBloom" screen="true">

+ 8 - 4
build/osx/TemplateApp/TemplateApp.xcodeproj/project.pbxproj

@@ -8,6 +8,8 @@
 
 /* Begin PBXBuildFile section */
 		6D6FD3E11BF122A2005AA8E9 /* PolycodeView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6D6FD3E01BF122A2005AA8E9 /* PolycodeView.mm */; };
+		6DCDD7231C71B150007E90E1 /* hdr.pak in Resources */ = {isa = PBXBuildFile; fileRef = 6DCDD7221C71B150007E90E1 /* hdr.pak */; };
+		6DCDD7251C724726007E90E1 /* main_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 6DCDD7241C724726007E90E1 /* main_icon.png */; };
 		6DD2D0B61BEEDC150026D85C /* libportaudio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DD2D0B51BEEDC150026D85C /* libportaudio.a */; };
 		8A825F271B82A2680039E823 /* libportaudio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A825F261B82A2680039E823 /* libportaudio.a */; };
 		8A825F291B82A29B0039E823 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A825F281B82A29B0039E823 /* CoreAudio.framework */; };
@@ -30,11 +32,12 @@
 		8A86536B1B729559009F94DD /* PolycodeTemplateApp.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A86536A1B729559009F94DD /* PolycodeTemplateApp.mm */; };
 		8A8653701B72C431009F94DD /* default.pak in Resources */ = {isa = PBXBuildFile; fileRef = 8A86536F1B72C431009F94DD /* default.pak */; };
 		8A8653961B752DBE009F94DD /* main_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 8A8653951B752DBE009F94DD /* main_icon.png */; };
-		8A9D4BE31BF25DE0002FD7DD /* BUGSHUFFLE.ogg in Resources */ = {isa = PBXBuildFile; fileRef = 8A9D4BE21BF25DE0002FD7DD /* BUGSHUFFLE.ogg */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXFileReference section */
 		6D6FD3E01BF122A2005AA8E9 /* PolycodeView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = PolycodeView.mm; path = ../../../../src/view/osx/PolycodeView.mm; sourceTree = "<group>"; };
+		6DCDD7221C71B150007E90E1 /* hdr.pak */ = {isa = PBXFileReference; lastKnownFileType = file; name = hdr.pak; path = ../../../../assets/default/hdr.pak; sourceTree = "<group>"; };
+		6DCDD7241C724726007E90E1 /* main_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = main_icon.png; path = ../../../../assets/icons/main_icon.png; sourceTree = "<group>"; };
 		6DD2D0B51BEEDC150026D85C /* libportaudio.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libportaudio.a; path = ../../../../lib/osx/libportaudio.a; sourceTree = "<group>"; };
 		8A825F261B82A2680039E823 /* libportaudio.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libportaudio.a; path = ../../../../lib/osx/libportaudio.a; sourceTree = "<group>"; };
 		8A825F281B82A29B0039E823 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
@@ -62,7 +65,6 @@
 		8A86536E1B72C301009F94DD /* PolycodeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PolycodeView.h; path = ../../../../include/polycode/view/osx/PolycodeView.h; sourceTree = "<group>"; };
 		8A86536F1B72C431009F94DD /* default.pak */ = {isa = PBXFileReference; lastKnownFileType = file; name = default.pak; path = ../../../../assets/default/default.pak; sourceTree = "<group>"; };
 		8A8653951B752DBE009F94DD /* main_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = main_icon.png; path = ../../../../assets/icons/main_icon.png; sourceTree = "<group>"; };
-		8A9D4BE21BF25DE0002FD7DD /* BUGSHUFFLE.ogg */ = {isa = PBXFileReference; lastKnownFileType = file; name = BUGSHUFFLE.ogg; path = ../../../../../Hellmouth/Resources/Sounds/music/BUGSHUFFLE.ogg; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -116,11 +118,12 @@
 			children = (
 				8A8653691B729559009F94DD /* PolycodeTemplateApp.h */,
 				8A86536A1B729559009F94DD /* PolycodeTemplateApp.mm */,
+				6DCDD7241C724726007E90E1 /* main_icon.png */,
 				8A8653351B72931C009F94DD /* AppDelegate.h */,
 				8A8653361B72931C009F94DD /* AppDelegate.m */,
 				6D6FD3E01BF122A2005AA8E9 /* PolycodeView.mm */,
-				8A9D4BE21BF25DE0002FD7DD /* BUGSHUFFLE.ogg */,
 				8A86536E1B72C301009F94DD /* PolycodeView.h */,
+				6DCDD7221C71B150007E90E1 /* hdr.pak */,
 				8A86536F1B72C431009F94DD /* default.pak */,
 				8A86533A1B72931C009F94DD /* Images.xcassets */,
 				8A8653951B752DBE009F94DD /* main_icon.png */,
@@ -210,7 +213,8 @@
 				8A86533B1B72931C009F94DD /* Images.xcassets in Resources */,
 				8A8653961B752DBE009F94DD /* main_icon.png in Resources */,
 				8A86533E1B72931C009F94DD /* MainMenu.xib in Resources */,
-				8A9D4BE31BF25DE0002FD7DD /* BUGSHUFFLE.ogg in Resources */,
+				6DCDD7251C724726007E90E1 /* main_icon.png in Resources */,
+				6DCDD7231C71B150007E90E1 /* hdr.pak in Resources */,
 				8A8653701B72C431009F94DD /* default.pak in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;

+ 1 - 1
build/osx/TemplateApp/TemplateApp/PolycodeTemplateApp.h

@@ -17,6 +17,6 @@ public:
     bool Update();
     
 private:
-
+    ScenePrimitive *test ;
     Core *core;
 };

+ 24 - 7
build/osx/TemplateApp/TemplateApp/PolycodeTemplateApp.mm

@@ -11,20 +11,33 @@ PolycodeTemplateApp::PolycodeTemplateApp(PolycodeView *view) {
     core->addFileSource("archive", "default.pak");
     ResourcePool *globalPool = Services()->getResourceManager()->getGlobalPool();
     globalPool->loadResourcesFromFolder("default", true);
+
+    core->addFileSource("archive", "hdr.pak");
+    globalPool->loadResourcesFromFolder("hdr", true);
+    
     
 	// Write your code here!
     
     Scene *scene = new Scene(Scene::SCENE_2D);
     scene->useClearColor = true;
-    
-    ScenePrimitive *test = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 10.0, 10.0);
-    test->setMaterialByName("UnlitUntextured");
-    test->color = Color(1.0, 0.0, 0.0, 1.0);
-    test->enableScissor = true;
-    test->scissorBox.setRect(100, 50, 100, 30);
+    scene->clearColor.setColor(0.0, 0.0, 0.0, 1.0);
+    test = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 0.5, 0.5);
+    test->setMaterialByName("Unlit");
+    test->getShaderPass(0).shaderBinding->loadTextureForParam("diffuse", "main_icon.png");
+//    test->color = Color(2.0, 2.0, 2.0, 1.0);
     scene->addChild(test);
+
+
+    scene->getDefaultCamera()->setPostFilterByName("HDRProcessBloom");
+    Camera *camera = scene->getDefaultCamera();
+
+    camera->getShaderPass(0).shaderBinding->addParam(ProgramParam::PARAM_NUMBER, "brightThreshold")->setNumber(0.1);
+    camera->getShaderPass(1).shaderBinding->addParam(ProgramParam::PARAM_NUMBER, "blurSize")->setNumber(0.01);
+    camera->getShaderPass(2).shaderBinding->addParam(ProgramParam::PARAM_NUMBER, "blurSize")->setNumber(0.01);
+    camera->getShaderPass(3).shaderBinding->addParam(ProgramParam::PARAM_NUMBER, "bloomFactor")->setNumber(2.0);
+    camera->getShaderPass(3).shaderBinding->addParam(ProgramParam::PARAM_NUMBER, "exposure")->setNumber(0.7);
+    
     
-    scene->getDefaultCamera()->setPostFilterByName("Invert");
 //    Sound *music = new Sound("BUGSHUFFLE.ogg");
   //  music->Play();
     
@@ -40,5 +53,9 @@ PolycodeTemplateApp::~PolycodeTemplateApp() {
 }
 
 bool PolycodeTemplateApp::Update() {
+    Number elapsed = core->getElapsed();
+    
+    test->Roll(elapsed * 45.0);
+    
     return core->updateAndRender();
 }

+ 3 - 18
include/polycode/core/PolyCamera.h

@@ -190,22 +190,6 @@ namespace Polycode {
              * Binds target buffers and renders the scene in multiple passes based on the post filter material.
              */
 			void drawFilter(RenderBuffer *targetBuffer);
-			
-			/**
-			* Sets the exposure for the camera. The exposure value is passed automatically to  post material shaders using an "exposure" uniform.
-			* @param level The new exposure value.
-			*/						
-			void setExposureLevel(Number level) {
-				exposureLevel = level;
-			}
-			
-			/**
-			* Returns the camera's exposure value.
-			* @return Current exposure value.
-			*/									
-			Number getExposureLevel() {
-				return exposureLevel;
-			}
 
 			/**
 			* Sets the post-processing shader for the camera.
@@ -296,6 +280,9 @@ namespace Polycode {
 
             void renderFullScreenQuad(GPUDrawBuffer *drawBuffer, int shaderPass);
         
+            ShaderPass getShaderPass(unsigned int index);
+            unsigned int getNumShaderPasses();        
+        
 		protected:
         
             Mesh *screenQuadMesh;
@@ -313,8 +300,6 @@ namespace Polycode {
 
 			Number nearClipPlane;
 			Number farClipPlane;
-								
-			Number exposureLevel;
 			Number fov;
 
 			Number leftFrustum,rightFrustum,topFrustum,bottomFrustum;

+ 1 - 0
include/polycode/core/PolyMaterial.h

@@ -48,6 +48,7 @@ namespace Polycode {
             bool wireframe;
             unsigned short blendingMode;
             ShaderBinding* shaderBinding;
+            ShaderBinding* materialShaderBinding;
         
             std::vector<VertexDataArray*> attributeArrays;
     };

+ 1 - 1
include/polycode/core/PolyRenderer.h

@@ -181,7 +181,7 @@ namespace Polycode {
         Cubemap *createCubemap(Texture *t0, Texture *t1, Texture *t2, Texture *t3, Texture *t4, Texture *t5);
         Texture *createTexture(unsigned int width, unsigned int height, char *textureData, bool clamp, bool createMipmaps, int type, unsigned int filteringMode, unsigned int anisotropy, bool framebufferTexture);
         
-        RenderBuffer *createRenderBuffer(unsigned int width, unsigned int height, bool attachDepthBuffer);
+        RenderBuffer *createRenderBuffer(unsigned int width, unsigned int height, bool attachDepthBuffer, bool floatingPoint);
         void destroyRenderBuffer(RenderBuffer *buffer);
         
         void destroyTexture(Texture *texture);

+ 3 - 2
include/polycode/core/PolySceneRenderTexture.h

@@ -46,7 +46,7 @@ namespace Polycode {
 			* @param renderHeight Vertical size of the render texture.
 			* @param floatingPoint Pass true if you want fp16 target renders			
 			*/
-            SceneRenderTexture(Scene *targetScene, Camera *targetCamera, int renderWidth,int renderHeight, unsigned int textureFormat = Image::IMAGE_RGBA);
+            SceneRenderTexture(Scene *targetScene, Camera *targetCamera, int renderWidth,int renderHeight, bool floatingPoint);
 			virtual ~SceneRenderTexture();
 						
 			/**
@@ -76,8 +76,9 @@ namespace Polycode {
 			
 		protected:
         
+            bool floatingPoint;
+        
             Renderer *renderer;
-            unsigned int textureFormat;
             RenderBuffer *targetFramebuffer;
         
 			Scene *targetScene;

+ 4 - 1
include/polycode/core/PolyTexture.h

@@ -66,7 +66,7 @@ namespace Polycode {
     
     class _PolyExport RenderBuffer {
         public:
-            RenderBuffer(unsigned int width, unsigned int height, bool attachDepthBuffer);
+            RenderBuffer(unsigned int width, unsigned int height, bool attachDepthBuffer, bool floatingPoint);
 
             unsigned int getWidth();
             unsigned int getHeight();
@@ -76,8 +76,11 @@ namespace Polycode {
 
             void *platformData;
             void *depthBufferPlatformData;
+    
         private:
         
+            bool floatingPoint;
+        
             unsigned int width;
             unsigned int height;
     };

+ 68 - 50
src/core/PolyCamera.cpp

@@ -30,6 +30,7 @@
 #include "polycode/core/PolyScene.h"
 #include "polycode/core/PolyShader.h"
 #include "polycode/core/PolyTexture.h"
+#include "polycode/core/PolyLogger.h"
 #include "polycode/core/PolyGPUDrawBuffer.h"
 
 using namespace Polycode;
@@ -41,7 +42,6 @@ Camera::Camera(Scene *parentScene) : Entity() {
 	setFOV(45.0f);
 	filterShaderMaterial = NULL;
 	originalFramebuffer = NULL;
-	exposureLevel = 1.0f;
 	_hasFilterShader = false;
 	frustumCulling = true;
 	nearClipPlane = 1.0;
@@ -298,7 +298,6 @@ void Camera::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) co
 	cloneCamera->setOrthoSize(orthoSizeX, orthoSizeY);
 	cloneCamera->projectionMode = projectionMode;
 	cloneCamera->setClippingPlanes(nearClipPlane, farClipPlane);
-    cloneCamera->setExposureLevel(exposureLevel);
 }
 
 Scene *Camera::getParentScene() const {
@@ -334,14 +333,57 @@ void Camera::setPostFilter(Material *material) {
     this->filterShaderMaterial = material;
 
     if(!originalFramebuffer) {
-        originalFramebuffer = Services()->getRenderer()->createRenderBuffer(CoreServices::getInstance()->getCore()->getXRes(), CoreServices::getInstance()->getCore()->getYRes(), true);
+        originalFramebuffer = Services()->getRenderer()->createRenderBuffer(CoreServices::getInstance()->getCore()->getXRes() * renderer->getBackingResolutionScaleX(), CoreServices::getInstance()->getCore()->getYRes() * renderer->getBackingResolutionScaleY(), true, material->fp16RenderTargets);
     }
     
+    if(!screenQuadMesh) {
+        screenQuadMesh = new Mesh(Mesh::TRI_MESH);
+        
+        screenQuadMesh->addVertexWithUV(1.0, 1.0, 0.0, 1.0, 1.0);
+        screenQuadMesh->addVertexWithUV(1.0, -1.0, 0.0, 1.0, 0.0);
+        screenQuadMesh->addVertexWithUV(-1.0, -1.0, 0.0, 0.0, 0.0);
+        
+        screenQuadMesh->addVertexWithUV(-1.0, -1.0, 0.0, 0.0, 0.0);
+        screenQuadMesh->addVertexWithUV(-1.0, 1.0, 0.0, 0.0, 1.0);
+        screenQuadMesh->addVertexWithUV(1.0, 1.0, 0.0, 1.0, 1.0);
+        
+    }
+    
+    for(int i=0; i < shaderPasses.size(); i++)  {
+        delete shaderPasses[i].shaderBinding;
+    }
+    shaderPasses.clear();
+    
     for(int i=0; i < material->getNumShaderPasses(); i++)  {
+        
+        ShaderBinding* materialBinding = material->getShaderBinding(i);
+        
         ShaderPass shaderPass = material->getShaderPass(i);
+        shaderPass.materialShaderBinding = shaderPass.shaderBinding;
         shaderPass.shaderBinding = new ShaderBinding();
         shaderPass.shaderBinding->targetShader = shaderPass.shader;
+        shaderPass.setAttributeArraysFromMesh(screenQuadMesh);
         shaderPass.shaderBinding->resetAttributes = true;
+        
+        for(int j=0; j < materialBinding->getNumColorTargetBindings(); j++) {
+            RenderTargetBinding *colorBinding = materialBinding->getColorTargetBinding(j);
+            shaderPass.shaderBinding->setTextureForParam(colorBinding->name, originalFramebuffer->colorTexture);
+        }
+        
+        for(int j=0; j < materialBinding->getNumDepthTargetBindings(); j++) {
+            RenderTargetBinding *depthBinding = materialBinding->getDepthTargetBinding(j);
+            shaderPass.shaderBinding->setTextureForParam(depthBinding->name, originalFramebuffer->depthTexture);
+        }
+        
+        for(int j=0; j < materialBinding->getNumInTargetBindings(); j++) {
+            RenderTargetBinding *inBinding = materialBinding->getInTargetBinding(j);
+            if(inBinding->buffer) {
+                shaderPass.shaderBinding->setTextureForParam(inBinding->name, inBinding->buffer->colorTexture);
+            } else {
+                Logger::log("WARNING: Post filter IN target ["+ inBinding->name + "] does not exist!\n");
+            }
+        }
+        
         shaderPasses.push_back(shaderPass);
     }
     
@@ -352,67 +394,44 @@ bool Camera::hasFilterShader() {
 	return _hasFilterShader;
 }
 
+ShaderPass Camera::getShaderPass(unsigned int index) {
+    if(index >= shaderPasses.size()) {
+        printf("WARNING: ACCESSING NON EXISTING SHADER PASS!\n");
+        return ShaderPass();
+    }
+    return shaderPasses[index];
+}
+
+unsigned int Camera::getNumShaderPasses() {
+    return shaderPasses.size();
+}
+
 void Camera::renderFullScreenQuad(GPUDrawBuffer *drawBuffer, int shaderPass) {
     GPUDrawCall drawCall;
-    
-    if(!screenQuadMesh) {
-        screenQuadMesh = new Mesh(Mesh::TRI_MESH);
-        
-        screenQuadMesh->addVertexWithUV(1.0, 1.0, 0.0, 1.0, 1.0);
-        screenQuadMesh->addVertexWithUV(1.0, -1.0, 0.0, 1.0, 0.0);
-        screenQuadMesh->addVertexWithUV(-1.0, -1.0, 0.0, 0.0, 0.0);
-        
-        screenQuadMesh->addVertexWithUV(-1.0, -1.0, 0.0, 0.0, 0.0);
-        screenQuadMesh->addVertexWithUV(-1.0, 1.0, 0.0, 0.0, 1.0);
-        screenQuadMesh->addVertexWithUV(1.0, 1.0, 0.0, 1.0, 1.0);
-    }
-    
     drawCall.options.alphaTest = false;
-    drawCall.options.backfaceCull = true;
+    drawCall.options.backfaceCull = false;
     drawCall.options.depthTest = false;
     drawCall.options.depthWrite = false;
     drawCall.mesh = screenQuadMesh;
     drawCall.material = filterShaderMaterial;
     drawCall.shaderPasses.push_back(shaderPasses[shaderPass]);
-    
     drawBuffer->drawCalls.push_back(drawCall);
 }
 
 void Camera::drawFilter(RenderBuffer *targetBuffer) {
 	if(!filterShaderMaterial)
 		return;
-
-    RenderBuffer *finalTargetBuffer = NULL;
-		
-	if(targetBuffer) {
-        finalTargetBuffer = targetBuffer;
-        Polycode::Rectangle newVP(0.0, 0.0, targetBuffer->getWidth(), targetBuffer->getHeight());
-        setViewport(newVP);
-	} else {
-        finalTargetBuffer = originalFramebuffer;
-	}
-
-    parentScene->Render(this, finalTargetBuffer, NULL, true);
     
-	ShaderBinding* materialBinding;
-	for(int i=0; i < filterShaderMaterial->getNumShaderPasses(); i++) {
-        
-        materialBinding = filterShaderMaterial->getShaderPass(i).shaderBinding;
+    parentScene->Render(this, originalFramebuffer, NULL, true);
+    
+	for(int i=0; i < shaderPasses.size(); i++) {
         
-		for(int j=0; j < materialBinding->getNumColorTargetBindings(); j++) {
-			RenderTargetBinding *colorBinding = materialBinding->getColorTargetBinding(j);
-            materialBinding->setTextureForParam(colorBinding->name, finalTargetBuffer->colorTexture);
-		}
-
-		for(int j=0; j < materialBinding->getNumDepthTargetBindings(); j++) {
-			RenderTargetBinding *depthBinding = materialBinding->getDepthTargetBinding(j);
-            materialBinding->setTextureForParam(depthBinding->name, finalTargetBuffer->depthTexture);
-		}
+        ShaderBinding* materialBinding = filterShaderMaterial->getShaderPass(i).shaderBinding;
 
-		if(i == filterShaderMaterial->getNumShaderPasses()-1) {
+		if(i == shaderPasses.size()-1) {
             GPUDrawBuffer *drawBuffer = new GPUDrawBuffer();
-            drawBuffer->clearColorBuffer = true;
-            drawBuffer->clearDepthBuffer = true;
+            drawBuffer->clearColorBuffer = false;
+            drawBuffer->clearDepthBuffer = false;
             drawBuffer->globalMaterial = NULL;
             if(targetBuffer) {
                 drawBuffer->targetFramebuffer = targetBuffer;
@@ -423,14 +442,13 @@ void Camera::drawFilter(RenderBuffer *targetBuffer) {
             }
             renderFullScreenQuad(drawBuffer, i);
             renderer->processDrawBuffer(drawBuffer);
-		} else {
-            
+		} else {            
 			for(int j=0; j < materialBinding->getNumOutTargetBindings(); j++) {
 				RenderBuffer *bindingBuffer = materialBinding->getOutTargetBinding(j)->buffer;
 				if(bindingBuffer) {
                     GPUDrawBuffer *drawBuffer = new GPUDrawBuffer();
-                    drawBuffer->clearColorBuffer = true;
-                    drawBuffer->clearDepthBuffer = true;
+                    drawBuffer->clearColorBuffer = false;
+                    drawBuffer->clearDepthBuffer = false;
                     drawBuffer->globalMaterial = NULL;
 					drawBuffer->viewport.setRect(0.0, 0.0, bindingBuffer->getWidth(), bindingBuffer->getHeight());
                     drawBuffer->targetFramebuffer = bindingBuffer;

+ 15 - 14
src/core/PolyMaterial.cpp

@@ -35,6 +35,7 @@ ShaderPass::ShaderPass() :
     shader(NULL),
     wireframe(false),
     shaderBinding(NULL),
+    materialShaderBinding(NULL),
     blendingMode(Renderer::BLEND_MODE_NONE)
 {
     
@@ -44,6 +45,7 @@ ShaderPass::ShaderPass(Shader *shader) :
     shader(shader),
     wireframe(false),
     shaderBinding(NULL),
+    materialShaderBinding(NULL),
     blendingMode(Renderer::BLEND_MODE_NONE)
 {
     
@@ -170,11 +172,10 @@ void Material::recreateRenderTargets() {
 
 void Material::recreateRenderTarget(ShaderRenderTarget *renderTarget) {
     
-    // RENDERER_TODO
-    /*
+
 	int textureWidth;
 	int textureHeight;
-	Texture *newTexture;
+	RenderBuffer *newBuffer;
 	
 	if(renderTarget->sizeMode == ShaderRenderTarget::SIZE_MODE_NORMALIZED) {
 		Number safeWidth = renderTarget->width;
@@ -193,24 +194,23 @@ void Material::recreateRenderTarget(ShaderRenderTarget *renderTarget) {
 			textureWidth = (int) (renderTarget->normalizedWidth * safeWidth);
 			textureHeight = (int) (renderTarget->normalizedHeight * safeHeight);		
 		} else {
-			textureWidth = (int) (CoreServices::getInstance()->getCore()->getXRes() * safeWidth);
-			textureHeight = (int) (CoreServices::getInstance()->getCore()->getYRes() * safeHeight);
+			textureWidth = (int) (CoreServices::getInstance()->getCore()->getXRes() * safeWidth * Services()->getRenderer()->getBackingResolutionScaleX());
+			textureHeight = (int) (CoreServices::getInstance()->getCore()->getYRes() * safeHeight * Services()->getRenderer()->getBackingResolutionScaleY());
 		}
 	} else {
 		textureWidth = (int)renderTarget->width;
 		textureHeight = (int)renderTarget->height;		
 	}
-	
-	CoreServices::getInstance()->getRenderer()->createRenderTextures(&newTexture, NULL, textureWidth, textureHeight, fp16RenderTargets);
     
-	newTexture->setResourceName(renderTarget->id);
+    newBuffer = Services()->getRenderer()->createRenderBuffer(textureWidth, textureHeight, false, fp16RenderTargets);
+//	newBuffer->setResourceName(renderTarget->id);
 	
-	Texture *oldTexture = renderTarget->texture;
-	renderTarget->texture = newTexture;
+	RenderBuffer *oldBuffer = renderTarget->buffer;
+	renderTarget->buffer = newBuffer;
 
-	if(oldTexture) {	
+    /*
+	if(oldBuffer) {
 		for(int i=0; i < shaderBindings.size(); i++) {
-				
 			for(int j=0; j < shaderBindings[i]->getNumRenderTargetBindings(); j++) {
 				if(shaderBindings[i]->getRenderTargetBinding(j)->texture == oldTexture) {
 					shaderBindings[i]->getRenderTargetBinding(j)->texture = newTexture;
@@ -222,14 +222,15 @@ void Material::recreateRenderTarget(ShaderRenderTarget *renderTarget) {
 		
 		CoreServices::getInstance()->getRenderer()->destroyTexture(oldTexture);
 	}
-    */
+*/
 }
 
 void Material::handleEvent(Event *event) {
-    recreateExpectedShaderParams();
+//    recreateExpectedShaderParams();
 }
 
 void Material::recreateExpectedShaderParams() {
+    return;
     for (int i = 0; i < shaderPasses.size(); i++) {
         
         Shader* shader = shaderPasses[i].shader;

+ 2 - 10
src/core/PolyMaterialManager.cpp

@@ -473,11 +473,8 @@ Material *MaterialManager::materialFromXMLNode(ResourcePool *resourcePool, TiXml
 					ShaderRenderTarget *newTarget = new ShaderRenderTarget;
 					newTarget->id = pChildElement->Attribute("id");
                     
-                    // RENDERER_TODO
-                    /*
-					newTarget->width = CoreServices::getInstance()->getRenderer()->getXRes();
-					newTarget->height = CoreServices::getInstance()->getRenderer()->getYRes();
-                    */
+                    newTarget->width = CoreServices::getInstance()->getCore()->getXRes();
+					newTarget->height = CoreServices::getInstance()->getCore()->getYRes();
                     
 					newTarget->sizeMode = ShaderRenderTarget::SIZE_MODE_PIXELS;					
 					if(pChildElement->Attribute("width") && pChildElement->Attribute("height")) {
@@ -578,11 +575,6 @@ Material *MaterialManager::materialFromXMLNode(ResourcePool *resourcePool, TiXml
 										newBinding->buffer = renderTargets[l]->buffer;
 									}
 								}
-								
-								if(newBinding->mode == RenderTargetBinding::MODE_IN) {
-                                    // RENDERER_TODO
-									//newShaderBinding->addTexture(newBinding->name, newBinding->texture);
-								}
 							}						
 						}
 					}					

+ 14 - 8
src/core/PolyOpenGLGraphicsInterface.cpp

@@ -335,13 +335,10 @@ void OpenGLGraphicsInterface::createRenderBuffer(RenderBuffer *renderBuffer) {
         glGenFramebuffers(1, (GLuint*)renderBuffer->platformData);
         glBindFramebuffer(GL_FRAMEBUFFER, *((GLuint*)renderBuffer->platformData));
     }
-
     
     renderBuffer->colorTexture->framebufferTexture = true;
-    renderBuffer->colorTexture->type = Image::IMAGE_RGBA;
     createTexture(renderBuffer->colorTexture);
     
-    
     if(renderBuffer->depthTexture) {
         renderBuffer->depthBufferPlatformData = (void*) new GLuint;
         glGenRenderbuffers(1, (GLuint*)renderBuffer->depthBufferPlatformData);
@@ -349,18 +346,24 @@ void OpenGLGraphicsInterface::createRenderBuffer(RenderBuffer *renderBuffer) {
         glRenderbufferStorage(GL_RENDERBUFFER, GL_COLOR_ATTACHMENT0, renderBuffer->getWidth(), renderBuffer->getHeight());
     }
     
-    
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *((GLuint*)renderBuffer->colorTexture->platformData), 0);
     
+    
     if(renderBuffer->depthTexture) {
         
         
         renderBuffer->depthTexture->framebufferTexture = true;
         renderBuffer->depthTexture->depthTexture = true;
+        renderBuffer->depthTexture->type = renderBuffer->colorTexture->type;
         renderBuffer->depthTexture->filteringMode = Texture::FILTERING_LINEAR;
         createTexture(renderBuffer->depthTexture);
         
-        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, renderBuffer->getWidth(), renderBuffer->getHeight());
+        if(renderBuffer->colorTexture->type == Image::IMAGE_FP16) {
+            glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, renderBuffer->getWidth(), renderBuffer->getHeight());
+            
+        } else {
+            glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, renderBuffer->getWidth(), renderBuffer->getHeight());
+        }
         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, *((GLuint*)renderBuffer->depthTexture->platformData), 0);
     }
     
@@ -368,6 +371,9 @@ void OpenGLGraphicsInterface::createRenderBuffer(RenderBuffer *renderBuffer) {
 }
 
 void OpenGLGraphicsInterface::destroyRenderBuffer(RenderBuffer *renderBuffer) {
+    if(!renderBuffer) {
+        return;
+    }
     glDeleteFramebuffers(1, (GLuint*)renderBuffer->platformData);
     if(renderBuffer->colorTexture) {
         destroyTexture(renderBuffer->colorTexture);
@@ -427,8 +433,8 @@ void OpenGLGraphicsInterface::createTexture(Texture *texture) {
             pixelType = GL_UNSIGNED_BYTE;
             break;
         case Image::IMAGE_FP16:
-            glTextureType = GL_RGB;
-            glTextureFormat = GL_RGB;
+            glTextureType = GL_RGBA;
+            glTextureFormat = GL_RGBA16F_ARB;
             pixelType = GL_FLOAT;
             break;
         default:
@@ -455,7 +461,7 @@ void OpenGLGraphicsInterface::createTexture(Texture *texture) {
     switch(texture->filteringMode) {
         case Texture::FILTERING_LINEAR:
             
-            if(texture->anisotropy > 0) {
+            if(texture->anisotropy > 0 && !texture->framebufferTexture) {
 #ifndef STRICT_OPENGLES2
                 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, texture->anisotropy);
 #endif

+ 8 - 6
src/core/PolyRenderer.cpp

@@ -167,8 +167,6 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
         if(buffer->globalMaterial && !buffer->drawCalls[i].options.forceMaterial) {
             material = buffer->globalMaterial;
         }
-
-        
         
         if(material) {
             
@@ -185,12 +183,17 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
                 graphicsInterface->beginDrawCall();
                 
                 ShaderPass shaderPass;
+
                 if(s < material->getNumShaderPasses()) {
                     shaderPass = material->getShaderPass(s);
                 } else {
                     shaderPass = buffer->drawCalls[i].shaderPasses[s];
                     graphicsInterface->setBlendingMode(shaderPass.blendingMode);
                 }
+                
+                //shaderPass = buffer->drawCalls[i].shaderPasses[s];
+                //graphicsInterface->setBlendingMode(shaderPass.blendingMode);
+                
                 ShaderBinding *localShaderBinding = buffer->drawCalls[i].shaderPasses[s].shaderBinding;
 
                 if(!shaderPass.shader || !localShaderBinding) {
@@ -198,10 +201,9 @@ void RenderThread::processDrawBuffer(GPUDrawBuffer *buffer) {
                 }
                 
                 graphicsInterface->useShader(shaderPass.shader);
-
                 graphicsInterface->setWireframeMode(shaderPass.wireframe);
                 
-                ShaderBinding *materialShaderBinding = material->getShaderBinding(s);
+                ShaderBinding *materialShaderBinding = shaderPass.materialShaderBinding;
 
                 // set global params
                 for(int p=0; p < shaderPass.shader->expectedParams.size(); p++) {
@@ -482,8 +484,8 @@ Texture *Renderer::createTexture(unsigned int width, unsigned int height, char *
     return texture;
 }
 
-RenderBuffer *Renderer::createRenderBuffer(unsigned int width, unsigned int height, bool attachDepthBuffer) {
-    RenderBuffer *buffer = new RenderBuffer(width, height, attachDepthBuffer);
+RenderBuffer *Renderer::createRenderBuffer(unsigned int width, unsigned int height, bool attachDepthBuffer, bool floatingPoint) {
+    RenderBuffer *buffer = new RenderBuffer(width, height, attachDepthBuffer, floatingPoint);
     renderThread->enqueueJob(RenderThread::JOB_CREATE_RENDER_BUFFER, (void*)buffer);
     return buffer;
 }

+ 0 - 1
src/core/PolySceneEntityInstance.cpp

@@ -492,7 +492,6 @@ Entity *SceneEntityInstance::loadObjectEntryIntoEntity(ObjectEntry *entry, Entit
             
 			Camera *camera = new Camera(parentScene);
             
-            camera->setExposureLevel((*cameraEntry)["exposure"]->NumberVal);
             camera->setClippingPlanes((*cameraEntry)["nearClip"]->NumberVal, (*cameraEntry)["farClip"]->NumberVal);
             camera->setOrthoMode((*cameraEntry)["ortho"]->boolVal);
             

+ 1 - 1
src/core/PolySceneLight.cpp

@@ -80,7 +80,7 @@ void SceneLight::enableShadows(bool val, unsigned int resolution) {
             Services()->getRenderer()->destroyRenderBuffer(shadowMapRenderBuffer);
         }
         
-        shadowMapRenderBuffer = Services()->getRenderer()->createRenderBuffer(resolution, resolution, true);
+        shadowMapRenderBuffer = Services()->getRenderer()->createRenderBuffer(resolution, resolution, true, false);
         
 		if(!spotCamera) {
 			spotCamera = new Camera(parentScene);

+ 1 - 0
src/core/PolySceneManager.cpp

@@ -86,6 +86,7 @@ void SceneManager::Render(const Polycode::Rectangle &viewport) {
 		if(scenes[i]->isEnabled() && !scenes[i]->isVirtual()) {
 			Scene *scene = scenes[i];
 			if(scene->getActiveCamera()->hasFilterShader()) {
+                scene->getActiveCamera()->setViewport(viewport);                
 				scene->getActiveCamera()->drawFilter(NULL);
 			} else {
                 scene->getActiveCamera()->setViewport(viewport);

+ 1 - 0
src/core/PolySceneMesh.cpp

@@ -207,6 +207,7 @@ void SceneMesh::setMaterial(Material *material) {
     
     for(int i=0; i < material->getNumShaderPasses(); i++)  {
         ShaderPass shaderPass = material->getShaderPass(i);
+        shaderPass.materialShaderBinding = shaderPass.shaderBinding;
         shaderPass.shaderBinding = new ShaderBinding();
         shaderPass.shaderBinding->targetShader = shaderPass.shader;
         shaderPass.shaderBinding->addParamPointer(ProgramParam::PARAM_COLOR, "entityColor", &color);

+ 3 - 3
src/core/PolySceneRenderTexture.cpp

@@ -30,9 +30,9 @@
 
 using namespace Polycode;
 
-SceneRenderTexture::SceneRenderTexture(Scene *targetScene, Camera *targetCamera, int renderWidth,int renderHeight, unsigned int textureFormat) : textureFormat(textureFormat) {
+SceneRenderTexture::SceneRenderTexture(Scene *targetScene, Camera *targetCamera, int renderWidth,int renderHeight, bool floatingPoint) : floatingPoint(floatingPoint) {
     
-    targetFramebuffer = Services()->getRenderer()->createRenderBuffer(renderWidth, renderHeight, true);
+    targetFramebuffer = Services()->getRenderer()->createRenderBuffer(renderWidth, renderHeight, true, floatingPoint);
     
 	this->targetScene = targetScene;
 	this->targetCamera = targetCamera;
@@ -47,7 +47,7 @@ void SceneRenderTexture::resizeRenderTexture(int newWidth, int newHeight) {
 
 	if(newWidth > 0 && newHeight > 0) {
         Services()->getRenderer()->destroyRenderBuffer(targetFramebuffer);
-        targetFramebuffer = Services()->getRenderer()->createRenderBuffer(newWidth, newHeight, true);
+        targetFramebuffer = Services()->getRenderer()->createRenderBuffer(newWidth, newHeight, true, floatingPoint);
 	}
 }
 	

+ 1 - 0
src/core/PolyShader.cpp

@@ -151,6 +151,7 @@ AttributeBinding *ShaderBinding::getAttributeBindingByName(const String &name) {
 
 
 LocalShaderParam * ShaderBinding::addParam(int type, const String& name) {
+
 	void *defaultData = ProgramParam::createParamData(type);
 	LocalShaderParam *newParam = new LocalShaderParam();
 	newParam->data = defaultData;

+ 8 - 3
src/core/PolyTexture.cpp

@@ -108,10 +108,15 @@ Texture::Texture(Image *image) : Resource(Resource::RESOURCE_TEXTURE) {
 
 }
 
-RenderBuffer::RenderBuffer(unsigned int width, unsigned int height, bool attachDepthBuffer) : platformData(NULL), width(width), height(height), depthBufferPlatformData(NULL) {
-    colorTexture = new Texture(width, height, NULL, false, false);
+RenderBuffer::RenderBuffer(unsigned int width, unsigned int height, bool attachDepthBuffer, bool floatingPoint) : platformData(NULL), width(width), height(height), depthBufferPlatformData(NULL), floatingPoint(floatingPoint) {
+    
+    int imageType = Image::IMAGE_RGBA;
+    if(floatingPoint) {
+        imageType = Image::IMAGE_FP16;
+    }
+    colorTexture = new Texture(width, height, NULL, false, false, imageType, true);
     if(attachDepthBuffer) {
-        depthTexture = new Texture(width, height, NULL, false, false);
+        depthTexture = new Texture(width, height, NULL, false, false, Image::IMAGE_RGBA, true);
     } else {
         depthTexture = NULL;
     }

+ 4 - 4
src/ide/PolycodeEntityEditor.cpp

@@ -481,7 +481,7 @@ void CameraPreviewWindow::Resize(Number width, Number height) {
         if(renderTexture) {
             delete renderTexture;
         }
-        renderTexture = new SceneRenderTexture(scene, camera, previewRect->getWidth(), previewRect->getHeight());
+        renderTexture = new SceneRenderTexture(scene, camera, previewRect->getWidth(), previewRect->getHeight(), false);
         previewRect->setTexture(renderTexture->getTargetTexture());
     }
     pinButton->setPosition(width-70, 3);
@@ -538,7 +538,7 @@ void CameraPreviewWindow::setCamera(Scene *scene, Camera *camera) {
         if(renderTexture) {
             delete renderTexture;
         }
-        renderTexture = new SceneRenderTexture(scene, camera, previewRect->getWidth(), previewRect->getHeight());
+        renderTexture = new SceneRenderTexture(scene, camera, previewRect->getWidth(), previewRect->getHeight(), false);
         previewRect->setTexture(renderTexture->getTargetTexture());
         
     } else {
@@ -563,7 +563,7 @@ EntityEditorMainView::EntityEditorMainView(PolycodeEditor *editor) {
 //    mainScene->getDefaultCamera()->frustumCulling = false;
 //    mainScene->doVisibilityChecking(false);
     
-	renderTexture = new SceneRenderTexture(mainScene, mainScene->getDefaultCamera(), 512, 512);
+	renderTexture = new SceneRenderTexture(mainScene, mainScene->getDefaultCamera(), 512, 512, false);
 	mainScene->clearColor.setColor(0.2, 0.2, 0.2, 1.0);	
 	mainScene->useClearColor = true;
 	mainScene->rootEntity.processInputEvents = true;
@@ -2364,7 +2364,7 @@ void PolycodeEntityEditor::saveEntityToObjectEntry(Entity *entity, ObjectEntry *
         
         ObjectEntry *cameraEntry = entry->addChild("Camera");
         
-        cameraEntry->addChild("exposure", camera->getExposureLevel());
+        //cameraEntry->addChild("exposure", camera->getExposureLevel());
         cameraEntry->addChild("nearClip", camera->getNearClippingPlane());
         cameraEntry->addChild("farClip", camera->getFarClippingPlane());
         cameraEntry->addChild("ortho", camera->getOrthoMode());

+ 3 - 3
src/ide/PolycodeIDEApp.cpp

@@ -32,10 +32,10 @@ Scene *globalScene;
 
 #ifdef _WINDOWS
 PolycodeIDEApp::PolycodeIDEApp(PolycodeWinIDEView *view) : EventDispatcher() {
-core = new POLYCODE_CORE((PolycodeWinIDEView*)view, 1100, 700,false,false, 0, 0,60, -1, true);
+core = new POLYCODE_CORE((PolycodeWinIDEView*)view, 1100, 700,false,false, 0, 0,60, -1, false);
 #else
 PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
-core = new POLYCODE_CORE((PolycodeView*)view, 1100, 700,false,false, 0, 0,60, -1, true);
+core = new POLYCODE_CORE((PolycodeView*)view, 1100, 700,false,false, 0, 0,60, -1, false);
 #endif
 	
 //	core->pauseOnLoseFocus = true;
@@ -1280,7 +1280,7 @@ void PolycodeIDEApp::applyFinalConfig() {
 		int newYRes = appHeight->intVal;		
 		if(newXRes > 100 && newYRes > 100) {
 			setResFromConfig = true;
-            core->setVideoMode(newXRes, newYRes, false, true, 0, 0);
+            core->setVideoMode(newXRes, newYRes, false, true, 0, 0, false);
 			frame->Resize(newXRes, newYRes);
 		}
 	}

+ 3 - 3
src/ide/PolycodeMaterialEditor.cpp

@@ -632,7 +632,7 @@ PostPreviewBox::PostPreviewBox() : UIElement() {
 	cameraExposureInput = new UITextInput(false, 40, 12);
 	addChild(cameraExposureInput);
 	cameraExposureInput->setPosition(370, 2);
-	cameraExposureInput->setText(String::NumberToString(previewScene->getDefaultCamera()->getExposureLevel()));	
+//	cameraExposureInput->setText(String::NumberToString(previewScene->getDefaultCamera()->getExposureLevel()));
 	cameraExposureInput->addEventListener(this, UIEvent::CHANGE_EVENT);
 
 	label = new UILabel("LIGHT INT.", 18, "section", Label::ANTIALIAS_FULL);
@@ -696,7 +696,7 @@ void PostPreviewBox::clearMaterial() {
 void PostPreviewBox::handleEvent(Event *event) {
 	if(event->getDispatcher() == cameraExposureInput && event->getEventCode() == UIEvent::CHANGE_EVENT) {
 		Number newExposure = atof(cameraExposureInput->getText().c_str());
-		previewScene->getDefaultCamera()->setExposureLevel(newExposure);
+		//previewScene->getDefaultCamera()->setExposureLevel(newExposure);
 	} else if(event->getDispatcher() == lightStrength && event->getEventCode() == UIEvent::CHANGE_EVENT) {
 		Number newStrength = atof(lightStrength->getText().c_str());
 		mainLight->setIntensity(newStrength);
@@ -708,7 +708,7 @@ MaterialPreviewBox::MaterialPreviewBox() : UIElement() {
 	currentMaterial = NULL;
 	previewScene = new Scene(Scene::SCENE_3D, true);	
 	
-	renderTexture = new SceneRenderTexture(previewScene, previewScene->getDefaultCamera(), 512, 512);
+	renderTexture = new SceneRenderTexture(previewScene, previewScene->getDefaultCamera(), 512, 512, false);
 	
 	ScenePrimitive *previewBg = new ScenePrimitive(ScenePrimitive::TYPE_BOX, 15.0, 15.0, 15.0);
 	previewBg->Yaw(45.0);

+ 1 - 1
src/ide/PolycodeMeshEditor.cpp

@@ -27,7 +27,7 @@ extern UIGlobalMenu *globalMenu;
 PolycodeMeshEditor::PolycodeMeshEditor() : PolycodeEditor(true){
 	
 	previewScene = new Scene(Scene::SCENE_3D, true);		
-	renderTexture = new SceneRenderTexture(previewScene, previewScene->getDefaultCamera(), 512, 512);
+	renderTexture = new SceneRenderTexture(previewScene, previewScene->getDefaultCamera(), 512, 512, false);
     
     ownsChildren = true;
 

+ 9 - 9
src/ide/PolycodeProps.cpp

@@ -1249,7 +1249,7 @@ MaterialProp::MaterialProp(const String &caption) : PropProp(caption, "Material"
 	}
 	previewScene->addChild(previewBg);
 	
-   	renderTexture = new SceneRenderTexture(previewScene, previewScene->getDefaultCamera(), 48*2, 48*2);
+   	renderTexture = new SceneRenderTexture(previewScene, previewScene->getDefaultCamera(), 48*2, 48*2, false);
     
 	previewScene->clearColor.setColor(0.1, 0.1, 0.1, 0.0);
 	previewScene->ambientColor.setColor(0.2, 0.2, 0.2, 1.0);
@@ -1677,7 +1677,7 @@ TargetBindingProp::TargetBindingProp(Shader *shader, Material *material, ShaderB
 	for(int i=0; i < material->getNumShaderRenderTargets(); i++) {
 		ShaderRenderTarget *target = material->getShaderRenderTarget(i);		
 		targetComboBox->addComboItem(target->id, (void*) target);
-		if(targetBinding->texture == target->texture) {
+		if(targetBinding->buffer == target->buffer) {
 			targetComboBox->setSelectedIndex(i);
 		}
 	}
@@ -1731,7 +1731,7 @@ void TargetBindingProp::handleEvent(Event *event) {
 		} else {
 			textureComboBox->enabled = true;
 			textureComboBox->visible = true;
-			binding->setTextureForParam(targetBinding->name, targetBinding->texture);
+			binding->setTextureForParam(targetBinding->name, targetBinding->buffer->colorTexture);
 		}		
 		
 		if(typeComboBox->getSelectedIndex() == 2 || typeComboBox->getSelectedIndex() == 3) {
@@ -1750,7 +1750,7 @@ void TargetBindingProp::handleEvent(Event *event) {
 		dispatchEvent(new Event(), Event::CHANGE_EVENT);
 	} else if(event->getDispatcher() == targetComboBox && event->getEventCode() == UIEvent::CHANGE_EVENT) {
 		ShaderRenderTarget *target = (ShaderRenderTarget*)targetComboBox->getSelectedItem()->data;		
-		targetBinding->texture = target->texture;
+		targetBinding->buffer = target->buffer;
 		targetBinding->id  = target->id;
 		
 		binding->removeRenderTargetBinding(targetBinding);		
@@ -1758,7 +1758,7 @@ void TargetBindingProp::handleEvent(Event *event) {
 
 		binding->removeParam(targetBinding->name);
 		if(targetBinding->mode == RenderTargetBinding::MODE_IN) {
-			binding->setTextureForParam(targetBinding->name, targetBinding->texture);
+			binding->setTextureForParam(targetBinding->name, targetBinding->buffer->colorTexture);
 		}
 		dispatchEvent(new Event(), Event::CHANGE_EVENT);		
 	} else if(event->getDispatcher() == textureComboBox && event->getEventCode() == UIEvent::CHANGE_EVENT) {
@@ -1768,7 +1768,7 @@ void TargetBindingProp::handleEvent(Event *event) {
 		binding->addRenderTargetBinding(targetBinding);		
 
 		binding->removeParam(targetBinding->name);
-		binding->setTextureForParam(targetBinding->name, targetBinding->texture);
+		binding->setTextureForParam(targetBinding->name, targetBinding->buffer->colorTexture);
 		dispatchEvent(new Event(), Event::CHANGE_EVENT);
 	}
 }
@@ -2040,7 +2040,7 @@ void TargetBindingsSheet::handleEvent(Event *event) {
 	if(event->getDispatcher() == addButton->getButton()) {
 		RenderTargetBinding* newBinding = new RenderTargetBinding();
 		newBinding->mode = RenderTargetBinding::MODE_COLOR;
-		newBinding->texture = NULL;		
+		newBinding->buffer = NULL;		
 		binding->addRenderTargetBinding(newBinding);				
 		refreshTargets();			
 		dispatchEvent(new Event(), Event::CHANGE_EVENT);
@@ -3348,7 +3348,7 @@ void CameraSheet::handleEvent(Event *event) {
         camera->setFOV(fovProp->get());
         dispatchEvent(new Event(), Event::CHANGE_EVENT);
     } else if(event->getDispatcher() == exposureProp) {
-        camera->setExposureLevel(exposureProp->get());
+      //  camera->setExposureLevel(exposureProp->get());
         dispatchEvent(new Event(), Event::CHANGE_EVENT);
     } else if(event->getDispatcher() == orthoProp) {
         camera->setOrthoMode(orthoProp->get());
@@ -3380,7 +3380,7 @@ void CameraSheet::setCamera(Camera *camera) {
     if(camera) {
         enabled = true;
         
-        exposureProp->set(camera->getExposureLevel());
+       // exposureProp->set(camera->getExposureLevel());
         orthoProp->set(camera->getOrthoMode());
         orthoWidthProp->set(camera->getOrthoSizeX());
         orthoHeightProp->set(camera->getOrthoSizeY());