Jelajahi Sumber

MAJOR MATERIAL SYSTEM CHANGES: Material properties now defined as shader parameters, shader parameters now created for all materials with default values, textures now must be referenced by full relative paths to resource directories, addArchive can now take folder as parameter. Object changes: string children now set as attributes instead of new nodes in XML. IDE: Basic Material file editor (will only edit/save materials for now)

Ivan Safrin 13 tahun lalu
induk
melakukan
6135171126
88 mengubah file dengan 1862 tambahan dan 868 penghapusan
  1. TEMPAT SAMPAH
      Assets/Default asset pack/default.pak
  2. 15 28
      Assets/Default asset pack/default/DefaultParticleShader.frag
  3. 15 13
      Assets/Default asset pack/default/DefaultShader.frag
  4. 13 9
      Assets/Default asset pack/default/DefaultShaderNoTexture.frag
  5. 19 15
      Assets/Default asset pack/default/DefaultShaderShadows.frag
  6. 3 1
      Assets/Default asset pack/default/DefaultShaderVertex.frag
  7. 22 15
      Assets/Default asset pack/default/DefaultShaderVertex.vert
  8. 3 1
      Assets/Default asset pack/default/DefaultShaderVertexNoTexture.frag
  9. 16 12
      Assets/Default asset pack/default/NorColSpec.frag
  10. 64 18
      Assets/Default asset pack/default/default.mat
  11. TEMPAT SAMPAH
      Assets/Default asset pack/hdr.pak
  12. 16 9
      Assets/Default asset pack/hdr/NorColSpecHDR.frag
  13. 19 10
      Assets/Default asset pack/hdr/hdr.mat
  14. 1 1
      Core/Contents/Include/PolyEventDispatcher.h
  15. 5 60
      Core/Contents/Include/PolyGLSLProgram.h
  16. 1 0
      Core/Contents/Include/PolyGLSLShader.h
  17. 2 14
      Core/Contents/Include/PolyGLSLShaderModule.h
  18. 6 5
      Core/Contents/Include/PolyMaterial.h
  19. 14 1
      Core/Contents/Include/PolyMaterialManager.h
  20. 6 2
      Core/Contents/Include/PolyRenderer.h
  21. 9 3
      Core/Contents/Include/PolyResourceManager.h
  22. 5 0
      Core/Contents/Include/PolySceneMesh.h
  23. 31 7
      Core/Contents/Include/PolyShader.h
  24. 9 6
      Core/Contents/Source/PolyEventDispatcher.cpp
  25. 4 23
      Core/Contents/Source/PolyGLRenderer.cpp
  26. 47 18
      Core/Contents/Source/PolyGLSLProgram.cpp
  27. 13 2
      Core/Contents/Source/PolyGLSLShader.cpp
  28. 50 379
      Core/Contents/Source/PolyGLSLShaderModule.cpp
  29. 41 6
      Core/Contents/Source/PolyMaterial.cpp
  30. 73 43
      Core/Contents/Source/PolyMaterialManager.cpp
  31. 7 8
      Core/Contents/Source/PolyObject.cpp
  32. 23 0
      Core/Contents/Source/PolyRenderer.cpp
  33. 36 30
      Core/Contents/Source/PolyResourceManager.cpp
  34. 11 0
      Core/Contents/Source/PolySceneMesh.cpp
  35. 7 4
      Core/Contents/Source/PolyScreenShape.cpp
  36. 12 13
      Core/Contents/Source/PolyShader.cpp
  37. 10 0
      IDE/Build/Mac OS X/Polycode.xcodeproj/project.pbxproj
  38. 5 0
      IDE/Contents/Include/PolycodeEditor.h
  39. 1 0
      IDE/Contents/Include/PolycodeIDEApp.h
  40. 8 1
      IDE/Contents/Include/PolycodeImageEditor.h
  41. 196 0
      IDE/Contents/Include/PolycodeMaterialEditor.h
  42. 2 1
      IDE/Contents/Include/PolycodeProjectEditor.h
  43. 1 4
      IDE/Contents/Include/PolycodeProjectManager.h
  44. 0 12
      IDE/Contents/Resources/FileTemplates/2D/Screen Entity.screen
  45. 0 12
      IDE/Contents/Resources/FileTemplates/2D/Screen.screen
  46. 0 0
      IDE/Contents/Resources/FileTemplates/Materials and Shaders/GLSL Fragment Shader.frag
  47. 0 0
      IDE/Contents/Resources/FileTemplates/Materials and Shaders/GLSL Vertex Shader.vert
  48. 0 4
      IDE/Contents/Resources/FileTemplates/Materials and Shaders/Material Library.mat
  49. 0 0
      IDE/Contents/Resources/FileTemplates/Scripts/Lua Script.lua
  50. TEMPAT SAMPAH
      IDE/Contents/Resources/Fonts/LeagueGothic-CondensedRegular.otf
  51. TEMPAT SAMPAH
      IDE/Contents/Resources/Fonts/LeagueGothic-Regular.otf
  52. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/box_icon.png
  53. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/cubemap_icon.png
  54. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/editorGrid.png
  55. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/material_bg.png
  56. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/material_editor_light.png
  57. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/material_grid.png
  58. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/material_icon.png
  59. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/new_cubemap.png
  60. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/new_material.png
  61. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/new_screenshader.png
  62. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/new_shader.png
  63. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/plane_icon.png
  64. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/screenshader_icon.png
  65. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/shader_icon.png
  66. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/small_selector.png
  67. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/sphere_icon.png
  68. TEMPAT SAMPAH
      IDE/Contents/Resources/Images/torus_icon.png
  69. 9 4
      IDE/Contents/Source/NewFileWindow.cpp
  70. 10 8
      IDE/Contents/Source/NewProjectWindow.cpp
  71. 6 5
      IDE/Contents/Source/PolycodeConsole.cpp
  72. 2 2
      IDE/Contents/Source/PolycodeFontEditor.cpp
  73. 7 7
      IDE/Contents/Source/PolycodeFrame.cpp
  74. 14 4
      IDE/Contents/Source/PolycodeIDEApp.cpp
  75. 55 3
      IDE/Contents/Source/PolycodeImageEditor.cpp
  76. 787 0
      IDE/Contents/Source/PolycodeMaterialEditor.cpp
  77. 6 1
      IDE/Contents/Source/PolycodeProject.cpp
  78. 14 8
      IDE/Contents/Source/PolycodeProjectEditor.cpp
  79. 12 0
      IDE/Contents/Source/PolycodeProjectManager.cpp
  80. 5 4
      IDE/Contents/Source/PolycodeScreenEditor.cpp
  81. 7 2
      Modules/Contents/UI/Include/PolyUIColorBox.h
  82. 7 2
      Modules/Contents/UI/Include/PolyUIComboBox.h
  83. 2 0
      Modules/Contents/UI/Include/PolyUITree.h
  84. 3 1
      Modules/Contents/UI/Include/PolyUIWindow.h
  85. 35 16
      Modules/Contents/UI/Source/PolyUIColorBox.cpp
  86. 22 5
      Modules/Contents/UI/Source/PolyUIComboBox.cpp
  87. 5 0
      Modules/Contents/UI/Source/PolyUITree.cpp
  88. 13 6
      Modules/Contents/UI/Source/PolyUIWindow.cpp

TEMPAT SAMPAH
Assets/Default asset pack/default.pak


+ 15 - 28
Assets/Default asset pack/default/DefaultParticleShader.frag

@@ -3,6 +3,10 @@ varying vec4 pos;
 varying vec4 vertexColor;
 varying vec4 vertexColor;
 uniform sampler2D diffuse;
 uniform sampler2D diffuse;
 
 
+uniform vec4 diffuse_color;
+uniform vec4 ambient_color;
+
+
 float calculateAttenuation(in int i, in float dist)
 float calculateAttenuation(in int i, in float dist)
 {
 {
     return(1.0 / (gl_LightSource[i].constantAttenuation +
     return(1.0 / (gl_LightSource[i].constantAttenuation +
@@ -10,11 +14,8 @@ float calculateAttenuation(in int i, in float dist)
                   gl_LightSource[i].quadraticAttenuation * dist * dist));
                   gl_LightSource[i].quadraticAttenuation * dist * dist));
 }
 }
 
 
-void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
-	vec4 lightspec = gl_LightSource[i].specular;
+void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse) {
+	vec4 color = diffuse_color;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
 	vec4 s = pos-lpos; 
 	vec4 sn = -normalize(s);
 	vec4 sn = -normalize(s);
@@ -31,18 +32,11 @@ void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout
 		float attenuation = calculateAttenuation(i, dist);
 		float attenuation = calculateAttenuation(i, dist);
 
 
 		diffuse  += color * max(0.0, nDotL) * gl_LightSource[i].diffuse * attenuation;
 		diffuse  += color * max(0.0, nDotL) * gl_LightSource[i].diffuse * attenuation;
-
-	  if (shininess != 0.0) {
-    	specular += lightspec * matspec * pow(max(0.0,dot(r, v)), shininess) * attenuation;
-	  }
 }
 }
 
 
 
 
-void spotLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
-	vec4 lightspec = gl_LightSource[i].specular;
+void spotLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse) {
+	vec4 color = diffuse_color;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
 	vec4 s = pos-lpos; 
 	vec4 sn = -normalize(s);
 	vec4 sn = -normalize(s);
@@ -67,17 +61,14 @@ void spotLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout
 		float attenuation = calculateAttenuation(i, dist);
 		float attenuation = calculateAttenuation(i, dist);
 		diffuse  += color * max(0.0, nDotL) * gl_LightSource[i].diffuse * attenuation * spot;
 		diffuse  += color * max(0.0, nDotL) * gl_LightSource[i].diffuse * attenuation * spot;
 
 
-	  if (shininess != 0.0) {
-    	specular += lightspec * matspec * pow(max(0.0,dot(r, v)), shininess) * attenuation * spot;
-	  }
 }
 }
 
 
-void doLights(in int numLights, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
+void doLights(in int numLights, in vec3 normal, in vec4 pos, inout vec4 diffuse) {
 	for (int i = 0; i < numLights; i++) {
 	for (int i = 0; i < numLights; i++) {
 		if (gl_LightSource[i].spotCutoff == 180.0) {
 		if (gl_LightSource[i].spotCutoff == 180.0) {
-			pointLight(i, normal, pos, diffuse, specular);
+			pointLight(i, normal, pos, diffuse);
 		} else {
 		} else {
-			spotLight(i, normal, pos, diffuse, specular);
+			spotLight(i, normal, pos, diffuse);
 		}
 		}
     }
     }
 }
 }
@@ -86,18 +77,14 @@ void doLights(in int numLights, in vec3 normal, in vec4 pos, inout vec4 diffuse,
 void main()
 void main()
 {
 {
 	vec4 diffuse_val  = vec4(0.0);
 	vec4 diffuse_val  = vec4(0.0);
-	vec4 specular_val = vec4(0.0);
-	doLights(6, normal, pos, diffuse_val, specular_val);
-	diffuse_val.a = 1.0;
-	specular_val.a = 1.0;
+	doLights(6, normal, pos, diffuse_val);
 		
 		
 	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);		
 	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);		
 		
 		
-    vec4 color = (diffuse_val  * 1.0) +
-                 (specular_val * 1.0)+
-                 gl_FrontMaterial.ambient;
+    vec4 color = diffuse_val + ambient_color;	
     color = clamp(color*vertexColor*texColor, 0.0, 1.0);
     color = clamp(color*vertexColor*texColor, 0.0, 1.0);
-    
+	color.a = diffuse_color.a * texColor.a;  
+
     // fog
     // fog
 	const float LOG2 = 1.442695;
 	const float LOG2 = 1.442695;
 	float z = gl_FragCoord.z / gl_FragCoord.w;
 	float z = gl_FragCoord.z / gl_FragCoord.w;

+ 15 - 13
Assets/Default asset pack/default/DefaultShader.frag

@@ -1,7 +1,12 @@
 varying vec3 normal;
 varying vec3 normal;
 varying vec4 pos;
 varying vec4 pos;
 varying vec4 vertexColor;
 varying vec4 vertexColor;
+
 uniform sampler2D diffuse;
 uniform sampler2D diffuse;
+uniform vec4 diffuse_color;
+uniform vec4 specular_color;
+uniform vec4 ambient_color;
+uniform float shininess;
 
 
 float calculateAttenuation(in int i, in float dist)
 float calculateAttenuation(in int i, in float dist)
 {
 {
@@ -11,9 +16,9 @@ float calculateAttenuation(in int i, in float dist)
 }
 }
 
 
 void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
 void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
+	vec4 color = diffuse_color;
+	vec4 matspec = specular_color;
+	float shininess = shininess;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
 	vec4 s = pos-lpos; 
@@ -41,9 +46,9 @@ void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout
 
 
 
 
 void spotLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
 void spotLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
+	vec4 color = diffuse_color;
+	vec4 matspec = specular_color;
+	float shininess = shininess;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
 	vec4 s = pos-lpos; 
@@ -92,16 +97,13 @@ void main()
 	vec4 diffuse_val  = vec4(0.0);
 	vec4 diffuse_val  = vec4(0.0);
 	vec4 specular_val = vec4(0.0);
 	vec4 specular_val = vec4(0.0);
 	doLights(6, normal, pos, diffuse_val, specular_val);
 	doLights(6, normal, pos, diffuse_val, specular_val);
-	diffuse_val.a = 1.0;
-	specular_val.a = 1.0;
 		
 		
 	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);		
 	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);		
 		
 		
-    vec4 color = (diffuse_val  * 1.0) +
-                 (specular_val * 1.0)+
-                 gl_FrontMaterial.ambient;
-    color = clamp(color*vertexColor*texColor, 0.0, 1.0);
-    
+    vec4 color = diffuse_val + ambient_color; 	           
+    color = clamp((color*vertexColor*texColor) + specular_val, 0.0, 1.0);
+    color.a = diffuse_color.a * texColor.a;
+
     // fog
     // fog
 	const float LOG2 = 1.442695;
 	const float LOG2 = 1.442695;
 	float z = gl_FragCoord.z / gl_FragCoord.w;
 	float z = gl_FragCoord.z / gl_FragCoord.w;

+ 13 - 9
Assets/Default asset pack/default/DefaultShaderNoTexture.frag

@@ -2,6 +2,11 @@ varying vec3 normal;
 varying vec4 pos;
 varying vec4 pos;
 varying vec4 vertexColor;
 varying vec4 vertexColor;
 
 
+uniform vec4 diffuse_color;
+uniform vec4 specular_color;
+uniform vec4 ambient_color;
+uniform float shininess;
+
 float calculateAttenuation(in int i, in float dist)
 float calculateAttenuation(in int i, in float dist)
 {
 {
     return(1.0 / (gl_LightSource[i].constantAttenuation +
     return(1.0 / (gl_LightSource[i].constantAttenuation +
@@ -10,9 +15,9 @@ float calculateAttenuation(in int i, in float dist)
 }
 }
 
 
 void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
 void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
+	vec4 color = diffuse_color;
+	vec4 matspec = specular_color;
+	float shininess = shininess;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
 	vec4 s = pos-lpos; 
@@ -40,9 +45,9 @@ void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout
 
 
 
 
 void spotLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
 void spotLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
+	vec4 color = diffuse_color;
+	vec4 matspec = specular_color;
+	float shininess = shininess;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
 	vec4 s = pos-lpos; 
@@ -91,12 +96,11 @@ void main()
 	vec4 diffuse_val  = vec4(0.0);
 	vec4 diffuse_val  = vec4(0.0);
 	vec4 specular_val = vec4(0.0);
 	vec4 specular_val = vec4(0.0);
 	doLights(6, normal, pos, diffuse_val, specular_val);
 	doLights(6, normal, pos, diffuse_val, specular_val);
-	diffuse_val.a = 1.0;
-	specular_val.a = 1.0;
 		
 		
     vec4 color = (diffuse_val  * 1.0) +
     vec4 color = (diffuse_val  * 1.0) +
                  (specular_val * 1.0)+
                  (specular_val * 1.0)+
-                 gl_FrontMaterial.ambient;
+                 ambient_color;
+	color.a = diffuse_color.a;                 
     color = clamp(color*vertexColor, 0.0, 1.0);
     color = clamp(color*vertexColor, 0.0, 1.0);
     
     
     // fog
     // fog

+ 19 - 15
Assets/Default asset pack/default/DefaultShaderShadows.frag

@@ -1,14 +1,21 @@
 varying vec3 normal;
 varying vec3 normal;
 varying vec4 pos;
 varying vec4 pos;
 varying vec4 vertexColor;
 varying vec4 vertexColor;
+varying vec4 ShadowCoord0;
+varying vec4 ShadowCoord1;
+
 uniform sampler2D diffuse;
 uniform sampler2D diffuse;
 uniform sampler2D shadowMap0;
 uniform sampler2D shadowMap0;
 uniform sampler2D shadowMap1;
 uniform sampler2D shadowMap1;
-varying vec4 ShadowCoord0;
-varying vec4 ShadowCoord1;
+
 uniform mat4 shadowMatrix0;
 uniform mat4 shadowMatrix0;
 uniform mat4 shadowMatrix1;
 uniform mat4 shadowMatrix1;
 
 
+uniform vec4 diffuse_color;
+uniform vec4 specular_color;
+uniform vec4 ambient_color;
+uniform float shininess;
+
 
 
 float calculateAttenuation(in int i, in float dist)
 float calculateAttenuation(in int i, in float dist)
 {
 {
@@ -18,9 +25,9 @@ float calculateAttenuation(in int i, in float dist)
 }
 }
 
 
 void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
 void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
+	vec4 color = diffuse_color;
+	vec4 matspec = specular_color;
+	float shininess = shininess;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
 	vec4 s = pos-lpos; 
@@ -56,9 +63,9 @@ void spotLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout
 	if (shadowCoordinateWdivide.x > 0.01 && shadowCoordinateWdivide.y > 0.01 && shadowCoordinateWdivide.x < 0.99 && shadowCoordinateWdivide.y < 0.99)
 	if (shadowCoordinateWdivide.x > 0.01 && shadowCoordinateWdivide.y > 0.01 && shadowCoordinateWdivide.x < 0.99 && shadowCoordinateWdivide.y < 0.99)
 		shadow = distanceFromLight < shadowCoordinateWdivide.z ? 0.0 : 1.0 ;
 		shadow = distanceFromLight < shadowCoordinateWdivide.z ? 0.0 : 1.0 ;
 	
 	
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
+	vec4 color = diffuse_color;
+	vec4 matspec = specular_color;
+	float shininess = shininess;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
 	vec4 s = pos-lpos; 
@@ -115,16 +122,13 @@ void main()
 	vec4 diffuse_val  = vec4(0.0);
 	vec4 diffuse_val  = vec4(0.0);
 	vec4 specular_val = vec4(0.0);
 	vec4 specular_val = vec4(0.0);
 	doLights(6, normal, pos, diffuse_val, specular_val);
 	doLights(6, normal, pos, diffuse_val, specular_val);
-	diffuse_val.a = 1.0;
-	specular_val.a = 1.0;
 		
 		
 	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);		
 	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);		
 		
 		
-    vec4 color = (diffuse_val  * 1.0) +
-                 (specular_val * 1.0)+
-                 gl_FrontMaterial.ambient;
-    color = clamp(color*vertexColor*texColor, 0.0, 1.0);
-    
+    vec4 color = diffuse_val + ambient_color;	
+    color = clamp((color*vertexColor*texColor) + specular_val, 0.0, 1.0);
+	color.a = diffuse_color.a * texColor.a;
+
     // fog
     // fog
 	const float LOG2 = 1.442695;
 	const float LOG2 = 1.442695;
 	float z = gl_FragCoord.z / gl_FragCoord.w;
 	float z = gl_FragCoord.z / gl_FragCoord.w;

+ 3 - 1
Assets/Default asset pack/default/DefaultShaderVertex.frag

@@ -1,10 +1,12 @@
 uniform sampler2D diffuse;
 uniform sampler2D diffuse;
 varying vec4 vertexColor;
 varying vec4 vertexColor;
+varying vec4 specularColor;
 
 
 void main()
 void main()
 {
 {
 	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);	
 	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);	
-    vec4 color = texColor*vertexColor;    
+    vec4 color = (texColor*vertexColor) + specularColor;    
+    color.a = vertexColor.a * texColor.a;
     
     
     // fog
     // fog
 	const float LOG2 = 1.442695;
 	const float LOG2 = 1.442695;

+ 22 - 15
Assets/Default asset pack/default/DefaultShaderVertex.vert

@@ -1,3 +1,8 @@
+uniform float shininess;
+uniform vec4 diffuse_color;
+uniform vec4 specular_color;
+uniform vec4 ambient_color;
+
 float calculateAttenuation(in int i, in float dist)
 float calculateAttenuation(in int i, in float dist)
 {
 {
     return(1.0 / (gl_LightSource[i].constantAttenuation +
     return(1.0 / (gl_LightSource[i].constantAttenuation +
@@ -6,14 +11,14 @@ float calculateAttenuation(in int i, in float dist)
 }
 }
 
 
 void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
 void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
+	vec4 color = diffuse_color;
+	vec4 matspec = specular_color;
+	float shininess = shininess;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
 	vec4 s = pos-lpos; 
 	vec4 sn = -normalize(s);
 	vec4 sn = -normalize(s);
-	
+
 	vec3 light = sn.xyz;
 	vec3 light = sn.xyz;
 	vec3 n = normalize(normal);
 	vec3 n = normalize(normal);
 	vec3 r = -reflect(light, n);
 	vec3 r = -reflect(light, n);
@@ -36,9 +41,9 @@ void pointLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout
 
 
 
 
 void spotLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
 void spotLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
+	vec4 color = diffuse_color;
+	vec4 matspec = specular_color;
+	float shininess = shininess;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
 	vec4 s = pos-lpos; 
@@ -58,7 +63,7 @@ void spotLight(in int i, in vec3 normal, in vec4 pos, inout vec4 diffuse, inout
 	float cos_inner_minus_outer_angle = cos_inner_cone_angle - cos_outer_cone_angle;
 	float cos_inner_minus_outer_angle = cos_inner_cone_angle - cos_outer_cone_angle;
 	float spot = 0.0;
 	float spot = 0.0;
 	spot = clamp((cos_cur_angle - cos_outer_cone_angle) / cos_inner_minus_outer_angle, 0.0, 1.0);
 	spot = clamp((cos_cur_angle - cos_outer_cone_angle) / cos_inner_minus_outer_angle, 0.0, 1.0);
-	       
+
 	float nDotL = dot(n, sn.xyz);
 	float nDotL = dot(n, sn.xyz);
 	if(nDotL > 0.0) {
 	if(nDotL > 0.0) {
 		float dist = length(s);    
 		float dist = length(s);    
@@ -82,6 +87,7 @@ void doLights(in int numLights, in vec3 normal, in vec4 pos, inout vec4 diffuse,
 }
 }
 
 
 varying vec4 vertexColor;
 varying vec4 vertexColor;
+varying vec4 specularColor;
 
 
 void main() {
 void main() {
 	vec3 normal = gl_NormalMatrix * gl_Normal;
 	vec3 normal = gl_NormalMatrix * gl_Normal;
@@ -90,15 +96,16 @@ void main() {
 	vec4 rawpos = gl_Vertex;
 	vec4 rawpos = gl_Vertex;
     vertexColor = gl_Color;
     vertexColor = gl_Color;
 	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
 	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
-	
+
 	vec4 diffuse_val  = vec4(0.0);
 	vec4 diffuse_val  = vec4(0.0);
 	vec4 specular_val = vec4(0.0);
 	vec4 specular_val = vec4(0.0);
 	doLights(6, normal, pos, diffuse_val, specular_val);
 	doLights(6, normal, pos, diffuse_val, specular_val);
-	diffuse_val.a = 1.0;
-	specular_val.a = 1.0;		
-		
-    vec4 color = (diffuse_val  * 1.0) +
-                 (specular_val * 1.0)+
-                 gl_FrontMaterial.ambient;
+	
+    vec4 color = diffuse_val +
+                 ambient_color;
+	
+	color.a = diffuse_color.a; 
+	specularColor = specular_val;
+	
     vertexColor = clamp(color*vertexColor, 0.0, 1.0);  	
     vertexColor = clamp(color*vertexColor, 0.0, 1.0);  	
 }
 }

+ 3 - 1
Assets/Default asset pack/default/DefaultShaderVertexNoTexture.frag

@@ -1,9 +1,11 @@
 
 
 varying vec4 vertexColor;
 varying vec4 vertexColor;
+varying vec4 specularColor;
 
 
 void main()
 void main()
 {
 {
-    vec4 color = vertexColor;
+    vec4 color = vertexColor + specularColor;
+    color.a = vertexColor.a;
     
     
     // fog
     // fog
 	const float LOG2 = 1.442695;
 	const float LOG2 = 1.442695;

+ 16 - 12
Assets/Default asset pack/default/NorColSpec.frag

@@ -3,10 +3,16 @@ varying vec3 tangent;
 varying vec3 binormal;
 varying vec3 binormal;
 varying vec4 pos;
 varying vec4 pos;
 varying vec4 vertexColor;
 varying vec4 vertexColor;
+
 uniform sampler2D diffuse;
 uniform sampler2D diffuse;
 uniform sampler2D normal_map;
 uniform sampler2D normal_map;
 uniform sampler2D specular_map;
 uniform sampler2D specular_map;
 
 
+uniform vec4 diffuse_color;
+uniform vec4 specular_color;
+uniform vec4 ambient_color;
+uniform float shininess;
+
 float calculateAttenuation(in int i, in float dist)
 float calculateAttenuation(in int i, in float dist)
 {
 {
     return(1.0 / (gl_LightSource[i].constantAttenuation +
     return(1.0 / (gl_LightSource[i].constantAttenuation +
@@ -15,9 +21,9 @@ float calculateAttenuation(in int i, in float dist)
 }
 }
 
 
 void pointLight(in int i, in vec3 bump, in vec3 normal, in vec3 tangent, in vec3 binormal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
 void pointLight(in int i, in vec3 bump, in vec3 normal, in vec3 tangent, in vec3 binormal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
+	vec4 color = diffuse_color;
+	vec4 matspec = specular_color;
+	float shininess = shininess;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	
 	
@@ -52,9 +58,9 @@ void pointLight(in int i, in vec3 bump, in vec3 normal, in vec3 tangent, in vec3
 
 
 
 
 void spotLight(in int i, in vec3 bump, in vec3 normal, in vec3 tangent, in vec3 binormal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
 void spotLight(in int i, in vec3 bump, in vec3 normal, in vec3 tangent, in vec3 binormal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
+	vec4 color = diffuse_color;
+	vec4 matspec = specular_color;
+	float shininess = shininess;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	
 	
@@ -124,17 +130,15 @@ void main()
 	doLights(6, bump, normal, tangent, binormal, pos, diffuse_val, specular_val);
 	doLights(6, bump, normal, tangent, binormal, pos, diffuse_val, specular_val);
 	
 	
 	specular_val.xyz *= texture2D(specular_map, gl_TexCoord[0].st).xyz * gl_FrontMaterial.specular.a;
 	specular_val.xyz *= texture2D(specular_map, gl_TexCoord[0].st).xyz * gl_FrontMaterial.specular.a;
-	
-	diffuse_val.a = 1.0;
-	specular_val.a = 1.0;
-		
+			
 	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);		
 	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);		
 		
 		
     vec4 color = (diffuse_val  * texColor * vertexColor) +
     vec4 color = (diffuse_val  * texColor * vertexColor) +
                  (specular_val * 1.0)+
                  (specular_val * 1.0)+
-                 (gl_FrontMaterial.ambient * texColor * vertexColor);
+                 (ambient_color * texColor * vertexColor);
     color = clamp(color, 0.0, 1.0);
     color = clamp(color, 0.0, 1.0);
-    
+    color.a = diffuse_color.a * texColor.a;
+
     // fog
     // fog
 	const float LOG2 = 1.442695;
 	const float LOG2 = 1.442695;
 	float z = gl_FragCoord.z / gl_FragCoord.w;
 	float z = gl_FragCoord.z / gl_FragCoord.w;

+ 64 - 18
Assets/Default asset pack/default/default.mat

@@ -7,17 +7,28 @@
 				</params>				
 				</params>				
 			</vp>
 			</vp>
 			<fp source="DefaultShader.frag">
 			<fp source="DefaultShader.frag">
-				<params>			
-				</params>				
+				<params>
+					<param type="Number" name="shininess" default="50.0" min="2.0" max="100.0"/>
+					<param type="Color" name="diffuse_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="specular_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="ambient_color" auto="true"/>			
+				</params>
+				<textures>
+					<texture name="diffuse"/>
+				</textures>
 			</fp>
 			</fp>
 		</shader>	
 		</shader>	
-		<shader type="glsl" name="DefaultShaderNoTexture" numAreaLights="4" numSpotLights="2">		
+		<shader type="glsl" name="DefaultShaderNoTexture" numAreaLights="4" numSpotLights="2">	
 			<vp source="DefaultShader.vert">
 			<vp source="DefaultShader.vert">
-				<params>			
+				<params>
 				</params>				
 				</params>				
 			</vp>
 			</vp>
 			<fp source="DefaultShaderNoTexture.frag">
 			<fp source="DefaultShaderNoTexture.frag">
-				<params>			
+				<params>
+					<param type="Number" name="shininess" default="50.0" min="2.0" max="100.0"/>
+					<param type="Color" name="diffuse_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="specular_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="ambient_color" auto="true"/>								
 				</params>				
 				</params>				
 			</fp>
 			</fp>
 		</shader>
 		</shader>
@@ -27,29 +38,47 @@
 				</params>				
 				</params>				
 			</vp>
 			</vp>
 			<fp source="DefaultShaderShadows.frag">
 			<fp source="DefaultShaderShadows.frag">
-				<params>			
-				</params>				
+				<params>
+					<param type="Number" name="shininess" default="50.0" min="2.0" max="100.0"/>
+					<param type="Color" name="diffuse_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="specular_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="ambient_color" auto="true"/>							
+				</params>
+				<textures>
+					<texture name="diffuse"/>
+				</textures>				
 			</fp>
 			</fp>
 		</shader>
 		</shader>
 		
 		
 		<shader type="glsl" name="DefaultShaderVertex" numAreaLights="4" numSpotLights="2">		
 		<shader type="glsl" name="DefaultShaderVertex" numAreaLights="4" numSpotLights="2">		
 			<vp source="DefaultShaderVertex.vert">
 			<vp source="DefaultShaderVertex.vert">
-				<params>			
+				<params>
+					<param type="Number" name="shininess" default="50.0" min="2.0" max="100.0"/>
+					<param type="Color" name="diffuse_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="specular_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="ambient_color" auto="true"/>				
 				</params>				
 				</params>				
 			</vp>
 			</vp>
 			<fp source="DefaultShaderVertex.frag">
 			<fp source="DefaultShaderVertex.frag">
-				<params>			
-				</params>				
+				<params>
+				</params>
+				<textures>
+					<texture name="diffuse"/>
+				</textures>
 			</fp>
 			</fp>
 		</shader>			
 		</shader>			
 		<shader type="glsl" name="DefaultShaderVertexNoTexture" numAreaLights="4" numSpotLights="2">		
 		<shader type="glsl" name="DefaultShaderVertexNoTexture" numAreaLights="4" numSpotLights="2">		
 			<vp source="DefaultShaderVertex.vert">
 			<vp source="DefaultShaderVertex.vert">
-				<params>			
+				<params>
+					<param type="Number" name="shininess" default="50.0" min="2.0" max="100.0"/>
+					<param type="Color" name="diffuse_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="specular_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="ambient_color" auto="true"/>											
 				</params>				
 				</params>				
 			</vp>
 			</vp>
 			<fp source="DefaultShaderVertexNoTexture.frag">
 			<fp source="DefaultShaderVertexNoTexture.frag">
-				<params>			
-				</params>				
+				<params>
+				</params>
 			</fp>
 			</fp>
 		</shader>			
 		</shader>			
 		
 		
@@ -59,8 +88,13 @@
 				</params>				
 				</params>				
 			</vp>
 			</vp>
 			<fp source="DefaultParticleShader.frag">
 			<fp source="DefaultParticleShader.frag">
-				<params>			
-				</params>				
+				<params>
+					<param type="Color" name="diffuse_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="ambient_color" auto="true"/>			
+				</params>
+				<textures>
+					<texture name="diffuse"/>
+				</textures>
 			</fp>
 			</fp>
 		</shader>															
 		</shader>															
 		<shader type="glsl" name="Unlit" numAreaLights="0" numSpotLights="0">		
 		<shader type="glsl" name="Unlit" numAreaLights="0" numSpotLights="0">		
@@ -70,7 +104,10 @@
 			</vp>
 			</vp>
 			<fp source="Unlit.frag">
 			<fp source="Unlit.frag">
 				<params>			
 				<params>			
-				</params>				
+				</params>
+				<textures>
+					<texture name="diffuse"/>
+				</textures>
 			</fp>
 			</fp>
 		</shader>
 		</shader>
 		<shader type="glsl" name="NorColSpec" numAreaLights="4" numSpotLights="2">		
 		<shader type="glsl" name="NorColSpec" numAreaLights="4" numSpotLights="2">		
@@ -79,8 +116,17 @@
 				</params>				
 				</params>				
 			</vp>
 			</vp>
 			<fp source="NorColSpec.frag">
 			<fp source="NorColSpec.frag">
-				<params>			
-				</params>				
+				<params>
+					<param type="Number" name="shininess" default="50.0" min="2.0" max="100.0"/>
+					<param type="Color" name="diffuse_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="specular_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="ambient_color" auto="true"/>							
+				</params>
+				<textures>
+					<texture name="diffuse"/>
+					<texture name="normal_map"/>
+					<texture name="specular_map"/>										
+				</textures>
 			</fp>
 			</fp>
 		</shader>											
 		</shader>											
 	</shaders>	
 	</shaders>	

TEMPAT SAMPAH
Assets/Default asset pack/hdr.pak


+ 16 - 9
Assets/Default asset pack/hdr/NorColSpecHDR.frag

@@ -7,6 +7,12 @@ uniform sampler2D diffuse;
 uniform sampler2D normal_map;
 uniform sampler2D normal_map;
 uniform sampler2D specular_map;
 uniform sampler2D specular_map;
 
 
+uniform vec4 diffuse_color;
+uniform vec4 specular_color;
+uniform vec4 ambient_color;
+uniform float shininess;
+
+
 float calculateAttenuation(in int i, in float dist)
 float calculateAttenuation(in int i, in float dist)
 {
 {
     return(1.0 / (gl_LightSource[i].constantAttenuation +
     return(1.0 / (gl_LightSource[i].constantAttenuation +
@@ -15,9 +21,9 @@ float calculateAttenuation(in int i, in float dist)
 }
 }
 
 
 void pointLight(in int i, in vec3 bump, in vec3 normal, in vec3 tangent, in vec3 binormal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
 void pointLight(in int i, in vec3 bump, in vec3 normal, in vec3 tangent, in vec3 binormal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
+	vec4 color = diffuse_color;
+	vec4 matspec = specular_color;
+	float shininess = shininess;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	
 	
@@ -52,9 +58,9 @@ void pointLight(in int i, in vec3 bump, in vec3 normal, in vec3 tangent, in vec3
 
 
 
 
 void spotLight(in int i, in vec3 bump, in vec3 normal, in vec3 tangent, in vec3 binormal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
 void spotLight(in int i, in vec3 bump, in vec3 normal, in vec3 tangent, in vec3 binormal, in vec4 pos, inout vec4 diffuse, inout vec4 specular) {
-	vec4 color = gl_FrontMaterial.diffuse;
-	vec4 matspec = gl_FrontMaterial.specular;
-	float shininess = gl_FrontMaterial.shininess;
+	vec4 color = diffuse_color;
+	vec4 matspec = specular_color;
+	float shininess = shininess;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lightspec = gl_LightSource[i].specular;
 	vec4 lpos = gl_LightSource[i].position;
 	vec4 lpos = gl_LightSource[i].position;
 	
 	
@@ -132,9 +138,10 @@ void main()
 		
 		
     vec4 color = (diffuse_val  * texColor * vertexColor) +
     vec4 color = (diffuse_val  * texColor * vertexColor) +
                  (specular_val * 1.0)+
                  (specular_val * 1.0)+
-                 (gl_FrontMaterial.ambient * texColor * vertexColor);
-//    color = clamp(color, 0.0, 1.0);
-    
+                 (ambient_color * texColor * vertexColor);
+
+    color.a = diffuse_color.a * texColor.a;
+
     // fog
     // fog
 	const float LOG2 = 1.442695;
 	const float LOG2 = 1.442695;
 	float z = gl_FragCoord.z / gl_FragCoord.w;
 	float z = gl_FragCoord.z / gl_FragCoord.w;

+ 19 - 10
Assets/Default asset pack/hdr/hdr.mat

@@ -7,11 +7,20 @@
 				</params>				
 				</params>				
 			</vp>
 			</vp>
 			<fp source="NorColSpecHDR.frag">
 			<fp source="NorColSpecHDR.frag">
-				<params>			
-				</params>				
+				<params>
+					<param type="Number" name="shininess" default="50.0" min="2.0" max="100.0"/>
+					<param type="Color" name="diffuse_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="specular_color" default="1.0 1.0 1.0 1.0"/>
+					<param type="Color" name="ambient_color" auto="true"/>							
+				</params>
+				<textures>
+					<texture name="diffuse"/>
+					<texture name="normal_map"/>
+					<texture name="specular_map"/>										
+				</textures>								
 			</fp>
 			</fp>
 		</shader>	
 		</shader>	
-		<shader type="glsl" name="HDRProcessShader">
+		<shader type="glsl" name="HDRProcessShader" screen="true">
 			<vp source="ScreenShader.vert"/>
 			<vp source="ScreenShader.vert"/>
 			<fp source="HDRProcess.frag">
 			<fp source="HDRProcess.frag">
 				<params>
 				<params>
@@ -19,7 +28,7 @@
 				</params>								
 				</params>								
 			</fp>
 			</fp>
 		</shader>		
 		</shader>		
-		<shader type="glsl" name="HDRProcessShaderBloom">
+		<shader type="glsl" name="HDRProcessShaderBloom" screen="true">
 			<vp source="ScreenShader.vert"/>
 			<vp source="ScreenShader.vert"/>
 			<fp source="HDRProcessBloom.frag">
 			<fp source="HDRProcessBloom.frag">
 				<params>
 				<params>
@@ -28,19 +37,19 @@
 				</params>								
 				</params>								
 			</fp>			
 			</fp>			
 		</shader>		
 		</shader>		
-		<shader type="glsl" name="HDRBloomH">
+		<shader type="glsl" name="HDRBloomH" screen="true">
 			<vp source="ScreenShader.vert"/>
 			<vp source="ScreenShader.vert"/>
 			<fp source="HDRBloomH.frag"/>
 			<fp source="HDRBloomH.frag"/>
 		</shader>
 		</shader>
-		<shader type="glsl" name="HDRBloomV">
+		<shader type="glsl" name="HDRBloomV" screen="true">
 			<vp source="ScreenShader.vert"/>
 			<vp source="ScreenShader.vert"/>
 			<fp source="HDRBloomV.frag"/>
 			<fp source="HDRBloomV.frag"/>
 		</shader>	
 		</shader>	
-		<shader type="glsl" name="PassThrough">
+		<shader type="glsl" name="PassThrough" screen="true">
 			<vp source="ScreenShader.vert"/>
 			<vp source="ScreenShader.vert"/>
 			<fp source="PassThrough.frag"/>
 			<fp source="PassThrough.frag"/>
 		</shader>	
 		</shader>	
-		<shader type="glsl" name="ExtractBloom">
+		<shader type="glsl" name="ExtractBloom" screen="true">
 			<vp source="ScreenShader.vert"/>
 			<vp source="ScreenShader.vert"/>
 			<fp source="ExtractBloom.frag">
 			<fp source="ExtractBloom.frag">
 				<params>
 				<params>
@@ -50,11 +59,11 @@
 		</shader>							
 		</shader>							
 	</shaders>
 	</shaders>
 	<materials>
 	<materials>
-		<material name="HDRProcess">
+		<material name="HDRProcess" screen="true">
 			<shader name="HDRProcessShader">
 			<shader name="HDRProcessShader">
 			</shader>
 			</shader>
 		</material>	
 		</material>	
-		<material name="HDRProcessBloom">
+		<material name="HDRProcessBloom" screen="true">
 			<rendertargets type="rgba_fp16">
 			<rendertargets type="rgba_fp16">
 				<rendertarget id="base_target"  sizeMode="normalized" width="1.0" height="1.0"/>			
 				<rendertarget id="base_target"  sizeMode="normalized" width="1.0" height="1.0"/>			
 				<rendertarget id="bloomtarget"  sizeMode="pixels" width="512" height="512"/>
 				<rendertarget id="bloomtarget"  sizeMode="pixels" width="512" height="512"/>

+ 1 - 1
Core/Contents/Include/PolyEventDispatcher.h

@@ -55,7 +55,7 @@ typedef struct {
 			* Removes all current event handlers from this dispatcher for a specific event listener.
 			* Removes all current event handlers from this dispatcher for a specific event listener.
 			* @param Event listener to remove handlers for.
 			* @param Event listener to remove handlers for.
 			*/			
 			*/			
-			void removeAllHandlersForListener(void *listener);
+			void removeAllHandlersForListener(EventHandler *handler);
 			
 			
 			/**
 			/**
 			* Adds an event listener for a specific event code. Once a listener is registered for a specific event code, that listener will start getting event callbacks into the handleEvent() method.
 			* Adds an event listener for a specific event code. Once a listener is registered for a specific event code, that listener will start getting event callbacks into the handleEvent() method.

+ 5 - 60
Core/Contents/Include/PolyGLSLProgram.h

@@ -25,68 +25,13 @@ THE SOFTWARE.
 #include "PolyGlobals.h"
 #include "PolyGlobals.h"
 #include "PolyString.h"
 #include "PolyString.h"
 #include "PolyResource.h"
 #include "PolyResource.h"
+#include "PolyShader.h"
 
 
 namespace Polycode {
 namespace Polycode {
 
 
-class _PolyExport GLSLProgramParam {
-	public:
-	
-	String name;
-	bool isAuto;
-	int autoID;
-	void *defaultData;
-	int paramType;
-	
-	static void *createParamData(int *retType, const String& type, const String& value);
-	
-	static const int POLY_MODELVIEWPROJ_MATRIX = 0;
-	static const int POLY_MODELVIEW_MATRIX = 2;
-	static const int POLY_MODELVIEW_INVERSE_MATRIX = 3;
-	static const int POLY_EXPOSURE_LEVEL = 7;
-	static const int POLY_CLEARCOLOR = 10;
-	static const int POLY_AMBIENTCOLOR = 11;	
-	
-	static const int POLY_AREA_LIGHT_POSITION_0 = 12;
-	static const int POLY_AREA_LIGHT_COLOR_0 = 13;	
-	static const int POLY_AREA_LIGHT_POSITION_1 = 14;
-	static const int POLY_AREA_LIGHT_COLOR_1 = 15;	
-	static const int POLY_AREA_LIGHT_POSITION_2 = 16;
-	static const int POLY_AREA_LIGHT_COLOR_2 = 17;	
-	static const int POLY_AREA_LIGHT_POSITION_3 = 18;
-	static const int POLY_AREA_LIGHT_COLOR_3 = 19;	
-	static const int POLY_AREA_LIGHT_POSITION_4 = 20;
-	static const int POLY_AREA_LIGHT_COLOR_4 = 21;	
-	static const int POLY_AREA_LIGHT_POSITION_5 = 22;
-	static const int POLY_AREA_LIGHT_COLOR_5 = 23;	
-	static const int POLY_AREA_LIGHT_POSITION_6 = 24;
-	static const int POLY_AREA_LIGHT_COLOR_6 = 25;	
-	static const int POLY_AREA_LIGHT_POSITION_7 = 26;
-	static const int POLY_AREA_LIGHT_COLOR_7 = 27;	
-
-	static const int POLY_SPOT_LIGHT_POSITION_0 = 30;
-	static const int POLY_SPOT_LIGHT_COLOR_0 = 31;
-	static const int POLY_SPOT_LIGHT_DIRECTION_0 = 32;
-	static const int POLY_SPOT_LIGHT_POSITION_1 = 33;
-	static const int POLY_SPOT_LIGHT_COLOR_1 = 34;
-	static const int POLY_SPOT_LIGHT_DIRECTION_1 = 35;
-	static const int POLY_SPOT_LIGHT_POSITION_2 = 36;
-	static const int POLY_SPOT_LIGHT_COLOR_2 = 37;
-	static const int POLY_SPOT_LIGHT_DIRECTION_2 = 38;
-	static const int POLY_SPOT_LIGHT_POSITION_3 = 39;
-	static const int POLY_SPOT_LIGHT_COLOR_3 = 40;
-	static const int POLY_SPOT_LIGHT_DIRECTION_3 = 41;
-	
-	static const int POLY_SPOT_LIGHT_TEXTUREMATRIX_0 = 42;	
-	static const int POLY_SPOT_LIGHT_TEXTUREMATRIX_1 = 43;
-	static const int POLY_SPOT_LIGHT_TEXTUREMATRIX_2 = 44;
-	static const int POLY_SPOT_LIGHT_TEXTUREMATRIX_3 = 45;
-	
-	static const int PARAM_UNKNOWN = 0;	
-	static const int PARAM_Number = 1;
-	static const int PARAM_Number2 = 2;		
-	static const int PARAM_Number3 = 3;
-	static const int PARAM_Number4 = 4;
-	
+class _PolyExport GLSLProgramParam : public ProgramParam {
+	public:		
+		static void createParamData(int *retType, const String& type, const String& value, const String& min, const String& max, void **valueRes, void **minRes, void **maxRes);	
 	};
 	};
 
 
 	class _PolyExport GLSLProgram : public Resource {
 	class _PolyExport GLSLProgram : public Resource {
@@ -94,7 +39,7 @@ class _PolyExport GLSLProgramParam {
 			GLSLProgram(int type);
 			GLSLProgram(int type);
 			virtual ~GLSLProgram();
 			virtual ~GLSLProgram();
 			
 			
-			void addParam(const String& name, bool isAuto, int autoID, int paramType, void *defaultData);
+			GLSLProgramParam addParam(const String& name, const String& typeString, const String& valueString, bool isAuto, int autoID, int paramType, void *defaultData, void *minData, void *maxData);
 		
 		
 			unsigned int program;
 			unsigned int program;
 //			GLSLparameter modelViewProjection;
 //			GLSLparameter modelViewProjection;

+ 1 - 0
Core/Contents/Include/PolyGLSLShader.h

@@ -66,6 +66,7 @@ namespace Polycode {
 			void addTexture(const String& name, Texture *texture);
 			void addTexture(const String& name, Texture *texture);
 			void addCubemap(const String& name, Cubemap *cubemap);
 			void addCubemap(const String& name, Cubemap *cubemap);
 			void clearTexture(const String& name);
 			void clearTexture(const String& name);
+			Texture *getTexture(const String& name);
 			void addParam(const String& type, const String& name, const String& value);
 			void addParam(const String& type, const String& name, const String& value);
 			
 			
 			std::vector<GLSLTextureBinding> textures;
 			std::vector<GLSLTextureBinding> textures;

+ 2 - 14
Core/Contents/Include/PolyGLSLShaderModule.h

@@ -45,22 +45,10 @@ namespace Polycode {
 		
 		
 	protected:
 	protected:
 
 
-		void addParamToProgram(GLSLProgram *program,TiXmlNode *node);		
+		GLSLProgramParam addParamToProgram(GLSLProgram *program,TiXmlNode *node);		
 		void recreateGLSLProgram(GLSLProgram *prog, const String& fileName, int type);
 		void recreateGLSLProgram(GLSLProgram *prog, const String& fileName, int type);
 		GLSLProgram *createGLSLProgram(const String& fileName, int type);
 		GLSLProgram *createGLSLProgram(const String& fileName, int type);
-		void updateGLSLParam(Renderer *renderer, GLSLShader *glslShader, GLSLProgramParam &param, ShaderBinding *materialOptions, ShaderBinding *localOptions);		
-			
-		void setGLSLAreaLightPositionParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex);
-		void setGLSLAreaLightColorParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex);	
-		
-		void setGLSLSpotLightPositionParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex);
-		void setGLSLSpotLightDirectionParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex);
-		void setGLSLSpotLightColorParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex);	
-		void setGLSLSpotLightTextureMatrixParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex);		
-		
-//		GLSLcontext GLSLContext;
-//		GLSLprofile vertexProfile;
-//		GLSLprofile fragmentProfile;
+		void updateGLSLParam(Renderer *renderer, GLSLShader *glslShader, GLSLProgramParam &param, ShaderBinding *materialOptions, ShaderBinding *localOptions);			
 		
 		
 		std::vector<GLSLProgram*> programs;
 		std::vector<GLSLProgram*> programs;
 	};
 	};

+ 6 - 5
Core/Contents/Include/PolyMaterial.h

@@ -50,15 +50,16 @@ namespace Polycode {
 			ShaderBinding *getShaderBinding(unsigned int index) const;
 			ShaderBinding *getShaderBinding(unsigned int index) const;
 			void loadMaterial(const String& fileName);
 			void loadMaterial(const String& fileName);
 			
 			
-			Number specularValue;
-			Number specularStrength;
-			Color specularColor;
-			Color diffuseColor;
-				
+			void setName(const String &name);
+			
+			void clearShaders();
+							
 			bool fp16RenderTargets;
 			bool fp16RenderTargets;
 			
 			
 			void *shaderModule;
 			void *shaderModule;
 			
 			
+			int blendingMode;
+			
 		protected:
 		protected:
 		
 		
 			std::vector<Shader*> materialShaders;
 			std::vector<Shader*> materialShaders;

+ 14 - 1
Core/Contents/Include/PolyMaterialManager.h

@@ -23,6 +23,7 @@ THE SOFTWARE.
 #pragma once
 #pragma once
 #include "PolyGlobals.h"
 #include "PolyGlobals.h"
 #include "PolyImage.h"
 #include "PolyImage.h"
+#include "PolyObject.h"
 #include <vector>
 #include <vector>
 
 
 class TiXmlNode;
 class TiXmlNode;
@@ -72,16 +73,28 @@ namespace Polycode {
 			Cubemap *cubemapFromXMLNode(TiXmlNode *node);
 			Cubemap *cubemapFromXMLNode(TiXmlNode *node);
 		
 		
 			// materials
 			// materials
-			void loadMaterialsFromFile(String fileName);
 			Material *materialFromXMLNode(TiXmlNode *node);
 			Material *materialFromXMLNode(TiXmlNode *node);
+			
+			Material *createMaterial(String materialName, String shaderName);
+			
 			Shader *setShaderFromXMLNode(TiXmlNode *node);
 			Shader *setShaderFromXMLNode(TiXmlNode *node);
 			Shader *createShaderFromXMLNode(TiXmlNode *node);
 			Shader *createShaderFromXMLNode(TiXmlNode *node);
+			
+			void registerShader(Shader *shader);
+		
+			std::vector<Material*> loadMaterialsFromFile(String fileName);
+		
+			void addMaterial(Material *material);
+		
+			unsigned int getNumShaders();
+			Shader *getShaderByIndex(unsigned int index);
 		
 		
 			bool premultiplyAlphaOnLoad;
 			bool premultiplyAlphaOnLoad;
 		
 		
 		private:
 		private:
 			std::vector<Texture*> textures;
 			std::vector<Texture*> textures;
 			std::vector<Material*> materials;
 			std::vector<Material*> materials;
+			std::vector<Shader*> shaders;
 		
 		
 			std::vector <PolycodeShaderModule*> shaderModules;
 			std::vector <PolycodeShaderModule*> shaderModules;
 	};
 	};

+ 6 - 2
Core/Contents/Include/PolyRenderer.h

@@ -25,6 +25,7 @@ THE SOFTWARE.
 #include "PolyGlobals.h"
 #include "PolyGlobals.h"
 #include "PolyMatrix4.h"
 #include "PolyMatrix4.h"
 #include "PolyVector2.h"
 #include "PolyVector2.h"
+#include "PolyShader.h"
 #include "PolyImage.h"
 #include "PolyImage.h"
 #include "PolyRectangle.h"
 #include "PolyRectangle.h"
 
 
@@ -210,7 +211,10 @@ namespace Polycode {
 		void enableShaders(bool flag);
 		void enableShaders(bool flag);
 		
 		
 		Number getViewportWidth();
 		Number getViewportWidth();
-		Number getViewportHeight();			
+		Number getViewportHeight();		
+		
+		void *getDataPointerForName(const String &name);
+		void setRendererShaderParams(Shader *shader, ShaderBinding *binding);
 
 
 		virtual void initOSSpecific() {};
 		virtual void initOSSpecific() {};
 		
 		
@@ -229,7 +233,7 @@ namespace Polycode {
 		static const int BLEND_MODE_COLOR = 2;
 		static const int BLEND_MODE_COLOR = 2;
 		static const int BLEND_MODE_PREMULTIPLIED = 3;
 		static const int BLEND_MODE_PREMULTIPLIED = 3;
 		static const int BLEND_MODE_MULTIPLY = 4;
 		static const int BLEND_MODE_MULTIPLY = 4;
-						
+								
 		static const int FOG_LINEAR = 0;
 		static const int FOG_LINEAR = 0;
 		static const int FOG_EXP = 1;
 		static const int FOG_EXP = 1;
 		static const int FOG_EXP2 = 2;
 		static const int FOG_EXP2 = 2;

+ 9 - 3
Core/Contents/Include/PolyResourceManager.h

@@ -53,13 +53,19 @@ namespace Polycode {
 			void addDirResource(const String& dirPath, bool recursive=true);
 			void addDirResource(const String& dirPath, bool recursive=true);
 			
 			
 			/**
 			/**
-			* Adds a zip as a readable source. This doesn't actually load resources from it, just mounts it as a readable source, so you can call addDirResource on the folders inside of it like you would on regular folders. Most other disk IO in the engine (loading images, etc.) will actually check mounted archive files as well.
+			* Adds a zip or folder as a readable source. This doesn't actually load resources from it, just mounts it as a readable source, so you can call addDirResource on the folders inside of it like you would on regular folders. Most other disk IO in the engine (loading images, etc.) will actually check mounted archive files as well.
 			*/
 			*/
-			void addArchive(const String& zipPath);
+			void addArchive(const String& path);
+
+			/**
+			* Removes a zip or folder as a readable source.
+			*/
+			void removeArchive(const String& path);
+
 		
 		
 			bool readFile(const String& fileName) { return false;}
 			bool readFile(const String& fileName) { return false;}
 		
 		
-			void parseTextures(const String& dirPath, bool recursive);
+			void parseTextures(const String& dirPath, bool recursive, const String& basePath);
 			void parseMaterials(const String& dirPath, bool recursive);
 			void parseMaterials(const String& dirPath, bool recursive);
 			void parseShaders(const String& dirPath, bool recursive);
 			void parseShaders(const String& dirPath, bool recursive);
 			void parsePrograms(const String& dirPath, bool recursive);
 			void parsePrograms(const String& dirPath, bool recursive);

+ 5 - 0
Core/Contents/Include/PolySceneMesh.h

@@ -100,6 +100,11 @@ namespace Polycode {
 			*/			
 			*/			
 			void setTexture(Texture *texture);
 			void setTexture(Texture *texture);
 
 
+			/**
+			* Clears the currently applied material
+			*/
+			void clearMaterial();
+
 			/**
 			/**
 			* Set material from existing Material instance.
 			* Set material from existing Material instance.
 			* @param material Material to apply.
 			* @param material Material to apply.

+ 31 - 7
Core/Contents/Include/PolyShader.h

@@ -32,6 +32,27 @@ namespace Polycode {
 	class Cubemap;
 	class Cubemap;
 	class ShaderBinding;
 	class ShaderBinding;
 	class Texture;
 	class Texture;
+	
+	class _PolyExport ProgramParam {
+		public:
+	
+	String name;
+	String typeString;
+	String valueString;
+	bool isAuto;
+	int autoID;
+	void *defaultData;
+	void *minValue;
+	void *maxValue;	
+	int paramType;
+			
+	static const int PARAM_UNKNOWN = 0;	
+	static const int PARAM_Number = 1;
+	static const int PARAM_Vector2 = 2;		
+	static const int PARAM_Vector3 = 3;
+	static const int PARAM_Color = 4;
+	
+	};	
 
 
 	class _PolyExport Shader : public Resource {
 	class _PolyExport Shader : public Resource {
 		public:
 		public:
@@ -50,9 +71,16 @@ namespace Polycode {
 
 
 			int numSpotLights;
 			int numSpotLights;
 			int numAreaLights;
 			int numAreaLights;
-							
+			
+			std::vector<String> expectedTextures;
+			std::vector<ProgramParam> expectedFragmentParams;
+			std::vector<ProgramParam> expectedVertexParams;
+								
+			bool screenShader;
+			
 		protected:
 		protected:
 		
 		
+		
 			String name;
 			String name;
 			int type;
 			int type;
 	};
 	};
@@ -74,9 +102,6 @@ namespace Polycode {
 		public:	
 		public:	
 			String name;
 			String name;
 			void *data;
 			void *data;
-			
-			void setNumber(Number n) { memcpy(data, &n, sizeof(n)); }
-			void setVector3(Vector3 v) { memcpy(data, &v, sizeof(v)); }
 	};	
 	};	
 	
 	
 	class RenderTargetBinding {
 	class RenderTargetBinding {
@@ -95,7 +120,8 @@ namespace Polycode {
 		public:
 		public:
 			ShaderBinding(Shader *shader);
 			ShaderBinding(Shader *shader);
 			virtual ~ShaderBinding();
 			virtual ~ShaderBinding();
-			
+
+			virtual Texture *getTexture(const String& name){};
 			virtual void clearTexture(const String& name){};
 			virtual void clearTexture(const String& name){};
 			virtual void addTexture(const String& name, Texture *texture)  {};
 			virtual void addTexture(const String& name, Texture *texture)  {};
 			virtual void addParam(const String& type, const String& name, const String& value) {};
 			virtual void addParam(const String& type, const String& name, const String& value) {};
@@ -117,8 +143,6 @@ namespace Polycode {
 			RenderTargetBinding *getOutTargetBinding(unsigned int index);
 			RenderTargetBinding *getOutTargetBinding(unsigned int index);
 			
 			
 			void addLocalParam(const String& name, void *ptr);
 			void addLocalParam(const String& name, void *ptr);
-			void addLocalParamNumber(const String& name, Number n);
-			void addLocalParamVector3(const String& name, Vector3 v);
 		
 		
 			Shader* shader;
 			Shader* shader;
 			std::vector<LocalShaderParam*> localParams;
 			std::vector<LocalShaderParam*> localParams;

+ 9 - 6
Core/Contents/Source/PolyEventDispatcher.cpp

@@ -43,13 +43,16 @@ namespace Polycode {
 		handlerEntries.clear();
 		handlerEntries.clear();
 	}
 	}
 	
 	
-	void EventDispatcher::removeAllHandlersForListener(void *listener) {
-		for(int i=0;i<handlerEntries.size();i++) {
-			if(handlerEntries[i].handler == listener) {
-				handlerEntries.erase(handlerEntries.begin()+i);
-				i--;
+	void EventDispatcher::removeAllHandlersForListener(EventHandler *handler) {
+		std::vector<EventEntry>::iterator iter = handlerEntries.begin();
+		while (iter != handlerEntries.end()) {	
+			if((*iter).handler == handler) {
+				iter = handlerEntries.erase(iter);
+			} else {	
+				++iter;						
 			}
 			}
-		}		
+		}
+		
 	}
 	}
 
 
 	void EventDispatcher::removeEventListener(EventHandler *handler, int eventCode) {
 	void EventDispatcher::removeEventListener(EventHandler *handler, int eventCode) {

+ 4 - 23
Core/Contents/Source/PolyGLRenderer.cpp

@@ -411,14 +411,14 @@ void OpenGLRenderer::setBlendingMode(int blendingMode) {
 				glBlendFunc (GL_SRC_ALPHA, GL_ONE);
 				glBlendFunc (GL_SRC_ALPHA, GL_ONE);
 		break;
 		break;
 		case BLEND_MODE_COLOR:
 		case BLEND_MODE_COLOR:
-				glBlendFunc (GL_SRC_ALPHA_SATURATE, GL_ONE);
+				glBlendFunc (GL_DST_COLOR, GL_SRC_COLOR);
 		break;
 		break;
 		case BLEND_MODE_PREMULTIPLIED:
 		case BLEND_MODE_PREMULTIPLIED:
 			glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
 			glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
 		break;
 		break;
 		case BLEND_MODE_MULTIPLY:
 		case BLEND_MODE_MULTIPLY:
 			glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA);
 			glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA);
-		break;		
+		break;
 		default:
 		default:
 			glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 			glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 		break;
 		break;
@@ -717,27 +717,6 @@ void OpenGLRenderer::applyMaterial(Material *material,  ShaderBinding *localOpti
 		return;
 		return;
 	}
 	}
 	
 	
-
-	GLfloat data4[] = {material->diffuseColor.r, material->diffuseColor.g, material->diffuseColor.b, material->diffuseColor.a};					
-	glMaterialfv(GL_FRONT, GL_DIFFUSE, data4);
-
-	data4[0] = material->specularColor.r;
-	data4[1] = material->specularColor.g;
-	data4[2] = material->specularColor.b;
-	data4[3] = material->specularStrength;
-				
-	glMaterialfv(GL_FRONT, GL_SPECULAR, data4);
-
-	glMaterialf(GL_FRONT, GL_SHININESS, material->specularValue);
-
-
-
-	data4[0] = ambientColor.r;
-	data4[1] = ambientColor.g;
-	data4[2] = ambientColor.b;
-	data4[3] = 1.0;
-	glMaterialfv(GL_FRONT, GL_AMBIENT, data4);
-
 	FixedShaderBinding *fBinding;
 	FixedShaderBinding *fBinding;
 	
 	
 	switch(material->getShader(shaderIndex)->getType()) {
 	switch(material->getShader(shaderIndex)->getType()) {
@@ -763,6 +742,8 @@ void OpenGLRenderer::applyMaterial(Material *material,  ShaderBinding *localOpti
 			}
 			}
 		break;
 		break;
 	}
 	}
+	
+	setBlendingMode(material->blendingMode);
 }
 }
 
 
 void OpenGLRenderer::clearShader() {
 void OpenGLRenderer::clearShader() {

+ 47 - 18
Core/Contents/Source/PolyGLSLProgram.cpp

@@ -24,6 +24,7 @@ THE SOFTWARE.
 #include "PolyGLSLProgram.h"
 #include "PolyGLSLProgram.h"
 #include "PolyVector3.h"
 #include "PolyVector3.h"
 #include "PolyVector2.h"
 #include "PolyVector2.h"
+#include "PolyColor.h"
 #include "PolyLogger.h"
 #include "PolyLogger.h"
 
 
 #ifdef _WINDOWS
 #ifdef _WINDOWS
@@ -62,50 +63,78 @@ GLSLProgram::~GLSLProgram() {
 	glDeleteShader(program);
 	glDeleteShader(program);
 }
 }
 
 
-void GLSLProgram::addParam(const String& name, bool isAuto, int autoID, int paramType, void *defaultData) {
+GLSLProgramParam GLSLProgram::addParam(const String& name, const String& typeString, const String& valueString, bool isAuto, int autoID, int paramType, void *defaultData, void *minData, void *maxData) {
 	GLSLProgramParam newParam;
 	GLSLProgramParam newParam;
 	newParam.name = name;
 	newParam.name = name;
+	newParam.typeString = typeString;
+	newParam.valueString = valueString;	
 	newParam.paramType = paramType;
 	newParam.paramType = paramType;
 	newParam.defaultData = defaultData;
 	newParam.defaultData = defaultData;
+	newParam.minValue = minData;
+	newParam.maxValue = maxData;
 	newParam.isAuto = isAuto;
 	newParam.isAuto = isAuto;
 	newParam.autoID = autoID;
 	newParam.autoID = autoID;
-//	newParam.cgParam = cgGetNamedParameter(program, name.c_str());
+
 	params.push_back(newParam);
 	params.push_back(newParam);
+	return newParam;
 }
 }
 
 
-void *GLSLProgramParam::createParamData(int *retType, const String& type, const String& value) {
-		void *defaultData;
+void GLSLProgramParam::createParamData(int *retType, const String& type, const String& value, const String& min, const String& max, void **valueRes, void **minRes, void **maxRes) {
+		
+		(*valueRes) = NULL;
+		(*minRes) = NULL;
+		(*maxRes) = NULL;
+						
 		if(type == "Number") {
 		if(type == "Number") {
 			*retType = GLSLProgramParam::PARAM_Number;
 			*retType = GLSLProgramParam::PARAM_Number;
 			Number *val = new Number();
 			Number *val = new Number();
 			*val = atof(value.c_str());
 			*val = atof(value.c_str());
-			defaultData = (void*)val;
-			return defaultData;		
-		} else if(type == "Number2") {
-			*retType = GLSLProgramParam::PARAM_Number2;
+			(*valueRes) = (void*)val;
+			
+			val = new Number();
+			*val = atof(min.c_str());
+			(*minRes) = (void*)val;
+
+			val = new Number();
+			*val = atof(max.c_str());
+			(*maxRes) = (void*)val;			
+			
+			return;		
+		} else if(type == "Vector2") {
+			*retType = GLSLProgramParam::PARAM_Vector2;
 			Vector2 *val = new Vector2();
 			Vector2 *val = new Vector2();
-			defaultData = (void*)val;
+			(*valueRes) = (void*)val;
 			vector<String> values = value.split(" ");
 			vector<String> values = value.split(" ");
 			if(values.size() == 2) {
 			if(values.size() == 2) {
 				val->set(atof(values[0].c_str()), atof(values[1].c_str()));
 				val->set(atof(values[0].c_str()), atof(values[1].c_str()));
 			} else {
 			} else {
-				Logger::log("Error: A Number2 must have 2 values (%d provided)!\n", values.size());
+				Logger::log("Error: A Vector2 must have 2 values (%d provided)!\n", values.size());
 			}
 			}
-			return defaultData;				
-		} else if(type == "Number3") {
-			*retType = GLSLProgramParam::PARAM_Number3;
+			return;				
+		} else if(type == "Vector3") {
+			*retType = GLSLProgramParam::PARAM_Vector3;
 			Vector3 *val = new Vector3();
 			Vector3 *val = new Vector3();
-			defaultData = (void*)val;
+			(*valueRes) = (void*)val;
 			vector<String> values = value.split(" ");
 			vector<String> values = value.split(" ");
 			if(values.size() == 3) {
 			if(values.size() == 3) {
 				val->set(atof(values[0].c_str()), atof(values[1].c_str()), atof(values[2].c_str()));
 				val->set(atof(values[0].c_str()), atof(values[1].c_str()), atof(values[2].c_str()));
 			} else {
 			} else {
-				Logger::log("Error: A Number3 must have 3 values (%d provided)!\n", values.size());
+				Logger::log("Error: A Vector3 must have 3 values (%d provided)!\n", values.size());
+			}
+			return;
+		} else if(type == "Color") {
+			*retType = GLSLProgramParam::PARAM_Color;
+			Color *val = new Color();
+			(*valueRes) = (void*)val;
+			vector<String> values = value.split(" ");
+			if(values.size() == 4) {
+				val->setColor(atof(values[0].c_str()), atof(values[1].c_str()), atof(values[2].c_str()), atof(values[3].c_str()));
+			} else {
+				Logger::log("Error: A Color must have 4 values (%d provided)!\n", values.size());
 			}
 			}
-			return defaultData;
+			return;			
 		} else {
 		} else {
 			*retType = GLSLProgramParam::PARAM_UNKNOWN;
 			*retType = GLSLProgramParam::PARAM_UNKNOWN;
-			return NULL;
+			(*valueRes) =  NULL;
 		}
 		}
-
 }
 }

+ 13 - 2
Core/Contents/Source/PolyGLSLShader.cpp

@@ -66,7 +66,15 @@ GLSLShaderBinding::~GLSLShaderBinding() {
 	
 	
 }
 }
 
 
-
+Texture *GLSLShaderBinding::getTexture(const String& name) {
+	for(int i=0; i < textures.size(); i++) {
+		if(textures[i].name == name) {			
+			return textures[i].texture;
+		}
+	}
+	return NULL;
+}
+			
 void GLSLShaderBinding::addTexture(const String& name, Texture *texture) {
 void GLSLShaderBinding::addTexture(const String& name, Texture *texture) {
 	GLSLTextureBinding binding;
 	GLSLTextureBinding binding;
 	binding.name = name;
 	binding.name = name;
@@ -95,7 +103,10 @@ void GLSLShaderBinding::clearTexture(const String& name) {
 
 
 void GLSLShaderBinding::addParam(const String& type, const String& name, const String& value) {
 void GLSLShaderBinding::addParam(const String& type, const String& name, const String& value) {
 	int paramType;
 	int paramType;
-	void *defaultData = GLSLProgramParam::createParamData(&paramType, type, value);
+	void *defaultData;
+	void *minData;
+	void *maxData;		
+	GLSLProgramParam::createParamData(&paramType, type, value, "", "", &defaultData,&minData, &maxData);
 	LocalShaderParam *newParam = new LocalShaderParam;
 	LocalShaderParam *newParam = new LocalShaderParam;
 	newParam->data = defaultData;
 	newParam->data = defaultData;
 	newParam->name = name;
 	newParam->name = name;

+ 50 - 379
Core/Contents/Source/PolyGLSLShaderModule.cpp

@@ -116,6 +116,11 @@ Shader *GLSLShaderModule::createShader(TiXmlNode *node) {
 	GLSLProgram *vp = NULL;
 	GLSLProgram *vp = NULL;
 	GLSLProgram *fp = NULL;
 	GLSLProgram *fp = NULL;
 	GLSLShader *retShader = NULL;
 	GLSLShader *retShader = NULL;
+	
+	std::vector<String> expectedTextures;
+	std::vector<ProgramParam> expectedFragmentParams;	
+	std::vector<ProgramParam> expectedVertexParams;
+		
 	TiXmlElement *nodeElement = node->ToElement();
 	TiXmlElement *nodeElement = node->ToElement();
 	if (!nodeElement) return NULL; // Skip comment nodes
 	if (!nodeElement) return NULL; // Skip comment nodes
 	
 	
@@ -130,7 +135,7 @@ Shader *GLSLShaderModule::createShader(TiXmlNode *node) {
 					if(strcmp(pChild2->Value(), "params") == 0) {
 					if(strcmp(pChild2->Value(), "params") == 0) {
 						for (pChild3 = pChild2->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 						for (pChild3 = pChild2->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 							if(strcmp(pChild3->Value(), "param") == 0) {
 							if(strcmp(pChild3->Value(), "param") == 0) {
-								addParamToProgram(vp,pChild3); 
+								expectedVertexParams.push_back(addParamToProgram(vp,pChild3));
 							}
 							}
 						}
 						}
 					}
 					}
@@ -144,10 +149,20 @@ Shader *GLSLShaderModule::createShader(TiXmlNode *node) {
 					if(strcmp(pChild2->Value(), "params") == 0) {
 					if(strcmp(pChild2->Value(), "params") == 0) {
 						for (pChild3 = pChild2->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 						for (pChild3 = pChild2->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 							if(strcmp(pChild3->Value(), "param") == 0) {
 							if(strcmp(pChild3->Value(), "param") == 0) {
-								addParamToProgram(fp,pChild3); 										
+								expectedFragmentParams.push_back(addParamToProgram(fp,pChild3));	
 							}
 							}
 						}
 						}
 					}
 					}
+					if(strcmp(pChild2->Value(), "textures") == 0) {
+						for (pChild3 = pChild2->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
+							if(strcmp(pChild3->Value(), "texture") == 0) {
+								TiXmlElement *texNodeElement = pChild3->ToElement();
+								if (texNodeElement) {
+									expectedTextures.push_back(String(texNodeElement->Attribute("name")));
+								}
+							}
+						}
+					}					
 				}
 				}
 			}
 			}
 		}
 		}
@@ -156,6 +171,9 @@ Shader *GLSLShaderModule::createShader(TiXmlNode *node) {
 	if(vp != NULL && fp != NULL) {
 	if(vp != NULL && fp != NULL) {
 		GLSLShader *cgShader = new GLSLShader(vp,fp);
 		GLSLShader *cgShader = new GLSLShader(vp,fp);
 		cgShader->setName(String(nodeElement->Attribute("name")));
 		cgShader->setName(String(nodeElement->Attribute("name")));
+		cgShader->expectedTextures = expectedTextures;
+		cgShader->expectedVertexParams = expectedVertexParams;
+		cgShader->expectedFragmentParams = expectedFragmentParams;				
 		retShader = cgShader;
 		retShader = cgShader;
 		shaders.push_back((Shader*)cgShader);
 		shaders.push_back((Shader*)cgShader);
 	}
 	}
@@ -167,239 +185,49 @@ void GLSLShaderModule::clearShader() {
 	glUseProgram(0);
 	glUseProgram(0);
 }
 }
 
 
-void GLSLShaderModule::setGLSLAreaLightPositionParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex) {
-	if(renderer->getNumAreaLights() > lightIndex) {
-		vector<LightInfo> areaLights = renderer->getAreaLights();			
-		Vector3 lPos(areaLights[lightIndex].position.x,areaLights[lightIndex].position.y,areaLights[lightIndex].position.z);
-		GLfloat LightPosition[] = {lPos.x, lPos.y, lPos.z, 1};		
-		
-		glLightfv (GL_LIGHT0+lightIndex, GL_POSITION, LightPosition); //change the 	
-		
-//		glLightf(GL_LIGHT0+lightIndex, GL_CONSTANT_ATTENUATION, areaLights[lightIndex].distance);
-//		glLightf(GL_LIGHT0+lightIndex, GL_LINEAR_ATTENUATION, areaLights[lightIndex].intensity);			
-//		glLightf(GL_LIGHT0+lightIndex, GL_QUADRATIC_ATTENUATION, areaLights[lightIndex].intensity);					
-	} else {
-	}	
-}
-
-void GLSLShaderModule::setGLSLSpotLightPositionParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex) {
-	if(renderer->getNumSpotLights() > lightIndex) {
-		vector<LightInfo> spotLights = renderer->getSpotLights();		
-		Vector3 lPos(spotLights[lightIndex].position.x,spotLights[lightIndex].position.y,spotLights[lightIndex].position.z);
-		lPos = renderer->getCameraMatrix().inverse() * lPos;
-//		cgGLSetParameter4f(param.cgParam, lPos.x,lPos.y,lPos.z, spotLights[lightIndex].distance);
-	} else {
-//		cgGLSetParameter4f(param.cgParam, 0,0,0,0);
-	}	
-}
-
-void GLSLShaderModule::setGLSLSpotLightDirectionParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex) {
-	if(renderer->getNumSpotLights() > lightIndex) {
-		vector<LightInfo> spotLights = renderer->getSpotLights();		
-		Vector3 lPos(spotLights[lightIndex].dir.x,spotLights[lightIndex].dir.y,spotLights[lightIndex].dir.z);
-		lPos = renderer->getCameraMatrix().inverse().rotateVector(lPos);
-//		cgGLSetParameter3f(param.cgParam, lPos.x,lPos.y,lPos.z);
-	} else {
-//		cgGLSetParameter3f(param.cgParam, 0.0f,0.0f,0.0f);
-	}				
-}
-
-void GLSLShaderModule::setGLSLAreaLightColorParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex) {
-	if(renderer->getNumAreaLights() > lightIndex) {
-		vector<LightInfo> areaLights = renderer->getAreaLights();		
-		
-		GLfloat DiffuseLight[] = {areaLights[lightIndex].color.x, areaLights[lightIndex].color.y, areaLights[lightIndex].color.z};
-		glLightfv (GL_LIGHT0+lightIndex, GL_DIFFUSE, DiffuseLight);
-		
-//		cgGLSetParameter4f(param.cgParam, areaLights[lightIndex].color.x,areaLights[lightIndex].color.y,areaLights[lightIndex].color.z, areaLights[lightIndex].intensity);
-	} else {
-//		cgGLSetParameter4f(param.cgParam, 0,0,0,0);
-	}
-}
-
-void GLSLShaderModule::setGLSLSpotLightColorParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex) {
-	if(renderer->getNumSpotLights() > lightIndex) {
-		vector<LightInfo> spotLights = renderer->getSpotLights();			
-//		cgGLSetParameter4f(param.cgParam, spotLights[lightIndex].color.x,spotLights[lightIndex].color.y,spotLights[lightIndex].color.z, spotLights[lightIndex].intensity);
-	} else {
-//		cgGLSetParameter4f(param.cgParam, 0,0,0,0);
-	}
-}
-
-void GLSLShaderModule::setGLSLSpotLightTextureMatrixParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex) {
-	if(renderer->getNumLights() > lightIndex) {
-		vector<LightInfo> spotLights = renderer->getSpotLights();			
-		glMatrixMode(GL_MODELVIEW);
-		glPushMatrix();
-		glLoadMatrixd(spotLights[lightIndex].textureMatrix.ml);				
-//		cgGLSetStateMatrixParameter(param.cgParam, GLSL_GL_MODELVIEW_MATRIX,GLSL_GL_MATRIX_IDENTITY);
-		glPopMatrix();
-	}					
-}
-
-
-
 void GLSLShaderModule::updateGLSLParam(Renderer *renderer, GLSLShader *glslShader, GLSLProgramParam &param, ShaderBinding *materialOptions, ShaderBinding *localOptions) {
 void GLSLShaderModule::updateGLSLParam(Renderer *renderer, GLSLShader *glslShader, GLSLProgramParam &param, ShaderBinding *materialOptions, ShaderBinding *localOptions) {
-	if(param.isAuto) {
-		switch(param.autoID) {
-			case GLSLProgramParam::POLY_MODELVIEWPROJ_MATRIX:
-//				cgGLSetStateMatrixParameter(param.cgParam, GLSL_GL_MODELVIEW_PROJECTION_MATRIX,GLSL_GL_MATRIX_IDENTITY);
-				break;
-				
-			case GLSLProgramParam::POLY_SPOT_LIGHT_TEXTUREMATRIX_0:
-				setGLSLSpotLightTextureMatrixParameter(renderer, param, 0);					
-				break;
-			case GLSLProgramParam::POLY_SPOT_LIGHT_TEXTUREMATRIX_1:
-				setGLSLSpotLightTextureMatrixParameter(renderer, param, 1);					
-				break;
-			case GLSLProgramParam::POLY_SPOT_LIGHT_TEXTUREMATRIX_2:
-				setGLSLSpotLightTextureMatrixParameter(renderer, param, 2);					
-				break;
-			case GLSLProgramParam::POLY_SPOT_LIGHT_TEXTUREMATRIX_3:
-				setGLSLSpotLightTextureMatrixParameter(renderer, param, 3);					
-				break;
-				
-				
-			case GLSLProgramParam::POLY_AMBIENTCOLOR:
-//				cgGLSetParameter3f(param.cgParam, renderer->ambientColor.r,renderer->ambientColor.g,renderer->ambientColor.b);
-				break;
-			case GLSLProgramParam::POLY_CLEARCOLOR:
-//				cgGLSetParameter3f(param.cgParam, renderer->clearColor.r,renderer->clearColor.g,renderer->clearColor.b);				
-				break;				
-				
-			case GLSLProgramParam::POLY_SPOT_LIGHT_DIRECTION_0:
-				setGLSLSpotLightDirectionParameter(renderer, param, 0);
-				break;
-			case GLSLProgramParam::POLY_SPOT_LIGHT_DIRECTION_1:
-				setGLSLSpotLightDirectionParameter(renderer, param, 1);
-				break;
-			case GLSLProgramParam::POLY_SPOT_LIGHT_DIRECTION_2:
-				setGLSLSpotLightDirectionParameter(renderer, param, 2);
-				break;
-			case GLSLProgramParam::POLY_SPOT_LIGHT_DIRECTION_3:
-				setGLSLSpotLightDirectionParameter(renderer, param, 3);
-				break;
-				
-			case GLSLProgramParam::POLY_AREA_LIGHT_POSITION_0:
-				setGLSLAreaLightPositionParameter(renderer, param, 0);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_POSITION_1:
-				setGLSLAreaLightPositionParameter(renderer, param, 1);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_POSITION_2:
-				setGLSLAreaLightPositionParameter(renderer, param, 2);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_POSITION_3:
-				setGLSLAreaLightPositionParameter(renderer, param, 3);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_POSITION_4:
-				setGLSLAreaLightPositionParameter(renderer, param, 4);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_POSITION_5:
-				setGLSLAreaLightPositionParameter(renderer, param, 5);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_POSITION_6:
-				setGLSLAreaLightPositionParameter(renderer, param, 6);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_POSITION_7:
-				setGLSLAreaLightPositionParameter(renderer, param, 7);
-				break;				
-				
-			case GLSLProgramParam::POLY_SPOT_LIGHT_POSITION_0:
-				setGLSLSpotLightPositionParameter(renderer, param, 0);
-				break;				
-			case GLSLProgramParam::POLY_SPOT_LIGHT_POSITION_1:
-				setGLSLSpotLightPositionParameter(renderer, param, 1);
-				break;				
-			case GLSLProgramParam::POLY_SPOT_LIGHT_POSITION_2:
-				setGLSLSpotLightPositionParameter(renderer, param, 2);
-				break;				
-			case GLSLProgramParam::POLY_SPOT_LIGHT_POSITION_3:
-				setGLSLSpotLightPositionParameter(renderer, param, 3);
-				break;				
-				
-			case GLSLProgramParam::POLY_AREA_LIGHT_COLOR_0:
-				setGLSLAreaLightColorParameter(renderer, param, 0);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_COLOR_1:
-				setGLSLAreaLightColorParameter(renderer, param, 1);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_COLOR_2:
-				setGLSLAreaLightColorParameter(renderer, param, 2);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_COLOR_3:
-				setGLSLAreaLightColorParameter(renderer, param, 3);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_COLOR_4:
-				setGLSLAreaLightColorParameter(renderer, param, 4);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_COLOR_5:
-				setGLSLAreaLightColorParameter(renderer, param, 5);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_COLOR_6:
-				setGLSLAreaLightColorParameter(renderer, param, 6);
-				break;
-			case GLSLProgramParam::POLY_AREA_LIGHT_COLOR_7:
-				setGLSLAreaLightColorParameter(renderer, param, 7);
-				break;
-				
-			case GLSLProgramParam::POLY_SPOT_LIGHT_COLOR_0:
-				setGLSLSpotLightColorParameter(renderer, param, 0);
-				break;
-			case GLSLProgramParam::POLY_SPOT_LIGHT_COLOR_1:
-				setGLSLSpotLightColorParameter(renderer, param, 1);
-				break;
-			case GLSLProgramParam::POLY_SPOT_LIGHT_COLOR_2:
-				setGLSLSpotLightColorParameter(renderer, param, 2);
-				break;
-			case GLSLProgramParam::POLY_SPOT_LIGHT_COLOR_3:
-				setGLSLSpotLightColorParameter(renderer, param, 3);
-				break;				
-				
-			case GLSLProgramParam::POLY_MODELVIEW_MATRIX: 
-//				cgGLSetStateMatrixParameter(param.cgParam, GLSL_GL_MODELVIEW_MATRIX,GLSL_GL_MATRIX_IDENTITY); }
-				break;
-			case GLSLProgramParam::POLY_MODELVIEW_INVERSE_MATRIX:
-//				cgGLSetStateMatrixParameter(param.cgParam, GLSL_GL_MODELVIEW_MATRIX,GLSL_GL_MATRIX_INVERSE_TRANSPOSE);
-				break;
-			case GLSLProgramParam::POLY_EXPOSURE_LEVEL:
-//				cgGLSetParameter1f(param.cgParam, renderer->exposureLevel);
-				break;
-		}
-	} else {
+	
 		void *paramData = param.defaultData;
 		void *paramData = param.defaultData;
 		LocalShaderParam *localParam = materialOptions->getLocalParamByName(param.name);
 		LocalShaderParam *localParam = materialOptions->getLocalParamByName(param.name);
-		if(localParam)
+		if(localParam) {
 			paramData = localParam->data;
 			paramData = localParam->data;
+		}
+		
 		localParam = localOptions->getLocalParamByName(param.name);
 		localParam = localOptions->getLocalParamByName(param.name);
-		if(localParam)
+		if(localParam) {
 			paramData = localParam->data;
 			paramData = localParam->data;
-		
-		Number *fval;
+		}
 		
 		
 		switch(param.paramType) {
 		switch(param.paramType) {
 			case GLSLProgramParam::PARAM_Number:
 			case GLSLProgramParam::PARAM_Number:
 			{
 			{
+				Number *fval;			
 				fval = (Number*)paramData;
 				fval = (Number*)paramData;
 				int paramLocation = glGetUniformLocation(glslShader->shader_id, param.name.c_str());
 				int paramLocation = glGetUniformLocation(glslShader->shader_id, param.name.c_str());
 				glUniform1f(paramLocation, *fval);
 				glUniform1f(paramLocation, *fval);
 				break;
 				break;
 			}
 			}
-			case GLSLProgramParam::PARAM_Number2:
+			case GLSLProgramParam::PARAM_Vector2:
 			{
 			{
 				Vector2 *fval2 = (Vector2*)paramData;
 				Vector2 *fval2 = (Vector2*)paramData;
 				int paramLocation = glGetUniformLocation(glslShader->shader_id, param.name.c_str());
 				int paramLocation = glGetUniformLocation(glslShader->shader_id, param.name.c_str());
 				glUniform2f(paramLocation, fval2->x, fval2->y);				break;				
 				glUniform2f(paramLocation, fval2->x, fval2->y);				break;				
 			}			
 			}			
-			case GLSLProgramParam::PARAM_Number3:
+			case GLSLProgramParam::PARAM_Vector3:
 			{
 			{
 				Vector3 *fval3 = (Vector3*)paramData;
 				Vector3 *fval3 = (Vector3*)paramData;
 				int paramLocation = glGetUniformLocation(glslShader->shader_id, param.name.c_str());
 				int paramLocation = glGetUniformLocation(glslShader->shader_id, param.name.c_str());
 				glUniform3f(paramLocation, fval3->x,fval3->y,fval3->z);
 				glUniform3f(paramLocation, fval3->x,fval3->y,fval3->z);
 				break;				
 				break;				
 			}
 			}
+			case GLSLProgramParam::PARAM_Color:
+			{
+				Color *col = (Color*)paramData;
+				int paramLocation = glGetUniformLocation(glslShader->shader_id, param.name.c_str());
+				glUniform4f(paramLocation, col->r, col->g, col->b, col->a);
+				break;				
+			}
 		}
 		}
-	}
 }
 }
 
 
 bool GLSLShaderModule::applyShaderMaterial(Renderer *renderer, Material *material, ShaderBinding *localOptions, unsigned int shaderIndex) {	
 bool GLSLShaderModule::applyShaderMaterial(Renderer *renderer, Material *material, ShaderBinding *localOptions, unsigned int shaderIndex) {	
@@ -434,13 +262,6 @@ bool GLSLShaderModule::applyShaderMaterial(Renderer *renderer, Material *materia
 	int lightIndex = 0;
 	int lightIndex = 0;
 	
 	
 	vector<LightInfo> areaLights = renderer->getAreaLights();
 	vector<LightInfo> areaLights = renderer->getAreaLights();
-	
-//	printf("Applying {\n");
-//	for(int z=0;z < areaLights.size(); z++) {
-//		LightInfo light = areaLights[z];		
-//		printf("Light: %f %f %f\n", light.position.x, light.position.y, light.position.z);
-//	}
-//	printf("}\n");
 		
 		
 	GLfloat ambientVal[] = {1, 1, 1, 1.0};				
 	GLfloat ambientVal[] = {1, 1, 1, 1.0};				
 	for(int i=0; i < glslShader->numAreaLights; i++) {
 	for(int i=0; i < glslShader->numAreaLights; i++) {
@@ -562,12 +383,7 @@ bool GLSLShaderModule::applyShaderMaterial(Renderer *renderer, Material *materia
 				glBindTexture(GL_TEXTURE_2D, ((OpenGLTexture*)light.shadowMapTexture)->getTextureID());	
 				glBindTexture(GL_TEXTURE_2D, ((OpenGLTexture*)light.shadowMapTexture)->getTextureID());	
 				textureIndex++;
 				textureIndex++;
 				
 				
-//				glMatrixMode(GL_MODELVIEW);
-//				glPushMatrix();
-//				glLoadMatrixd(light.textureMatrix.ml);			
-				int mloc = glGetUniformLocation(glslShader->shader_id, matName);				
-				
-				
+				int mloc = glGetUniformLocation(glslShader->shader_id, matName);
 				light.textureMatrix = light.textureMatrix;
 				light.textureMatrix = light.textureMatrix;
 				
 				
 			
 			
@@ -577,9 +393,6 @@ bool GLSLShaderModule::applyShaderMaterial(Renderer *renderer, Material *materia
 				}
 				}
 				glUniformMatrix4fv(mloc, 1, false, mat);
 				glUniformMatrix4fv(mloc, 1, false, mat);
 		
 		
-						
-	//			glPopMatrix();
-				
 					
 					
 			}
 			}
 			shadowMapTextureIndex++;
 			shadowMapTextureIndex++;
@@ -643,174 +456,32 @@ bool GLSLShaderModule::applyShaderMaterial(Renderer *renderer, Material *materia
 		textureIndex++;
 		textureIndex++;
 	}		
 	}		
 
 
-	//			Logger::log("applying %s (%s %s)\n", material->getShader()->getName().c_str(), cgShader->vp->getResourceName().c_str(), cgShader->fp->getResourceName().c_str());
-
-	/*
-	vector<Texture*> shadowMapTextures = renderer->getShadowMapTextures();	
-	char texName[32];
-	for(int i=0; i< 4; i++) {
-		if(i < shadowMapTextures.size()) {
-			switch(i) {
-				case 0:
-					strcpy(texName, "shadowMap0");
-					break;
-				case 1:
-					strcpy(texName, "shadowMap1");
-					break;
-				case 2:
-					strcpy(texName, "shadowMap2");
-					break;
-				case 3:
-					strcpy(texName, "shadowMap3");
-					break;							
-			}
-		int texture_location = glGetUniformLocation(glslShader->shader_id, texName);
-		glUniform1i(texture_location, textureIndex);
-		glActiveTexture(GL_TEXTURE0 + textureIndex);		
-		glBindTexture(GL_TEXTURE_2D, ((OpenGLTexture*)shadowMapTextures[i])->getTextureID());	
-		textureIndex++;
-		}
-	}
-	*/
-/*	
-	cgBinding = (GLSLShaderBinding*)localOptions;
-	for(int i=0; i < cgBinding->textures.size(); i++) {
-		cgGLSetTextureParameter(cgBinding->textures[i].vpParam, ((OpenGLTexture*)cgBinding->textures[i].texture)->getTextureID());
-		cgGLEnableTextureParameter(cgBinding->textures[i].vpParam);
-	}			
-	
-	vector<Texture*> shadowMapTextures = renderer->getShadowMapTextures();
-	char texName[32];
-	for(int i=0; i< 4; i++) {
-		if(i < shadowMapTextures.size()) {
-			switch(i) {
-				case 0:
-					strcpy(texName, "shadowMap0");
-					break;
-				case 1:
-					strcpy(texName, "shadowMap1");
-					break;
-				case 2:
-					strcpy(texName, "shadowMap2");
-					break;
-				case 3:
-					strcpy(texName, "shadowMap3");
-					break;							
-			}
-			cgGLSetTextureParameter(cgGetNamedParameter(cgShader->fp->program, texName), ((OpenGLTexture*)shadowMapTextures[i])->getTextureID());
-			cgGLEnableTextureParameter(cgGetNamedParameter(cgShader->fp->program, texName));					
-		}
-	}
-	
-
-	 */
-	 
-
 		 
 		 
 	return true;
 	return true;
 }
 }
 
 
-void GLSLShaderModule::addParamToProgram(GLSLProgram *program,TiXmlNode *node) {
+GLSLProgramParam GLSLShaderModule::addParamToProgram(GLSLProgram *program,TiXmlNode *node) {
 		bool isAuto = false;
 		bool isAuto = false;
 		int autoID = 0;
 		int autoID = 0;
 		int paramType = GLSLProgramParam::PARAM_UNKNOWN;
 		int paramType = GLSLProgramParam::PARAM_UNKNOWN;
 		void *defaultData = NULL;
 		void *defaultData = NULL;
+		void *minData = NULL;
+		void *maxData = NULL;
+		
 		TiXmlElement *nodeElement = node->ToElement();
 		TiXmlElement *nodeElement = node->ToElement();
 		if (!nodeElement) return; // Skip comment nodes
 		if (!nodeElement) return; // Skip comment nodes
+
+		isAuto = false;
 		
 		
-		if(strcmp(nodeElement->Attribute("type"), "auto") == 0) {
-			isAuto = true;
-			String pid = nodeElement->Attribute("id");
-			if(pid == "POLY_MODELVIEWPROJ_MATRIX")
-				autoID = GLSLProgramParam::POLY_MODELVIEWPROJ_MATRIX;
-			else if(pid == "POLY_AREA_LIGHT_POSITION_0")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_POSITION_0;
-			else if(pid == "POLY_AREA_LIGHT_POSITION_1")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_POSITION_1;
-			else if(pid == "POLY_AREA_LIGHT_POSITION_2")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_POSITION_2;
-			else if(pid == "POLY_AREA_LIGHT_POSITION_3")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_POSITION_3;
-			else if(pid == "POLY_AREA_LIGHT_POSITION_4")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_POSITION_4;
-			else if(pid == "POLY_AREA_LIGHT_POSITION_5")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_POSITION_5;
-			else if(pid == "POLY_AREA_LIGHT_POSITION_6")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_POSITION_6;
-			else if(pid == "POLY_AREA_LIGHT_POSITION_7")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_POSITION_7;
-			
-			else if(pid == "POLY_SPOT_LIGHT_POSITION_0")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_POSITION_0;
-			else if(pid == "POLY_SPOT_LIGHT_POSITION_1")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_POSITION_1;
-			else if(pid == "POLY_SPOT_LIGHT_POSITION_2")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_POSITION_2;
-			else if(pid == "POLY_SPOT_LIGHT_POSITION_3")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_POSITION_3;
-			
-			
-			else if(pid == "POLY_AREA_LIGHT_COLOR_0")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_COLOR_0;
-			else if(pid == "POLY_AREA_LIGHT_COLOR_1")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_COLOR_1;
-			else if(pid == "POLY_AREA_LIGHT_COLOR_2")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_COLOR_2;
-			else if(pid == "POLY_AREA_LIGHT_COLOR_3")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_COLOR_3;
-			else if(pid == "POLY_AREA_LIGHT_COLOR_4")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_COLOR_4;
-			else if(pid == "POLY_AREA_LIGHT_COLOR_5")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_COLOR_5;
-			else if(pid == "POLY_AREA_LIGHT_COLOR_6")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_COLOR_6;
-			else if(pid == "POLY_AREA_LIGHT_COLOR_7")
-				autoID = GLSLProgramParam::POLY_AREA_LIGHT_COLOR_7;
-			
-			else if(pid == "POLY_SPOT_LIGHT_COLOR_0")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_COLOR_0;
-			else if(pid == "POLY_SPOT_LIGHT_COLOR_1")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_COLOR_1;
-			else if(pid == "POLY_SPOT_LIGHT_COLOR_2")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_COLOR_2;
-			else if(pid == "POLY_SPOT_LIGHT_COLOR_3")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_COLOR_3;
-			
-			else if(pid == "POLY_SPOT_LIGHT_DIRECTION_0")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_DIRECTION_0;		
-			else if(pid == "POLY_SPOT_LIGHT_DIRECTION_1")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_DIRECTION_1;		
-			else if(pid == "POLY_SPOT_LIGHT_DIRECTION_2")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_DIRECTION_2;		
-			else if(pid == "POLY_SPOT_LIGHT_DIRECTION_3")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_DIRECTION_3;
-			
-			else if(pid == "POLY_SPOT_LIGHT_TEXTUREMATRIX_0")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_TEXTUREMATRIX_0;
-			else if(pid == "POLY_SPOT_LIGHT_TEXTUREMATRIX_1")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_TEXTUREMATRIX_1;
-			else if(pid == "POLY_SPOT_LIGHT_TEXTUREMATRIX_2")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_TEXTUREMATRIX_2;
-			else if(pid == "POLY_SPOT_LIGHT_TEXTUREMATRIX_3")
-				autoID = GLSLProgramParam::POLY_SPOT_LIGHT_TEXTUREMATRIX_3;		
-			
-			else if(pid == "POLY_MODELVIEW_MATRIX")
-				autoID = GLSLProgramParam::POLY_MODELVIEW_MATRIX;
-			else if(pid == "POLY_MODELVIEW_INVERSE_MATRIX")
-				autoID = GLSLProgramParam::POLY_MODELVIEW_INVERSE_MATRIX;
-			else if(pid == "POLY_EXPOSURE_LEVEL")
-				autoID = GLSLProgramParam::POLY_EXPOSURE_LEVEL;
-			else if(pid == "POLY_CLEARCOLOR")
-				autoID = GLSLProgramParam::POLY_CLEARCOLOR;		
-			else if(pid == "POLY_AMBIENTCOLOR")
-				autoID = GLSLProgramParam::POLY_AMBIENTCOLOR;				
-			else
-				isAuto = false;
-		} else {
-			defaultData = GLSLProgramParam::createParamData(&paramType, nodeElement->Attribute("type"), nodeElement->Attribute("default"));
+		if(nodeElement->Attribute("auto")) {
+			if(strcmp(nodeElement->Attribute("auto"), "true") == 0) {
+				isAuto = true;
+			}
 		}
 		}
 		
 		
-		program->addParam(nodeElement->Attribute("name"), isAuto, autoID, paramType, defaultData);
+		GLSLProgramParam::createParamData(&paramType, nodeElement->Attribute("type"), nodeElement->Attribute("default"), nodeElement->Attribute("min"), nodeElement->Attribute("max"), &defaultData, &minData, &maxData);
+		
+		return program->addParam(nodeElement->Attribute("name"), nodeElement->Attribute("type"), nodeElement->Attribute("default"), isAuto, autoID, paramType, defaultData, minData, maxData);
 }
 }
 
 
 void GLSLShaderModule::reloadPrograms() {
 void GLSLShaderModule::reloadPrograms() {

+ 41 - 6
Core/Contents/Source/PolyMaterial.cpp

@@ -23,21 +23,30 @@
 #include "PolyMaterial.h"
 #include "PolyMaterial.h"
 #include "PolyLogger.h"
 #include "PolyLogger.h"
 #include "PolyShader.h"
 #include "PolyShader.h"
+#include "PolyRenderer.h"
+#include "PolyCoreServices.h"
 
 
 using namespace Polycode;
 using namespace Polycode;
 
 
 Material::Material(const String& name) : Resource(Resource::RESOURCE_MATERIAL) {
 Material::Material(const String& name) : Resource(Resource::RESOURCE_MATERIAL) {
 	this->name = name;
 	this->name = name;
-	specularValue = 75.0;
-	specularStrength = 1.0;
 	fp16RenderTargets = false;
 	fp16RenderTargets = false;
 	shaderModule = NULL;
 	shaderModule = NULL;
+	blendingMode = Renderer::BLEND_MODE_NORMAL;
 }
 }
 
 
 Material::~Material() {
 Material::~Material() {
 	
 	
 	Logger::log("deleting material (%s)\n", name.c_str());
 	Logger::log("deleting material (%s)\n", name.c_str());
 	
 	
+	clearShaders();
+}
+
+void Material::setName(const String &name) {
+	this->name = name;
+}
+
+void Material::clearShaders() {
 	// do not delete shaders here, they're shared
 	// do not delete shaders here, they're shared
 /*	
 /*	
 	for(int i=0; i < materialShaders.size(); i++)	{
 	for(int i=0; i < materialShaders.size(); i++)	{
@@ -54,12 +63,30 @@ Material::~Material() {
 	for(int i=0; i < renderTargets.size(); i++)	{
 	for(int i=0; i < renderTargets.size(); i++)	{
 		delete renderTargets[i];
 		delete renderTargets[i];
 	}
 	}
-	renderTargets.clear();	
+	renderTargets.clear();		
 }
 }
-
+			
 void Material::addShader(Shader *shader,ShaderBinding *shaderBinding) {
 void Material::addShader(Shader *shader,ShaderBinding *shaderBinding) {
 	materialShaders.push_back(shader);
 	materialShaders.push_back(shader);
 	shaderBindings.push_back(shaderBinding);
 	shaderBindings.push_back(shaderBinding);
+	
+	for(int i=0; i < shader->expectedFragmentParams.size(); i++) {
+		if(!shaderBinding->getLocalParamByName(shader->expectedFragmentParams[i].name)) {
+		if(!shader->expectedFragmentParams[i].isAuto) {
+			shaderBinding->addParam(shader->expectedFragmentParams[i].typeString, shader->expectedFragmentParams[i].name, shader->expectedFragmentParams[i].valueString);
+		}
+		}
+	}		
+	
+	for(int i=0; i < shader->expectedVertexParams.size(); i++) {
+		if(!shaderBinding->getLocalParamByName(shader->expectedVertexParams[i].name)) {
+		if(!shader->expectedVertexParams[i].isAuto) {	
+			shaderBinding->addParam(shader->expectedVertexParams[i].typeString, shader->expectedVertexParams[i].name, shader->expectedVertexParams[i].valueString);
+		}
+		}
+	}	
+	
+	CoreServices::getInstance()->getRenderer()->setRendererShaderParams(shader, shaderBinding);	
 }
 }
 
 
 
 
@@ -72,11 +99,19 @@ const String& Material::getName() const {
 }
 }
 
 
 Shader *Material::getShader(unsigned int index) const {
 Shader *Material::getShader(unsigned int index) const {
-	return materialShaders[index];
+	if(index < materialShaders.size()) { 
+		return materialShaders[index];
+	} else {
+		return NULL;
+	}
 }
 }
 
 
 ShaderBinding *Material::getShaderBinding(unsigned int index) const {
 ShaderBinding *Material::getShaderBinding(unsigned int index) const {
-	return shaderBindings[index];
+	if(index < shaderBindings.size()) {
+		return shaderBindings[index]; 
+	} else {
+		return NULL;
+	}
 }
 }
 
 
 void Material::loadMaterial(const String& fileName) {
 void Material::loadMaterial(const String& fileName) {

+ 73 - 43
Core/Contents/Source/PolyMaterialManager.cpp

@@ -56,13 +56,6 @@ Texture *MaterialManager::getTextureByResourcePath(const String& resourcePath) c
 	return NULL;
 	return NULL;
 }
 }
 
 
-//SceneRenderTexture *MaterialManager::createRenderTexture(Scene *targetScene, Camera *targetCamera, int renderWidth,int renderHeight) {
-//	Texture *baseTexture = createTexture(renderWidth, renderHeight, NULL);
-//	textures.push_back(baseTexture);
-//	SceneRenderTexture *renderTexture = new SceneRenderTexture(baseTexture, targetScene, targetCamera, renderWidth, renderHeight);
-//	return renderTexture;
-//}
-
 void MaterialManager::deleteTexture(Texture *texture) {
 void MaterialManager::deleteTexture(Texture *texture) {
 	for(int i=0;i < textures.size(); i++) {
 	for(int i=0;i < textures.size(); i++) {
 		if(textures[i] == texture) {
 		if(textures[i] == texture) {
@@ -105,15 +98,15 @@ Texture *MaterialManager::createTextureFromFile(const String& fileName, bool cla
 	} else {
 	} else {
 		Logger::log("Error loading image, using default texture.\n");
 		Logger::log("Error loading image, using default texture.\n");
 		delete image;		
 		delete image;		
-		newTexture = getTextureByResourcePath("default.png");
+		newTexture = getTextureByResourcePath("default/default.png");
 		return newTexture;
 		return newTexture;
 	}
 	}
 		
 		
 	delete image;
 	delete image;
 
 
-	vector<String> bits = fileName.split("/");
+//	vector<String> bits = fileName.split("/");
 	
 	
-	newTexture->setResourcePath(bits[bits.size()-1]);
+	newTexture->setResourcePath(fileName);
 	return newTexture;
 	return newTexture;
 }
 }
 
 
@@ -155,8 +148,19 @@ void MaterialManager::reloadTextures() {
 	}
 	}
 }
 }
 
 
-void MaterialManager::loadMaterialsFromFile(String fileName) {
-	
+void MaterialManager::registerShader(Shader *shader) {
+	shaders.push_back(shader);
+}
+
+unsigned int MaterialManager::getNumShaders() {
+	return shaders.size();
+}
+
+Shader *MaterialManager::getShaderByIndex(unsigned int index) {
+	if(index < shaders.size())
+		return shaders[index];
+	else
+		return NULL;
 }
 }
 
 
 Shader *MaterialManager::createShaderFromXMLNode(TiXmlNode *node) {
 Shader *MaterialManager::createShaderFromXMLNode(TiXmlNode *node) {
@@ -186,6 +190,14 @@ Shader *MaterialManager::createShaderFromXMLNode(TiXmlNode *node) {
 		numSpotLights = atoi(nodeElement->Attribute("numSpotLights"));
 		numSpotLights = atoi(nodeElement->Attribute("numSpotLights"));
 	}
 	}
 	
 	
+	retShader->screenShader = false;
+	
+	if(nodeElement->Attribute("screen")) {
+		if(String(nodeElement->Attribute("screen")) == "true") {
+			retShader->screenShader = true;
+		}
+	}
+	
 	if(retShader) {
 	if(retShader) {
 		retShader->numAreaLights = numAreaLights;
 		retShader->numAreaLights = numAreaLights;
 		retShader->numSpotLights = numSpotLights;		
 		retShader->numSpotLights = numSpotLights;		
@@ -249,6 +261,47 @@ Cubemap *MaterialManager::cubemapFromXMLNode(TiXmlNode *node) {
 	return newCubemap;
 	return newCubemap;
 }
 }
 
 
+void MaterialManager::addMaterial(Material *material) {
+	materials.push_back(material);
+}
+
+std::vector<Material*> MaterialManager::loadMaterialsFromFile(String fileName) {
+	std::vector<Material*> retVector;
+	
+	TiXmlDocument doc(fileName.c_str());
+	doc.LoadFile();
+	
+	if(doc.Error()) {
+		Logger::log("XML Error: %s\n", doc.ErrorDesc());
+	} else {
+		TiXmlElement *mElem = doc.RootElement()->FirstChildElement("materials");
+		if(mElem) {
+			TiXmlNode* pChild;					
+			for (pChild = mElem->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) {
+				Material *newMat = materialFromXMLNode(pChild);
+				if (newMat) {
+					retVector.push_back(newMat);
+				}
+			}
+		}
+	}
+	
+	return retVector;
+}
+
+Material *MaterialManager::createMaterial(String materialName, String shaderName) {
+	Material *newMaterial = new Material(materialName);
+	
+	Shader *retShader = (Shader*)CoreServices::getInstance()->getResourceManager()->getResource(Resource::RESOURCE_SHADER, shaderName);
+	
+	if(retShader) {
+		ShaderBinding *newShaderBinding = retShader->createBinding();
+		newMaterial->addShader(retShader, newShaderBinding);
+	}
+	
+	return newMaterial;
+}
+
 Material *MaterialManager::materialFromXMLNode(TiXmlNode *node) {
 Material *MaterialManager::materialFromXMLNode(TiXmlNode *node) {
 	TiXmlElement *nodeElement = node->ToElement();
 	TiXmlElement *nodeElement = node->ToElement();
 	if (!nodeElement) return NULL; // Skip comment nodes
 	if (!nodeElement) return NULL; // Skip comment nodes
@@ -263,6 +316,11 @@ Material *MaterialManager::materialFromXMLNode(TiXmlNode *node) {
 	vector<ShaderRenderTarget*> renderTargets;	
 	vector<ShaderRenderTarget*> renderTargets;	
 
 
 	Material *newMaterial = new Material(mname);
 	Material *newMaterial = new Material(mname);
+	
+	
+	if(nodeElement->Attribute("blendingMode")) {
+		newMaterial->blendingMode = atoi(nodeElement->Attribute("blendingMode"));
+	}
 
 
 	for (pChild3 = node->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 	for (pChild3 = node->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 		TiXmlElement *pChild3Element = pChild3->ToElement();
 		TiXmlElement *pChild3Element = pChild3->ToElement();
@@ -317,36 +375,6 @@ Material *MaterialManager::materialFromXMLNode(TiXmlNode *node) {
 	for (pChild3 = node->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 	for (pChild3 = node->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 		TiXmlElement *pChild3Element = pChild3->ToElement();
 		TiXmlElement *pChild3Element = pChild3->ToElement();
 		if (!pChild3Element) continue; // Skip comment nodes
 		if (!pChild3Element) continue; // Skip comment nodes
-
-		if(strcmp(pChild3->Value(), "specularValue") == 0) {
-			newMaterial->specularValue = atof(pChild3Element->GetText());
-		}
-
-		if(strcmp(pChild3->Value(), "specularStrength") == 0) {
-			newMaterial->specularStrength = atof(pChild3Element->GetText());
-		}
-
-
-		if(strcmp(pChild3->Value(), "specularColor") == 0) {		
-			String value = pChild3Element->GetText();
-			vector<String> values = value.split(" ");
-			if(values.size() == 4) {
-				newMaterial->specularColor.setColor(atof(values[0].c_str()), atof(values[1].c_str()), atof(values[2].c_str()),atof(values[3].c_str()));
-			} else {
-				Logger::log("Error: Incorrect number of values for specularColor (%d provided)!\n", values.size());
-			}
-		}
-
-		if(strcmp(pChild3->Value(), "diffuseColor") == 0) {
-			String value = pChild3Element->GetText();
-			vector<String> values = value.split(" ");
-			if(values.size() == 4) {
-				newMaterial->diffuseColor.setColor(atof(values[0].c_str()), atof(values[1].c_str()), atof(values[2].c_str()),atof(values[3].c_str()));
-			} else {
-				Logger::log("Error: Incorrect number of values for diffuseColor (%d provided)!\n", values.size());
-			}
-
-		}
 		
 		
 		if(strcmp(pChild3->Value(), "shader") == 0) {
 		if(strcmp(pChild3->Value(), "shader") == 0) {
 			materialShader = setShaderFromXMLNode(pChild3);
 			materialShader = setShaderFromXMLNode(pChild3);
@@ -421,7 +449,9 @@ Material *MaterialManager::materialFromXMLNode(TiXmlNode *node) {
 								if(pChild2Element->Attribute("name")) {
 								if(pChild2Element->Attribute("name")) {
 									tname =  pChild2Element->Attribute("name");
 									tname =  pChild2Element->Attribute("name");
 								}
 								}
-								newShaderBinding->addTexture(tname, (Texture*)CoreServices::getInstance()->getResourceManager()->getResource(Resource::RESOURCE_TEXTURE, pChild2Element->GetText()));
+								Texture *texture = CoreServices::getInstance()->getMaterialManager()->createTextureFromFile(pChild2Element->GetText());
+								newShaderBinding->addTexture(tname,texture);
+//								newShaderBinding->addTexture(tname, (Texture*)CoreServices::getInstance()->getResourceManager()->getResource(Resource::RESOURCE_TEXTURE, pChild2Element->GetText()));
 							}
 							}
 							
 							
 							if(strcmp(pChild2->Value(), "cubemap") == 0){
 							if(strcmp(pChild2->Value(), "cubemap") == 0){

+ 7 - 8
Core/Contents/Source/PolyObject.cpp

@@ -112,10 +112,11 @@ TiXmlElement *Object::createElementFromObjectEntry(ObjectEntry *entry) {
 		case ObjectEntry::STRING_ENTRY: {
 		case ObjectEntry::STRING_ENTRY: {
 			newElement->LinkEndChild(new TiXmlText( entry->stringVal.c_str() ));
 			newElement->LinkEndChild(new TiXmlText( entry->stringVal.c_str() ));
 		} break;
 		} break;
-		default: { // Some sort of container.
-			for(int i=0; i < entry->children.size(); i++) {
+	}
+
+	for(int i=0; i < entry->children.size(); i++) {
 				ObjectEntry *childEntry = entry->children[i];
 				ObjectEntry *childEntry = entry->children[i];
-				bool needLinkChild = entry->type == ObjectEntry::ARRAY_ENTRY;
+				bool needLinkChild = (childEntry->children.size() > 0) || (entry->type == ObjectEntry::ARRAY_ENTRY);
 				
 				
 		//		printf("Parsing %s (type: %d)\n", childEntry->name.c_str(), childEntry->type);
 		//		printf("Parsing %s (type: %d)\n", childEntry->name.c_str(), childEntry->type);
 				
 				
@@ -138,9 +139,7 @@ TiXmlElement *Object::createElementFromObjectEntry(ObjectEntry *entry) {
 						break;
 						break;
 						case ObjectEntry::STRING_ENTRY: 
 						case ObjectEntry::STRING_ENTRY: 
 						{
 						{
-							TiXmlElement *childElement = new TiXmlElement(childTypedName.c_str());  
-							childElement->LinkEndChild( new TiXmlText(childEntry->stringVal.c_str()));
-							newElement->LinkEndChild(childElement);								
+							newElement->SetAttribute(childTypedName.c_str(), childEntry->stringVal.c_str());		
 						} break;
 						} break;
 						default:
 						default:
 							needLinkChild = true;
 							needLinkChild = true;
@@ -153,10 +152,10 @@ TiXmlElement *Object::createElementFromObjectEntry(ObjectEntry *entry) {
 					newElement->LinkEndChild(childElement);
 					newElement->LinkEndChild(childElement);
 				}
 				}
 			}
 			}
-		} break;
-	}
+
 	
 	
 	return newElement;
 	return newElement;
+
 }
 }
 
 
 bool Object::loadFromXMLString(const String &xmlString) {
 bool Object::loadFromXMLString(const String &xmlString) {

+ 23 - 0
Core/Contents/Source/PolyRenderer.cpp

@@ -46,6 +46,7 @@ Renderer::Renderer() : currentTexture(NULL), xRes(0), yRes(0), renderMode(0), or
 	fov = 45.0;
 	fov = 45.0;
 	setAmbientColor(0.0,0.0,0.0);
 	setAmbientColor(0.0,0.0,0.0);
 	cullingFrontFaces = false;
 	cullingFrontFaces = false;
+	
 }
 }
 
 
 Renderer::~Renderer() {
 Renderer::~Renderer() {
@@ -319,6 +320,28 @@ void Renderer::billboardMatrix() {
 	setModelviewMatrix(matrix);
 	setModelviewMatrix(matrix);
 }
 }
 
 
+void *Renderer::getDataPointerForName(const String &name) {
+	if(name == "ambient_color") {
+		return (void*)&ambientColor;
+	}
+}
+
+void Renderer::setRendererShaderParams(Shader *shader, ShaderBinding *binding) {
+	for(int i=0; i < shader->expectedFragmentParams.size(); i++) {
+		if(shader->expectedFragmentParams[i].isAuto) {
+			binding->addLocalParam(shader->expectedFragmentParams[i].name, getDataPointerForName(shader->expectedFragmentParams[i].name));
+		}
+	}
+
+	for(int i=0; i < shader->expectedVertexParams.size(); i++) {
+		if(shader->expectedVertexParams[i].isAuto) {			
+			binding->addLocalParam(shader->expectedVertexParams[i].name, getDataPointerForName(shader->expectedVertexParams[i].name));
+		}
+	}
+
+
+}
+
 void Renderer::pushDataArrayForMesh(Mesh *mesh, int arrayType) {
 void Renderer::pushDataArrayForMesh(Mesh *mesh, int arrayType) {
 	if(mesh->arrayDirtyMap[arrayType] == true || mesh->renderDataArrays[arrayType] == NULL) {
 	if(mesh->arrayDirtyMap[arrayType] == true || mesh->renderDataArrays[arrayType] == NULL) {
 		if(mesh->renderDataArrays[arrayType] != NULL) {
 		if(mesh->renderDataArrays[arrayType] != NULL) {

+ 36 - 30
Core/Contents/Source/PolyResourceManager.cpp

@@ -74,6 +74,7 @@ void ResourceManager::parseShaders(const String& dirPath, bool recursive) {
 								Logger::log("Adding shader %s\n", newShader->getName().c_str());
 								Logger::log("Adding shader %s\n", newShader->getName().c_str());
 								newShader->setResourceName(newShader->getName());
 								newShader->setResourceName(newShader->getName());
 								resources.push_back(newShader);
 								resources.push_back(newShader);
+								 CoreServices::getInstance()->getMaterialManager()->registerShader(newShader);
 							}
 							}
 						}
 						}
 					}
 					}
@@ -119,24 +120,14 @@ void ResourceManager::parseMaterials(const String& dirPath, bool recursive) {
 	
 	
 	for(int i=0; i < resourceDir.size(); i++) {	
 	for(int i=0; i < resourceDir.size(); i++) {	
 		if(resourceDir[i].type == OSFileEntry::TYPE_FILE) {
 		if(resourceDir[i].type == OSFileEntry::TYPE_FILE) {
-			if(resourceDir[i].extension == "mat") {
-				Logger::log("Adding materials from %s\n", resourceDir[i].nameWithoutExtension.c_str());
-				TiXmlDocument doc(resourceDir[i].fullPath.c_str());
-				doc.LoadFile();
-				if(doc.Error()) {
-					Logger::log("XML Error: %s\n", doc.ErrorDesc());
-				} else {
-					TiXmlElement *mElem = doc.RootElement()->FirstChildElement("materials");
-					if(mElem) {
-						TiXmlNode* pChild;					
-						for (pChild = mElem->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) {
-							Material *newMat = CoreServices::getInstance()->getMaterialManager()->materialFromXMLNode(pChild);
-							if (newMat) {
-								newMat->setResourceName(newMat->getName());
-								resources.push_back(newMat);
-							}
-						}
-					}
+			if(resourceDir[i].extension == "mat") {				
+				MaterialManager *materialManager = CoreServices::getInstance()->getMaterialManager();			
+				std::vector<Material*> materials = materialManager->loadMaterialsFromFile(resourceDir[i].fullPath);
+
+				for(int m=0; m < materials.size(); m++) {
+					materials[m]->setResourceName(materials[m]->getName());
+					resources.push_back(materials[m]);
+					materialManager->addMaterial(materials[m]);
 				}
 				}
 			}
 			}
 		} else {
 		} else {
@@ -183,7 +174,7 @@ void ResourceManager::addResource(Resource *resource) {
 	resources.push_back(resource);
 	resources.push_back(resource);
 }
 }
 
 
-void ResourceManager::parseTextures(const String& dirPath, bool recursive) {
+void ResourceManager::parseTextures(const String& dirPath, bool recursive, const String& basePath) {
 	vector<OSFileEntry> resourceDir;
 	vector<OSFileEntry> resourceDir;
 	resourceDir = OSBasics::parseFolder(dirPath, false);
 	resourceDir = OSBasics::parseFolder(dirPath, false);
 	for(int i=0; i < resourceDir.size(); i++) {	
 	for(int i=0; i < resourceDir.size(); i++) {	
@@ -192,13 +183,22 @@ void ResourceManager::parseTextures(const String& dirPath, bool recursive) {
 				Logger::log("Adding texture %s\n", resourceDir[i].nameWithoutExtension.c_str());
 				Logger::log("Adding texture %s\n", resourceDir[i].nameWithoutExtension.c_str());
 				Texture *t = CoreServices::getInstance()->getMaterialManager()->createTextureFromFile(resourceDir[i].fullPath);
 				Texture *t = CoreServices::getInstance()->getMaterialManager()->createTextureFromFile(resourceDir[i].fullPath);
 				if(t) {
 				if(t) {
-					t->setResourceName(resourceDir[i].name);
+					if(basePath == "") {
+						t->setResourceName(resourceDir[i].name);					
+					} else {
+						t->setResourceName(basePath+"/"+resourceDir[i].name);
+					}
 					resources.push_back(t);
 					resources.push_back(t);
 				}
 				}
 			}
 			}
 		} else {
 		} else {
-			if(recursive)
-				parseTextures(dirPath+"/"+resourceDir[i].name, true);
+			if(recursive) {
+				if(basePath == "") {			
+					parseTextures(dirPath+"/"+resourceDir[i].name, true, resourceDir[i].name);
+				} else {
+					parseTextures(dirPath+"/"+resourceDir[i].name, true, basePath+"/"+resourceDir[i].name);
+				}
+			}
 		}
 		}
 	}
 	}
 }
 }
@@ -220,17 +220,21 @@ void ResourceManager::parseOthers(const String& dirPath, bool recursive) {
 }
 }
 
 
 
 
-void ResourceManager::addArchive(const String& zipPath) {
-//	if(PHYSFS_addToSearchPath(zipPath.c_str(), 1, getThreadID()) == 0) {
-	if(PHYSFS_addToSearchPath(zipPath.c_str(), 1) == 0) {	
+void ResourceManager::addArchive(const String& path) {
+	if(PHYSFS_addToSearchPath(path.c_str(), 1) == 0) {	
 		Logger::log("Error adding archive to resource manager... %s\n", PHYSFS_getLastError());
 		Logger::log("Error adding archive to resource manager... %s\n", PHYSFS_getLastError());
 	} else {
 	} else {
-		Logger::log("Added archive: %s\n", zipPath.c_str());
+		Logger::log("Added archive: %s\n", path.c_str());
 	}
 	}
 }
 }
 
 
+void ResourceManager::removeArchive(const String& path) {
+	PHYSFS_removeFromSearchPath(path.c_str());
+}
+
+
 void ResourceManager::addDirResource(const String& dirPath, bool recursive) {
 void ResourceManager::addDirResource(const String& dirPath, bool recursive) {
-	parseTextures(dirPath, recursive);
+	parseTextures(dirPath, recursive, "");
 	parsePrograms(dirPath, recursive);
 	parsePrograms(dirPath, recursive);
 	parseShaders(dirPath, recursive);
 	parseShaders(dirPath, recursive);
 	parseCubemaps(dirPath, recursive);	
 	parseCubemaps(dirPath, recursive);	
@@ -246,9 +250,11 @@ Resource *ResourceManager::getResource(int resourceType, const String& resourceN
 			return resources[i];
 			return resources[i];
 		}
 		}
 	}
 	}
-	if(resourceType == Resource::RESOURCE_TEXTURE && resourceName != "default.png")
-		return getResource(Resource::RESOURCE_TEXTURE, "default.png");
-		
+	
+	if(resourceType == Resource::RESOURCE_TEXTURE && resourceName != "default/default.png") {
+		Logger::log("Texture not found, using default\n");
+		return getResource(Resource::RESOURCE_TEXTURE, "default/default.png");
+	}	
 	Logger::log("return NULL\n");
 	Logger::log("return NULL\n");
 	// need to add some sort of default resource for each type
 	// need to add some sort of default resource for each type
 	return NULL;
 	return NULL;

+ 11 - 0
Core/Contents/Source/PolySceneMesh.cpp

@@ -104,7 +104,18 @@ void SceneMesh::setTexture(Texture *texture) {
 	this->texture = texture;
 	this->texture = texture;
 }
 }
 
 
+void SceneMesh::clearMaterial() {
+	if(localShaderOptions)
+		delete localShaderOptions;
+	localShaderOptions = NULL;
+	this->material = NULL;
+}
+
 void SceneMesh::setMaterial(Material *material) {
 void SceneMesh::setMaterial(Material *material) {
+
+	if(this->material)
+		clearMaterial();
+	
 	if(!material)
 	if(!material)
 		return;
 		return;
 		
 		

+ 7 - 4
Core/Contents/Source/PolyScreenShape.cpp

@@ -89,10 +89,10 @@ ScreenShape::ScreenShape(int shapeType, Number option1, Number option2, Number o
 }
 }
 
 
 void ScreenShape::setShapeSize(Number newWidth, Number newHeight) {
 void ScreenShape::setShapeSize(Number newWidth, Number newHeight) {
-	width = newWidth;
-	height = newHeight;
-	
-	setHitbox(width, height);
+
+	setWidth(newWidth);
+	setHeight(newHeight);
+
 	
 	
 	Number whalf = floor(width/2.0f);
 	Number whalf = floor(width/2.0f);
 	Number hhalf = floor(height/2.0f);
 	Number hhalf = floor(height/2.0f);
@@ -115,6 +115,8 @@ void ScreenShape::setShapeSize(Number newWidth, Number newHeight) {
 		default:
 		default:
 		break;
 		break;
 	}
 	}
+	
+		
 	mesh->arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
 	mesh->arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
 	rebuildTransformMatrix();
 	rebuildTransformMatrix();
 	matrixDirty = true;
 	matrixDirty = true;
@@ -168,6 +170,7 @@ void ScreenShape::Render() {
 	ScreenMesh::Render();
 	ScreenMesh::Render();
 
 
 	if(strokeEnabled) {
 	if(strokeEnabled) {
+		renderer->setTexture(NULL);
 		if(lineSmooth) {
 		if(lineSmooth) {
 				renderer->setLineSmooth(true);
 				renderer->setLineSmooth(true);
 		}
 		}

+ 12 - 13
Core/Contents/Source/PolyShader.cpp

@@ -29,7 +29,18 @@ ShaderBinding::ShaderBinding(Shader *shader) {
 }
 }
 
 
 ShaderBinding::~ShaderBinding() {
 ShaderBinding::~ShaderBinding() {
-
+	for(int i=0; i < localParams.size(); i++) {
+		delete localParams[i];
+	}	
+	for(int i=0; i < renderTargetBindings.size(); i++) {
+		delete renderTargetBindings[i];
+	}	
+	for(int i=0; i < inTargetBindings.size(); i++) {
+		delete inTargetBindings[i];
+	}	
+	for(int i=0; i < outTargetBindings.size(); i++) {
+		delete outTargetBindings[i];
+	}	
 }
 }
 
 
 unsigned int ShaderBinding::getNumLocalParams() {
 unsigned int ShaderBinding::getNumLocalParams() {
@@ -56,18 +67,6 @@ void ShaderBinding::addLocalParam(const String& name, void *ptr) {
 	localParams.push_back(newParam);
 	localParams.push_back(newParam);
 }
 }
 
 
-void ShaderBinding::addLocalParamNumber(const String& name, Number n) {
-	Number *value = new Number;
-	*value = n;
-	addLocalParam(name, value);
-}
-
-void ShaderBinding::addLocalParamVector3(const String& name, Vector3 v) {
-	Vector3 *value = new Vector3;
-	memcpy(value, &v, sizeof(v));
-	addLocalParam(name, value);
-}
-
 void ShaderBinding::addRenderTargetBinding(RenderTargetBinding *binding) {
 void ShaderBinding::addRenderTargetBinding(RenderTargetBinding *binding) {
 	renderTargetBindings.push_back(binding);
 	renderTargetBindings.push_back(binding);
 	if(binding->mode == RenderTargetBinding::MODE_IN) {
 	if(binding->mode == RenderTargetBinding::MODE_IN) {

+ 10 - 0
IDE/Build/Mac OS X/Polycode.xcodeproj/project.pbxproj

@@ -18,6 +18,7 @@
 		6D56156814C5430300FC8BD4 /* PolycodeScreenEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D56156714C5430300FC8BD4 /* PolycodeScreenEditor.cpp */; };
 		6D56156814C5430300FC8BD4 /* PolycodeScreenEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D56156714C5430300FC8BD4 /* PolycodeScreenEditor.cpp */; };
 		6D6D3FA614B446A600219173 /* PolycodeToolLauncher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D6D3FA514B446A600219173 /* PolycodeToolLauncher.cpp */; };
 		6D6D3FA614B446A600219173 /* PolycodeToolLauncher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D6D3FA514B446A600219173 /* PolycodeToolLauncher.cpp */; };
 		6D70AB2A12B29BF200EB6D94 /* NewFileWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D70AB2912B29BF200EB6D94 /* NewFileWindow.cpp */; };
 		6D70AB2A12B29BF200EB6D94 /* NewFileWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D70AB2912B29BF200EB6D94 /* NewFileWindow.cpp */; };
+		6D80B0CE163B14CB00EF3C04 /* PolycodeMaterialEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D80B0CD163B14CB00EF3C04 /* PolycodeMaterialEditor.cpp */; };
 		6D80E91E12AB53FB0037A708 /* PolycodeFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D80E91912AB53FB0037A708 /* PolycodeFrame.cpp */; };
 		6D80E91E12AB53FB0037A708 /* PolycodeFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D80E91912AB53FB0037A708 /* PolycodeFrame.cpp */; };
 		6D80E91F12AB53FB0037A708 /* PolycodeIDEApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D80E91A12AB53FB0037A708 /* PolycodeIDEApp.cpp */; };
 		6D80E91F12AB53FB0037A708 /* PolycodeIDEApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D80E91A12AB53FB0037A708 /* PolycodeIDEApp.cpp */; };
 		6D80E92012AB53FB0037A708 /* PolycodeProject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D80E91B12AB53FB0037A708 /* PolycodeProject.cpp */; };
 		6D80E92012AB53FB0037A708 /* PolycodeProject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D80E91B12AB53FB0037A708 /* PolycodeProject.cpp */; };
@@ -43,6 +44,7 @@
 		6DFE89C214B3FC0900DA7ABD /* libpng15.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DFE89BB14B3FC0900DA7ABD /* libpng15.a */; };
 		6DFE89C214B3FC0900DA7ABD /* libpng15.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DFE89BB14B3FC0900DA7ABD /* libpng15.a */; };
 		6DFE89C314B3FC0900DA7ABD /* libz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DFE89BC14B3FC0900DA7ABD /* libz.a */; };
 		6DFE89C314B3FC0900DA7ABD /* libz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DFE89BC14B3FC0900DA7ABD /* libz.a */; };
 		6DFE89CC14B3FE3D00DA7ABD /* default.pak in Resources */ = {isa = PBXBuildFile; fileRef = 6DFE89CB14B3FE3D00DA7ABD /* default.pak */; };
 		6DFE89CC14B3FE3D00DA7ABD /* default.pak in Resources */ = {isa = PBXBuildFile; fileRef = 6DFE89CB14B3FE3D00DA7ABD /* default.pak */; };
+		6DFF77AA164090040040AED8 /* hdr.pak in Resources */ = {isa = PBXBuildFile; fileRef = 6DFF77A9164090040040AED8 /* hdr.pak */; };
 		8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
 		8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
 		8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
 		8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
 		8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
 		8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
@@ -86,6 +88,8 @@
 		6D6D3FA814B446AF00219173 /* PolycodeToolLauncher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeToolLauncher.h; sourceTree = "<group>"; };
 		6D6D3FA814B446AF00219173 /* PolycodeToolLauncher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeToolLauncher.h; sourceTree = "<group>"; };
 		6D70AB2812B29BEC00EB6D94 /* NewFileWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewFileWindow.h; sourceTree = "<group>"; };
 		6D70AB2812B29BEC00EB6D94 /* NewFileWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewFileWindow.h; sourceTree = "<group>"; };
 		6D70AB2912B29BF200EB6D94 /* NewFileWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NewFileWindow.cpp; sourceTree = "<group>"; };
 		6D70AB2912B29BF200EB6D94 /* NewFileWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NewFileWindow.cpp; sourceTree = "<group>"; };
+		6D80B0CD163B14CB00EF3C04 /* PolycodeMaterialEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PolycodeMaterialEditor.cpp; sourceTree = "<group>"; };
+		6D80B0D0163B14D100EF3C04 /* PolycodeMaterialEditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeMaterialEditor.h; sourceTree = "<group>"; };
 		6D80E91312AB53FB0037A708 /* PolycodeFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeFrame.h; sourceTree = "<group>"; };
 		6D80E91312AB53FB0037A708 /* PolycodeFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeFrame.h; sourceTree = "<group>"; };
 		6D80E91412AB53FB0037A708 /* PolycodeIDEApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeIDEApp.h; sourceTree = "<group>"; };
 		6D80E91412AB53FB0037A708 /* PolycodeIDEApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeIDEApp.h; sourceTree = "<group>"; };
 		6D80E91512AB53FB0037A708 /* PolycodeProject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeProject.h; sourceTree = "<group>"; };
 		6D80E91512AB53FB0037A708 /* PolycodeProject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeProject.h; sourceTree = "<group>"; };
@@ -126,6 +130,7 @@
 		6DFE89BB14B3FC0900DA7ABD /* libpng15.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpng15.a; path = ../../../Release/Darwin/Framework/Core/Dependencies/lib/libpng15.a; sourceTree = "<group>"; };
 		6DFE89BB14B3FC0900DA7ABD /* libpng15.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpng15.a; path = ../../../Release/Darwin/Framework/Core/Dependencies/lib/libpng15.a; sourceTree = "<group>"; };
 		6DFE89BC14B3FC0900DA7ABD /* libz.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libz.a; path = ../../../Release/Darwin/Framework/Core/Dependencies/lib/libz.a; sourceTree = "<group>"; };
 		6DFE89BC14B3FC0900DA7ABD /* libz.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libz.a; path = ../../../Release/Darwin/Framework/Core/Dependencies/lib/libz.a; sourceTree = "<group>"; };
 		6DFE89CB14B3FE3D00DA7ABD /* default.pak */ = {isa = PBXFileReference; lastKnownFileType = file; name = default.pak; path = ../../../Release/Darwin/Framework/Core/Assets/default.pak; sourceTree = "<group>"; };
 		6DFE89CB14B3FE3D00DA7ABD /* default.pak */ = {isa = PBXFileReference; lastKnownFileType = file; name = default.pak; path = ../../../Release/Darwin/Framework/Core/Assets/default.pak; sourceTree = "<group>"; };
+		6DFF77A9164090040040AED8 /* hdr.pak */ = {isa = PBXFileReference; lastKnownFileType = file; name = hdr.pak; path = ../../../Release/Darwin/Framework/Core/Assets/hdr.pak; sourceTree = "<group>"; };
 		8D1107310486CEB800E47090 /* Polycode-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Polycode-Info.plist"; sourceTree = "<group>"; };
 		8D1107310486CEB800E47090 /* Polycode-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Polycode-Info.plist"; sourceTree = "<group>"; };
 		8D1107320486CEB800E47090 /* Polycode.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Polycode.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		8D1107320486CEB800E47090 /* Polycode.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Polycode.app; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 /* End PBXFileReference section */
@@ -229,6 +234,7 @@
 		29B97317FDCFA39411CA2CEA /* Resources */ = {
 		29B97317FDCFA39411CA2CEA /* Resources */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				6DFF77A9164090040040AED8 /* hdr.pak */,
 				6DFE89CB14B3FE3D00DA7ABD /* default.pak */,
 				6DFE89CB14B3FE3D00DA7ABD /* default.pak */,
 				6D8A55B814B3EABB005F6411 /* main_icon.icns */,
 				6D8A55B814B3EABB005F6411 /* main_icon.icns */,
 				8D1107310486CEB800E47090 /* Polycode-Info.plist */,
 				8D1107310486CEB800E47090 /* Polycode-Info.plist */,
@@ -250,6 +256,7 @@
 		6D80E91212AB53FB0037A708 /* Include */ = {
 		6D80E91212AB53FB0037A708 /* Include */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				6D80B0D0163B14D100EF3C04 /* PolycodeMaterialEditor.h */,
 				6DD1835F1628A4D2005A5682 /* PolycodeRemoteDebugger.h */,
 				6DD1835F1628A4D2005A5682 /* PolycodeRemoteDebugger.h */,
 				6D3DC79F16220440003ED2C9 /* PolycodeConsole.h */,
 				6D3DC79F16220440003ED2C9 /* PolycodeConsole.h */,
 				6D56156514C542FB00FC8BD4 /* PolycodeScreenEditor.h */,
 				6D56156514C542FB00FC8BD4 /* PolycodeScreenEditor.h */,
@@ -278,6 +285,7 @@
 		6D80E91812AB53FB0037A708 /* Source */ = {
 		6D80E91812AB53FB0037A708 /* Source */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				6D80B0CD163B14CB00EF3C04 /* PolycodeMaterialEditor.cpp */,
 				6DD1835C1628A4CC005A5682 /* PolycodeRemoteDebugger.cpp */,
 				6DD1835C1628A4CC005A5682 /* PolycodeRemoteDebugger.cpp */,
 				6D3DC79C1622043A003ED2C9 /* PolycodeConsole.cpp */,
 				6D3DC79C1622043A003ED2C9 /* PolycodeConsole.cpp */,
 				6D56156714C5430300FC8BD4 /* PolycodeScreenEditor.cpp */,
 				6D56156714C5430300FC8BD4 /* PolycodeScreenEditor.cpp */,
@@ -358,6 +366,7 @@
 				1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */,
 				1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */,
 				6D8A55B914B3EABB005F6411 /* main_icon.icns in Resources */,
 				6D8A55B914B3EABB005F6411 /* main_icon.icns in Resources */,
 				6DFE89CC14B3FE3D00DA7ABD /* default.pak in Resources */,
 				6DFE89CC14B3FE3D00DA7ABD /* default.pak in Resources */,
+				6DFF77AA164090040040AED8 /* hdr.pak in Resources */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
@@ -406,6 +415,7 @@
 				6D56156814C5430300FC8BD4 /* PolycodeScreenEditor.cpp in Sources */,
 				6D56156814C5430300FC8BD4 /* PolycodeScreenEditor.cpp in Sources */,
 				6D3DC79D1622043A003ED2C9 /* PolycodeConsole.cpp in Sources */,
 				6D3DC79D1622043A003ED2C9 /* PolycodeConsole.cpp in Sources */,
 				6DD1835D1628A4CC005A5682 /* PolycodeRemoteDebugger.cpp in Sources */,
 				6DD1835D1628A4CC005A5682 /* PolycodeRemoteDebugger.cpp in Sources */,
+				6D80B0CE163B14CB00EF3C04 /* PolycodeMaterialEditor.cpp in Sources */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};

+ 5 - 0
IDE/Contents/Include/PolycodeEditor.h

@@ -24,9 +24,11 @@
 
 
 #include "Polycode.h"
 #include "Polycode.h"
 #include "OSBasics.h"
 #include "OSBasics.h"
+#include "PolycodeProject.h"
 
 
 using namespace Polycode;
 using namespace Polycode;
 
 
+
 class PolycodeEditor : public ScreenEntity { 
 class PolycodeEditor : public ScreenEntity { 
 public:
 public:
 	PolycodeEditor(bool _isReadOnly);
 	PolycodeEditor(bool _isReadOnly);
@@ -46,6 +48,8 @@ public:
 	
 	
 	String getEditorType() { return editorType; }
 	String getEditorType() { return editorType; }
 	
 	
+	PolycodeProject *parentProject;
+		
 protected:
 protected:
 	String filePath;
 	String filePath;
 	bool _isReadOnly;
 	bool _isReadOnly;
@@ -53,6 +57,7 @@ protected:
 	Vector2 editorSize;
 	Vector2 editorSize;
 	
 	
 	String editorType;
 	String editorType;
+	
 };
 };
 
 
 
 

+ 1 - 0
IDE/Contents/Include/PolycodeIDEApp.h

@@ -31,6 +31,7 @@
 #include "PolycodeFrame.h"
 #include "PolycodeFrame.h"
 
 
 #include "PolycodeImageEditor.h"
 #include "PolycodeImageEditor.h"
+#include "PolycodeMaterialEditor.h"
 #include "PolycodeScreenEditor.h"
 #include "PolycodeScreenEditor.h"
 #include "PolycodeFontEditor.h"
 #include "PolycodeFontEditor.h"
 #include "PolycodeTextEditor.h"
 #include "PolycodeTextEditor.h"

+ 8 - 1
IDE/Contents/Include/PolycodeImageEditor.h

@@ -38,7 +38,14 @@ class PolycodeImageEditor : public PolycodeEditor {
 	protected:
 	protected:
 		ScreenImage *grid;
 		ScreenImage *grid;
 	
 	
-		ScreenImage *editorImage;
+		ScreenShape *editorImage;
+		
+		ScreenShape *leftShape;		
+		ScreenShape *rightShape;		
+		ScreenShape *topShape;		
+		ScreenShape *bottomShape;								
+		
+		Number aspectRatio;
 };
 };
 
 
 class PolycodeImageEditorFactory : public PolycodeEditorFactory {
 class PolycodeImageEditorFactory : public PolycodeEditorFactory {

+ 196 - 0
IDE/Contents/Include/PolycodeMaterialEditor.h

@@ -0,0 +1,196 @@
+/*
+ Copyright (C) 2012 by Ivan Safrin
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+ 
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ */
+ 
+#pragma once
+
+#include "PolycodeEditor.h"
+#include <Polycode.h>
+#include "PolycodeUI.h"
+
+using namespace Polycode;
+
+
+class MaterialBrowserData  {
+public:
+	MaterialBrowserData() {
+		material = NULL;
+	}
+	Material *material;
+	String name;
+};
+
+
+class MaterialBrowser : public UIElement {
+	public:
+		MaterialBrowser();
+		~MaterialBrowser();
+		
+		void Resize(Number width, Number height);
+		
+		UITree * addMaterial(Material *material);
+		void handleEvent(Event *event);
+		
+		MaterialBrowserData *selectedData;
+				
+		UIImageButton *newMaterialButton;
+		
+		UITree *selectedNode;
+												
+	protected:
+	
+		ScreenShape *headerBg;
+	
+		UITree *shadersNode;
+		UITree *materialsNode;
+		UITree *cubemapsNode;			
+	
+		UITreeContainer *treeContainer;	
+};
+
+class MaterialTextureSlot : public UIElement {
+	public:
+		MaterialTextureSlot(String textureNameString);
+		~MaterialTextureSlot();
+		
+		ScreenShape *bgShape;
+		ScreenShape *imageShape;
+		
+		ScreenLabel *textureName;
+		ScreenLabel *textureFileName;	
+		
+		String textureString;
+};
+
+class MaterialPropertySlot : public UIElement {
+	public:
+		MaterialPropertySlot(UIColorPicker *colorPicker, ShaderBinding *binding, ProgramParam param);
+		~MaterialPropertySlot();
+		
+		void handleEvent(Event *event);
+		
+		ScreenLabel *propertyName;	
+		
+		ScreenLabel *minLabel;
+		ScreenLabel *maxLabel;
+							
+		UIHSlider *numberSlider;
+		UIColorBox *colorBox;
+					
+		ShaderBinding *binding;		
+		ProgramParam param;
+		
+		String finalName;
+		
+};
+
+class MaterialEditorPane : public UIWindow {
+	public:
+		MaterialEditorPane(UIColorPicker *colorPicker);
+		~MaterialEditorPane();
+		
+		void setMaterial(Material *material);
+		
+		void clearAll();
+		
+		void handleEvent(Event *event);
+		
+		void handleDroppedFile(OSFileEntry file, Number x, Number y);	
+		
+		void showPrimitive(unsigned int index);
+		
+		Material *currentMaterial;
+				
+	protected:
+	
+	
+		std::vector<MaterialTextureSlot*> textureSlots;
+		std::vector<MaterialPropertySlot*> fragmentPropertySlots;
+	
+		ScreenEntity *textureSlotBase;
+	
+		ScenePrimitive *previewPrimitive;
+		
+		UIElement *paramsEntity;
+		
+		Scene *previewScene;
+		SceneLight *mainLight;
+		SceneLight *secondLight;		
+		SceneRenderTexture *renderTexture;
+		ScreenShape *previewShape;
+		
+		UIComboBox *shaderSelector;
+		UIColorPicker *colorPicker;		
+
+		UIComboBox *blendSelector;
+		
+		UITextInput *nameInput;
+		
+		std::vector<UIImageButton*> shapeSwitches;
+		std::vector<ScenePrimitive*> shapePrimitives;
+		ScreenImage *shapeSelector;
+		
+};
+
+class MaterialMainWindow : public UIElement {
+	public:
+	MaterialMainWindow();
+	~MaterialMainWindow(){}
+	
+	void Resize(Number width, Number height);
+	
+	MaterialEditorPane *materialPane;	
+	UIColorPicker *colorPicker;
+};
+
+class PolycodeMaterialEditor : public PolycodeEditor {
+	public:
+	PolycodeMaterialEditor();
+	virtual ~PolycodeMaterialEditor();
+	
+	bool openFile(OSFileEntry filePath);
+	void Resize(int x, int y);
+	
+	void handleDroppedFile(OSFileEntry file, Number x, Number y);
+	
+	void handleEvent(Event *event);	
+	void saveFile();
+	
+	String createStringValue(unsigned int type, void *value);
+	
+	protected:
+		ScreenImage *grid;	
+		ScreenImage *editorImage;
+		
+		MaterialBrowser *materialBrowser;
+		UIHSizer *mainSizer;
+		
+		MaterialMainWindow *mainWindow;
+		std::vector<Material*> materials;
+		
+		UITree *selectedMaterialNode;
+};
+
+class PolycodeMaterialEditorFactory : public PolycodeEditorFactory {
+	public:
+		PolycodeMaterialEditorFactory() : PolycodeEditorFactory() { extensions.push_back("mat"); }
+		PolycodeEditor *createEditor() { return new PolycodeMaterialEditor(); }
+};

+ 2 - 1
IDE/Contents/Include/PolycodeProjectEditor.h

@@ -38,7 +38,7 @@ class PolycodeProjectEditor : public PolycodeEditor {
 	
 	
 	bool openFile(OSFileEntry filePath);
 	bool openFile(OSFileEntry filePath);
 	void Resize(int x, int y);
 	void Resize(int x, int y);
-	void saveFile();	
+	void saveFile();
 		
 		
 	protected:
 	protected:
 	
 	
@@ -62,6 +62,7 @@ class PolycodeProjectEditor : public PolycodeEditor {
 	UITextInput *entryPointInput;	
 	UITextInput *entryPointInput;	
 	UIColorBox *bgColorBox;
 	UIColorBox *bgColorBox;
 	
 	
+	UIColorPicker *colorPicker;
 	
 	
 	PolycodeProject *associatedProject;
 	PolycodeProject *associatedProject;
 	
 	

+ 1 - 4
IDE/Contents/Include/PolycodeProjectManager.h

@@ -41,10 +41,7 @@ class PolycodeProjectManager {
 	void setProjectBrowser(PolycodeProjectBrowser *projectBrowser) { this->projectBrowser = projectBrowser; }
 	void setProjectBrowser(PolycodeProjectBrowser *projectBrowser) { this->projectBrowser = projectBrowser; }
 	
 	
 	PolycodeProject* getActiveProject() { return activeProject; }
 	PolycodeProject* getActiveProject() { return activeProject; }
-	void setActiveProject(PolycodeProject* project) {
-//		if(project) printf("setting active project: %s\n", project->getProjectName().c_str());
-		activeProject = project;
-	}
+	void setActiveProject(PolycodeProject* project);
 	
 	
 	int getProjectCount() { return projects.size(); }
 	int getProjectCount() { return projects.size(); }
 	PolycodeProject *getProjectByIndex(int index) { return projects[index]; }
 	PolycodeProject *getProjectByIndex(int index) { return projects[index]; }

+ 0 - 12
IDE/Contents/Resources/FileTemplates/2D/Screen Entity.screen

@@ -1,12 +0,0 @@
-<?xml version="1.0" ?>
-<screen>	
-	<entities>
-		<entity type="image" x="100" y="200" rot="35" tint="#ff00ff" alpha="1" scaleX="1" scaleY="1">
-			<image_path>tomato.png</image_path>
-		</entity>
-		<entity type="shape" x="300" y="200" rot="35" tint="#ff00ff" alpha="1" scaleX="1" scaleY="1">
-			<shape type="rect" width="100" height="50" texture="Whatever"></shape>
-			<physics type="static_rect" density="1" friction="1" restitution="0" sensor="false" noRotate="false"></physics>
-		</entity>
-	</entities>
-</screen>

+ 0 - 12
IDE/Contents/Resources/FileTemplates/2D/Screen.screen

@@ -1,12 +0,0 @@
-<?xml version="1.0" ?>
-<screen>	
-	<entities>
-		<entity type="image" x="100" y="200" rot="35" tint="#ff00ff" alpha="1" scaleX="1" scaleY="1">
-			<image_path>tomato.png</image_path>
-		</entity>
-		<entity type="shape" x="300" y="200" rot="35" tint="#ff00ff" alpha="1" scaleX="1" scaleY="1">
-			<shape type="rect" width="100" height="50" texture="Whatever"></shape>
-			<physics type="static_rect" density="1" friction="1" restitution="0" sensor="false" noRotate="false"></physics>
-		</entity>
-	</entities>
-</screen>

+ 0 - 0
IDE/Contents/Resources/FileTemplates/Basic/LUA Source File.lua → IDE/Contents/Resources/FileTemplates/Materials and Shaders/GLSL Fragment Shader.frag


+ 0 - 0
IDE/Contents/Resources/FileTemplates/Materials and Shaders/GLSL Vertex Shader.vert


+ 0 - 4
IDE/Contents/Resources/FileTemplates/Materials and Shaders/Material Library.mat

@@ -1,7 +1,3 @@
 <?xml version="1.0" ?>
 <?xml version="1.0" ?>
 <polycode_material_library>
 <polycode_material_library>
-	<shaders>
-	</shaders>
-	<materials>
-	</materials>
 </polycode_material_library>
 </polycode_material_library>

+ 0 - 0
IDE/Contents/Resources/FileTemplates/Scripts/Lua Script.lua


TEMPAT SAMPAH
IDE/Contents/Resources/Fonts/LeagueGothic-CondensedRegular.otf


TEMPAT SAMPAH
IDE/Contents/Resources/Fonts/LeagueGothic-Regular.otf


TEMPAT SAMPAH
IDE/Contents/Resources/Images/box_icon.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/cubemap_icon.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/editorGrid.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/material_bg.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/material_editor_light.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/material_grid.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/material_icon.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/new_cubemap.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/new_material.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/new_screenshader.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/new_shader.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/plane_icon.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/screenshader_icon.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/shader_icon.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/small_selector.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/sphere_icon.png


TEMPAT SAMPAH
IDE/Contents/Resources/Images/torus_icon.png


+ 9 - 4
IDE/Contents/Source/NewFileWindow.cpp

@@ -57,13 +57,18 @@ NewFileWindow::NewFileWindow() : UIWindow(L"Create New File", 480, 280) {
 		}
 		}
 	}	
 	}	
 	
 	
-	ScreenLabel *label2 = new ScreenLabel(L"New File Name (without extension)", fontSize, fontName, Label::ANTIALIAS_FULL);
+	ScreenLabel *label2 = new ScreenLabel(L"NEW FILE NAME (WITHOUT EXTENSION)", 22, "section", Label::ANTIALIAS_FULL);
+	label2->color.a = 0.4;
+	label2->getLabel()->setColorForRange(Color(),0, 12);
+	label2->getLabel()->setColorForRange(Color(0.6, 0.6, 0.6, 1.0),12, 40);
+	label2->setText("NEW FILE NAME (WITHOUT EXTENSION)");
+		
 	addChild(label2);
 	addChild(label2);
 	label2->setPosition(padding+220, templateContainer->getPosition().y);			
 	label2->setPosition(padding+220, templateContainer->getPosition().y);			
 	
 	
-	fileNameInput = new UITextInput(false, 500-padding-220-padding-padding, 12);	
+	fileNameInput = new UITextInput(false, 500-padding-210-padding-padding, 12);	
 	addChild(fileNameInput);
 	addChild(fileNameInput);
-	fileNameInput->setPosition(label2->getPosition().x, label2->getPosition().y+label2->getHeight()+2);
+	fileNameInput->setPosition(label2->getPosition().x, label2->getPosition().y+label2->getHeight()-6);
 	
 	
 	
 	
 	cancelButton = new UIButton(L"Cancel", 100);
 	cancelButton = new UIButton(L"Cancel", 100);
@@ -130,7 +135,7 @@ void NewFileWindow::parseTemplatesIntoTree(UITree *tree, OSFileEntry folder) {
 			data->type = 1;
 			data->type = 1;
 			data->templatePath = entry.fullPath;
 			data->templatePath = entry.fullPath;
 			newChild->setUserData(data);
 			newChild->setUserData(data);
-			if(entry.name == "LUA Source File.lua") {
+			if(entry.name == "Lua Script.lua") {
 				defaultTemplateTree = newChild;
 				defaultTemplateTree = newChild;
 				newChild->setSelected();
 				newChild->setSelected();
 			}
 			}

+ 10 - 8
IDE/Contents/Source/NewProjectWindow.cpp

@@ -62,27 +62,29 @@ NewProjectWindow::NewProjectWindow() : UIWindow(L"Create New Project", 480, 280)
 		}
 		}
 	}
 	}
 	
 	
-	ScreenLabel *label2 = new ScreenLabel(L"Project Name", fontSize, fontName, Label::ANTIALIAS_FULL);
+	ScreenLabel *label2 = new ScreenLabel(L"PROJECT NAME", 22, "section", Label::ANTIALIAS_FULL);
+	label2->color.a = 0.4;
 	addChild(label2);
 	addChild(label2);
 	label2->setPosition(padding+220, templateContainer->getPosition().y);		
 	label2->setPosition(padding+220, templateContainer->getPosition().y);		
 
 
-	projectNameInput = new UITextInput(false, 500-padding-220-padding-padding, 12);	
+	projectNameInput = new UITextInput(false, 500-padding-210-padding-padding, 12);	
 	addChild(projectNameInput);
 	addChild(projectNameInput);
-	projectNameInput->setPosition(label2->getPosition().x, label2->getPosition().y+label2->getHeight()+2);
+	projectNameInput->setPosition(label2->getPosition().x, label2->getPosition().y+label2->getHeight()-6);
 	
 	
-	ScreenLabel *label3 = new ScreenLabel(L"Project Location", fontSize, fontName, Label::ANTIALIAS_FULL);
+	ScreenLabel *label3 = new ScreenLabel(L"PROJECT LOCATION", 22, "section", Label::ANTIALIAS_FULL);
+	label3->color.a = 0.4;
 	addChild(label3);
 	addChild(label3);
-	label3->setPosition(padding+220, templateContainer->getPosition().y+50);		
+	label3->setPosition(padding+220, templateContainer->getPosition().y+60);		
 	
 	
-	projectLocationInput = new UITextInput(false, 500-padding-220-padding-padding, 12);	
+	projectLocationInput = new UITextInput(false, 500-padding-210-padding-padding, 12);	
 	addChild(projectLocationInput);
 	addChild(projectLocationInput);
-	projectLocationInput->setPosition(label3->getPosition().x, label3->getPosition().y+label3->getHeight()+2);
+	projectLocationInput->setPosition(label3->getPosition().x, label3->getPosition().y+label3->getHeight()-6);
 
 
 	
 	
 	locationSelectButton = new UIButton(L"Choose...", 100);
 	locationSelectButton = new UIButton(L"Choose...", 100);
 	locationSelectButton->addEventListener(this, UIEvent::CLICK_EVENT);	
 	locationSelectButton->addEventListener(this, UIEvent::CLICK_EVENT);	
 	addChild(locationSelectButton);
 	addChild(locationSelectButton);
-	locationSelectButton->setPosition(500-100-padding, projectLocationInput->getPosition().y+projectLocationInput->getHeight()+5);
+	locationSelectButton->setPosition(500-103-padding, projectLocationInput->getPosition().y+projectLocationInput->getHeight()+10);
 	
 	
 	
 	
 	cancelButton = new UIButton(L"Cancel", 100);
 	cancelButton = new UIButton(L"Cancel", 100);

+ 6 - 5
IDE/Contents/Source/PolycodeConsole.cpp

@@ -90,19 +90,20 @@ BackTraceWindow::BackTraceWindow() : UIElement() {
 	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
 	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
 	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");		
 	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");		
 
 
-	labelBg = new ScreenShape(ScreenShape::SHAPE_RECT, 20,20);
+	labelBg = new ScreenShape(ScreenShape::SHAPE_RECT, 20,30);
 	labelBg->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
 	labelBg->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
 	labelBg->setColor(0.0, 0.0, 0.0, 0.35);
 	labelBg->setColor(0.0, 0.0, 0.0, 0.35);
 	addChild(labelBg);
 	addChild(labelBg);
 	
 	
-	ScreenLabel *label = new ScreenLabel("CRASH STACK", fontSize, fontName);
+	ScreenLabel *label = new ScreenLabel("CRASH STACK", 22, "section");
+	label->color.a = 0.3;
 	addChild(label);
 	addChild(label);
-	label->setPosition(5,2);
+	label->setPosition(5,0);
 	
 	
 }	
 }	
 
 
 void BackTraceWindow::Resize(Number width, Number height) {
 void BackTraceWindow::Resize(Number width, Number height) {
-	labelBg->setShapeSize(width, 20);
+	labelBg->setShapeSize(width, 30);
 	this->width = width;
 	this->width = width;
 	this->height = height;	
 	this->height = height;	
 	adjustEntries();
 	adjustEntries();
@@ -111,7 +112,7 @@ void BackTraceWindow::Resize(Number width, Number height) {
 void BackTraceWindow::adjustEntries() {
 void BackTraceWindow::adjustEntries() {
 	for(int i=0; i < entries.size(); i++) {
 	for(int i=0; i < entries.size(); i++) {
 		entries[i]->Resize(width, 20);
 		entries[i]->Resize(width, 20);
-		entries[i]->setPosition(0, 20 + (i * 21));
+		entries[i]->setPosition(0, 30 + (i * 21));
 	}
 	}
 }
 }
 
 

+ 2 - 2
IDE/Contents/Source/PolycodeFontEditor.cpp

@@ -36,7 +36,7 @@ bool PolycodeFontEditor::openFile(OSFileEntry filePath) {
 	
 	
 	
 	
 	
 	
-	grid = new ScreenImage("editorGrid.png");
+	grid = new ScreenImage("Images/editorGrid.png");
 	
 	
 	addChild(grid);
 	addChild(grid);
 	grid->snapToPixels = true;
 	grid->snapToPixels = true;
@@ -45,7 +45,7 @@ bool PolycodeFontEditor::openFile(OSFileEntry filePath) {
 	grid->getTexture()->recreateFromImageData();	
 	grid->getTexture()->recreateFromImageData();	
 	
 	
 //	bg = new ScreenShape(ScreenShape::SHAPE_RECT, 10,10);
 //	bg = new ScreenShape(ScreenShape::SHAPE_RECT, 10,10);
-	bg = new UIBox("fontBox.png", 29,9,9,9, 10,10);	
+	bg = new UIBox("Images/fontBox.png", 29,9,9,9, 10,10);	
 	bg->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
 	bg->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
 	bg->setPosition(-50,-50);
 	bg->setPosition(-50,-50);
 	
 	

+ 7 - 7
IDE/Contents/Source/PolycodeFrame.cpp

@@ -46,7 +46,7 @@ PolycodeFrame::PolycodeFrame() : ScreenEntity() {
 	welcomeEntity = new ScreenEntity();
 	welcomeEntity = new ScreenEntity();
 	welcomeEntity->processInputEvents = true;
 	welcomeEntity->processInputEvents = true;
 	addChild(welcomeEntity);
 	addChild(welcomeEntity);
-	welcomeImage = new ScreenImage("welcome.png");
+	welcomeImage = new ScreenImage("Images/welcome.png");
 	welcomeEntity->addChild(welcomeImage);
 	welcomeEntity->addChild(welcomeImage);
 	welcomeEntity->snapToPixels = true;
 	welcomeEntity->snapToPixels = true;
 	
 	
@@ -86,20 +86,20 @@ PolycodeFrame::PolycodeFrame() : ScreenEntity() {
 	topBarBg->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
 	topBarBg->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
 	addChild(topBarBg);
 	addChild(topBarBg);
 	
 	
-	logo = new ScreenImage("barlogo.png");	
+	logo = new ScreenImage("Images/barlogo.png");	
 	addChild(logo);		
 	addChild(logo);		
 	
 	
 	
 	
-	playButton = new UIImageButton("play_button.png");
+	playButton = new UIImageButton("Images/play_button.png");
 	addChild(playButton);
 	addChild(playButton);
 	playButton->setPosition(10,8);
 	playButton->setPosition(10,8);
 
 
-	stopButton = new UIImageButton("stop_button.png");
+	stopButton = new UIImageButton("Images/stop_button.png");
 	addChild(stopButton);
 	addChild(stopButton);
 	stopButton->setPosition(10,8);
 	stopButton->setPosition(10,8);
 
 
 	
 	
-	resizer = new ScreenImage("corner_resize.png");	
+	resizer = new ScreenImage("Images/corner_resize.png");	
 	addChild(resizer);
 	addChild(resizer);
 	resizer->setColor(0,0,0,0.4);
 	resizer->setColor(0,0,0,0.4);
 	
 	
@@ -186,8 +186,8 @@ void PolycodeFrame::handleEvent(Event *event) {
 				if(isDragging) {
 				if(isDragging) {
 					if(editorHolder->currentEditor) {
 					if(editorHolder->currentEditor) {
 						InputEvent *inputEvent = (InputEvent*) event;						
 						InputEvent *inputEvent = (InputEvent*) event;						
-						Number posX = inputEvent->mousePosition.x - editorHolder->getPosition2D().x;
-						Number posY = inputEvent->mousePosition.y - editorHolder->getPosition2D().y;						
+						Number posX = inputEvent->mousePosition.x;
+						Number posY = inputEvent->mousePosition.y;			
 						editorHolder->currentEditor->handleDroppedFile(draggedFile, posX, posY);
 						editorHolder->currentEditor->handleDroppedFile(draggedFile, posX, posY);
 					}
 					}
 				}
 				}

+ 14 - 4
IDE/Contents/Source/PolycodeIDEApp.cpp

@@ -35,13 +35,21 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 	CoreServices::getInstance()->getResourceManager()->addArchive("default.pak");
 	CoreServices::getInstance()->getResourceManager()->addArchive("default.pak");
 	CoreServices::getInstance()->getResourceManager()->addDirResource("default");	
 	CoreServices::getInstance()->getResourceManager()->addDirResource("default");	
 
 
+	CoreServices::getInstance()->getResourceManager()->addArchive("hdr.pak");
+	CoreServices::getInstance()->getResourceManager()->addDirResource("hdr");	
+
+
 	CoreServices::getInstance()->getResourceManager()->addArchive("api.pak");
 	CoreServices::getInstance()->getResourceManager()->addArchive("api.pak");
 
 
 	CoreServices::getInstance()->getConfig()->loadConfig("Polycode", RESOURCE_PATH"UIThemes/default/theme.xml");
 	CoreServices::getInstance()->getConfig()->loadConfig("Polycode", RESOURCE_PATH"UIThemes/default/theme.xml");
-	CoreServices::getInstance()->getResourceManager()->addDirResource(RESOURCE_PATH"UIThemes/default/", false);
-	CoreServices::getInstance()->getResourceManager()->addDirResource(RESOURCE_PATH"Images/", false);	
+	CoreServices::getInstance()->getResourceManager()->addArchive(RESOURCE_PATH"UIThemes/default/");
+	CoreServices::getInstance()->getResourceManager()->addArchive(RESOURCE_PATH"Images/");	
+
+	CoreServices::getInstance()->getFontManager()->registerFont("section", "Fonts/LeagueGothic-Regular.otf");
 	
 	
-	CoreServices::getInstance()->getRenderer()->setTextureFilteringMode(Renderer::TEX_FILTERING_LINEAR);
+//	CoreServices::getInstance()->getRenderer()->setTextureFilteringMode(Renderer::TEX_FILTERING_LINEAR);
+	CoreServices::getInstance()->getRenderer()->setTextureFilteringMode(Renderer::TEX_FILTERING_NEAREST);
+
 		
 		
 	printf("creating font editor\n"); 
 	printf("creating font editor\n"); 
 	
 	
@@ -72,12 +80,13 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 	frame->getProjectBrowser()->addEventListener(this, PolycodeProjectBrowserEvent::SHOW_MENU);
 	frame->getProjectBrowser()->addEventListener(this, PolycodeProjectBrowserEvent::SHOW_MENU);
 	
 	
 	frame->Resize(core->getXRes(), core->getYRes());	
 	frame->Resize(core->getXRes(), core->getYRes());	
-	core->setVideoMode(1000, 700, false, false, 0, 0);
+	core->setVideoMode(1100, 700, false, false, 0, 0);
 	
 	
 	debugger = new PolycodeRemoteDebugger(projectManager);
 	debugger = new PolycodeRemoteDebugger(projectManager);
 	frame->console->setDebugger(debugger);
 	frame->console->setDebugger(debugger);
 	
 	
 	editorManager->registerEditorFactory(new PolycodeImageEditorFactory());
 	editorManager->registerEditorFactory(new PolycodeImageEditorFactory());
+	editorManager->registerEditorFactory(new PolycodeMaterialEditorFactory());	
 	editorManager->registerEditorFactory(new PolycodeScreenEditorFactory());	
 	editorManager->registerEditorFactory(new PolycodeScreenEditorFactory());	
 	editorManager->registerEditorFactory(new PolycodeFontEditorFactory());
 	editorManager->registerEditorFactory(new PolycodeFontEditorFactory());
 	editorManager->registerEditorFactory(new PolycodeTextEditorFactory());
 	editorManager->registerEditorFactory(new PolycodeTextEditorFactory());
@@ -229,6 +238,7 @@ void PolycodeIDEApp::openFile(OSFileEntry file) {
 	} else {
 	} else {
 		editor = editorManager->createEditorForExtension(file.extension);
 		editor = editorManager->createEditorForExtension(file.extension);
 		if(editor) {
 		if(editor) {
+			editor->parentProject = projectManager->getActiveProject();
 			if(editor->openFile(file)) {
 			if(editor->openFile(file)) {
 				frame->addEditor(editor);					
 				frame->addEditor(editor);					
 				frame->showEditor(editor);
 				frame->showEditor(editor);

+ 55 - 3
IDE/Contents/Source/PolycodeImageEditor.cpp

@@ -32,16 +32,50 @@ PolycodeImageEditor::~PolycodeImageEditor() {
 
 
 bool PolycodeImageEditor::openFile(OSFileEntry filePath) {
 bool PolycodeImageEditor::openFile(OSFileEntry filePath) {
 	
 	
-	grid = new ScreenImage("editorGrid.png");
+	grid = new ScreenImage("Images/editorGrid.png");
 	
 	
 	addChild(grid);
 	addChild(grid);
 	grid->snapToPixels = true;
 	grid->snapToPixels = true;
 	
 	
 	grid->getTexture()->clamp = false;
 	grid->getTexture()->clamp = false;
 	grid->getTexture()->recreateFromImageData();	
 	grid->getTexture()->recreateFromImageData();	
+		
 	
 	
+	leftShape = new ScreenShape(ScreenShape::SHAPE_RECT, 10,10);
+	leftShape->setColor(0.0, 0.0, 0.0, 0.3);
+	leftShape->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
+	addChild(leftShape);
+
+	rightShape = new ScreenShape(ScreenShape::SHAPE_RECT, 10,10);
+	rightShape->setColor(0.0, 0.0, 0.0, 0.3);
+	rightShape->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
+	addChild(rightShape);
+
+	topShape = new ScreenShape(ScreenShape::SHAPE_RECT, 10,10);
+	topShape->setColor(0.0, 0.0, 0.0, 0.3);
+	topShape->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
+	addChild(topShape);
+
+	bottomShape = new ScreenShape(ScreenShape::SHAPE_RECT, 10,10);
+	bottomShape->setColor(0.0, 0.0, 0.0, 0.3);
+	bottomShape->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
+	addChild(bottomShape);
+		
+		
+	editorImage = new ScreenShape(ScreenShape::SHAPE_RECT, 10,10);
+	
+	Image *image = new Image(filePath.fullPath);
+	
+	Texture *newTexture = CoreServices::getInstance()->getMaterialManager()->createTextureFromImage(image);
+	
+	editorImage->setTexture(newTexture);
+	
+	editorImage->strokeEnabled = true;
+	editorImage->setStrokeColor(1.0, 1.0, 1.0, 0.2);
+	
+	aspectRatio = ((Number)image->getWidth()) / ((Number)image->getHeight());
+	delete image;
 	
 	
-	editorImage = new ScreenImage(filePath.fullPath);
 	addChild(editorImage);
 	addChild(editorImage);
 	
 	
 	PolycodeEditor::openFile(filePath);
 	PolycodeEditor::openFile(filePath);
@@ -49,8 +83,26 @@ bool PolycodeImageEditor::openFile(OSFileEntry filePath) {
 }
 }
 
 
 void PolycodeImageEditor::Resize(int x, int y) {
 void PolycodeImageEditor::Resize(int x, int y) {
-	editorImage->setPosition((x-editorImage->getWidth()) /2, (y-editorImage->getHeight()) /2);
+	editorImage->setPosition(x/2, y/2);
 	grid->setImageCoordinates(0,0,x,y);	
 	grid->setImageCoordinates(0,0,x,y);	
+	
+	if((y * 0.8) * aspectRatio > x * 0.8) {
+		editorImage->setShapeSize((x * 0.8), (x * 0.8) / aspectRatio);	
+	} else {
+		editorImage->setShapeSize((y * 0.8) * aspectRatio, (y * 0.8));
+	}
+	
+	leftShape->setShapeSize((x - editorImage->getWidth())/2.0, y);	
+	rightShape->setShapeSize((x - editorImage->getWidth())/2.0, y);	
+	rightShape->setPosition(leftShape->getWidth() + editorImage->getWidth(), 0);
+		
+	topShape->setShapeSize(editorImage->getWidth(), (y - editorImage->getHeight())/2.0);
+	topShape->setPosition(leftShape->getWidth(),0);
+
+	bottomShape->setShapeSize(editorImage->getWidth(), (y - editorImage->getHeight())/2.0);
+	bottomShape->setPosition(leftShape->getWidth(),y-bottomShape->getHeight());
+
+		
 	PolycodeEditor::Resize(x,y);
 	PolycodeEditor::Resize(x,y);
 }
 }
 
 

+ 787 - 0
IDE/Contents/Source/PolycodeMaterialEditor.cpp

@@ -0,0 +1,787 @@
+/*
+ Copyright (C) 2012 by Ivan Safrin
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+ 
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ */
+ 
+#include "PolycodeMaterialEditor.h"
+
+MaterialEditorPane::MaterialEditorPane(UIColorPicker *colorPicker) : UIWindow("Material", 670, 250) {
+
+	this->colorPicker = colorPicker;
+	
+	previewScene = new Scene(true);	
+	
+	renderTexture = new SceneRenderTexture(previewScene, previewScene->getDefaultCamera(), 256, 256);
+	
+	ScenePrimitive *previewBg = new ScenePrimitive(ScenePrimitive::TYPE_BOX, 15.0, 15.0, 15.0);
+	previewBg->Yaw(45.0);
+	previewBg->backfaceCulled = false;
+	previewBg->loadTexture("Images/material_grid.png");
+	previewScene->addChild(previewBg);
+	
+	previewScene->clearColor.setColor(0.1, 0.1, 0.1, 0.0);	
+	previewScene->ambientColor.setColor(0.2, 0.2, 0.2, 1.0);
+			
+	previewPrimitive = new ScenePrimitive(ScenePrimitive::TYPE_TORUS, 3.0, 1.2, 26, 16);
+	previewScene->addChild(previewPrimitive);
+	shapePrimitives.push_back(previewPrimitive);
+	previewPrimitive->getMesh()->calculateTangents();	
+
+	previewPrimitive = new ScenePrimitive(ScenePrimitive::TYPE_SPHERE, 3.0, 16, 16);
+	previewScene->addChild(previewPrimitive);
+	shapePrimitives.push_back(previewPrimitive);
+	previewPrimitive->getMesh()->calculateTangents();	
+
+	previewPrimitive = new ScenePrimitive(ScenePrimitive::TYPE_BOX, 4.0, 4.0, 4.0);
+	previewPrimitive->Yaw(45.0);
+	previewPrimitive->getMesh()->calculateNormals(false);
+	previewPrimitive->getMesh()->calculateTangents();
+	previewScene->addChild(previewPrimitive);
+	shapePrimitives.push_back(previewPrimitive);
+
+	previewPrimitive = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 6.0, 6.0);
+	previewPrimitive->billboardMode = true;
+	previewScene->addChild(previewPrimitive);
+	shapePrimitives.push_back(previewPrimitive);
+	previewPrimitive->getMesh()->calculateTangents();	
+
+	
+	mainLight = new SceneLight(SceneLight::AREA_LIGHT, previewScene, 290.0);
+	mainLight->setPosition(-10,10,10);
+	previewScene->addLight(mainLight);
+
+	secondLight = new SceneLight(SceneLight::AREA_LIGHT, previewScene, 250.0);
+	secondLight->setPosition(10,-10,10);
+	previewScene->addLight(secondLight);
+
+	
+	previewScene->getDefaultCamera()->setPosition(0,7,9);
+	previewScene->getDefaultCamera()->lookAt(Vector3());
+	
+	previewShape = new ScreenShape(ScreenShape::SHAPE_RECT, 128, 128);
+	previewShape->setPositionMode(ScreenEntity::POSITION_TOPLEFT);	
+	previewShape->setTexture(renderTexture->getTargetTexture());
+	previewShape->setPosition(20,40);
+	previewShape->strokeEnabled = true;
+	previewShape->strokeColor = Color(1.0, 1.0, 1.0, 0.2);
+	previewShape->setStrokeWidth(1.0);
+	addChild(previewShape);
+	
+	Config *conf = CoreServices::getInstance()->getConfig();	
+	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
+	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");	
+	Number padding = conf->getNumericValue("Polycode", "uiWindowSkinPadding");	
+	
+	Number xPos = 165;
+	
+	ScreenLabel *label = new ScreenLabel("SHADER", 22, "section", Label::ANTIALIAS_FULL);
+	label->color.a = 0.4;
+	addChild(label);
+	label->setPosition(xPos,90);
+
+	label = new ScreenLabel("BLEND MODE", 22, "section", Label::ANTIALIAS_FULL);
+	label->color.a = 0.4;
+	addChild(label);
+	label->setPosition(xPos,150);
+
+
+	label = new ScreenLabel("NAME", 22, "section", Label::ANTIALIAS_FULL);
+	label->color.a = 0.4;		
+	addChild(label);
+	label->setPosition(xPos,30);
+
+	nameInput = new UITextInput(false, 210, 30);
+	nameInput->addEventListener(this, UIEvent::CHANGE_EVENT);
+	addChild(nameInput);
+	nameInput->setPosition(xPos, 60);
+	
+	Number yPos = 145;
+	
+	
+	yPos += 50;
+	label = new ScreenLabel("TEXTURES", 22, "section", Label::ANTIALIAS_FULL);
+	addChild(label);
+	label->color.a = 0.4;	
+	label->setPosition(xPos+230, 30);
+	label->getLabel()->setColorForRange(Color(), 0, 8);
+	label->getLabel()->setColorForRange(Color(0.5,0.5,0.5,1.0), 8, 35);
+	label->setText("TEXTURES (DRAG FROM PROJECT TO SET)");
+
+	paramsEntity = new UIElement();
+	addChild(paramsEntity);
+
+	label = new ScreenLabel("SHADER PROPERTIES", 22, "section", Label::ANTIALIAS_FULL);
+	label->color.a = 0.4;
+	paramsEntity->addChild(label);
+	paramsEntity->setPositionX(xPos+230);
+
+	textureSlotBase = new ScreenEntity();
+	addChild(textureSlotBase);
+	
+	textureSlotBase->setPosition(xPos+230, 60);
+
+	shaderSelector = new UIComboBox(210);	
+	shaderSelector->addEventListener(this, UIEvent::CHANGE_EVENT);
+
+	
+	blendSelector = new UIComboBox(210);	
+	blendSelector->addEventListener(this, UIEvent::CHANGE_EVENT);
+	
+	addChild(blendSelector);
+	blendSelector->setPosition(xPos, 180);
+		
+	blendSelector->addComboItem("Normal");
+	blendSelector->addComboItem("Lighten");
+	blendSelector->addComboItem("Color");
+	blendSelector->addComboItem("Premultiplied");
+	blendSelector->addComboItem("Multiply");
+	
+//	blendSelector->setSelectedIndex(0);
+							
+	MaterialManager *materialManager = CoreServices::getInstance()->getMaterialManager();
+	for(int i=0; i < materialManager->getNumShaders(); i++) {
+		if(!materialManager->getShaderByIndex(i)->screenShader) {
+			shaderSelector->addComboItem(materialManager->getShaderByIndex(i)->getName(), (void*)materialManager->getShaderByIndex(i));
+		}
+	}
+	
+	shaderSelector->setPosition(xPos, 120);
+	addChild(shaderSelector);
+	
+	shapeSelector = new ScreenImage("Images/small_selector.png");
+	addChild(shapeSelector);
+	shapeSelector->color.a = 0.4;
+	
+	shapeSwitches.push_back(new UIImageButton("Images/torus_icon.png"));
+	shapeSwitches.push_back(new UIImageButton("Images/sphere_icon.png"));
+	shapeSwitches.push_back(new UIImageButton("Images/box_icon.png"));
+	shapeSwitches.push_back(new UIImageButton("Images/plane_icon.png"));
+
+	for(int i=0; i < shapeSwitches.size(); i++) {
+		addChild(shapeSwitches[i]);
+		shapeSwitches[i]->setPosition(40 + (25 * i), 180);
+		shapeSwitches[i]->addEventListener(this, UIEvent::CLICK_EVENT);
+	}
+				
+	currentMaterial = NULL;
+	
+	showPrimitive(0);
+	
+	enabled = false;
+}
+
+void MaterialEditorPane::showPrimitive(unsigned int index) {
+	for(int i=0; i < shapePrimitives.size(); i++) {
+		shapePrimitives[i]->visible = false;	
+	}
+	shapePrimitives[index]->visible = true;	
+	shapeSelector->setPosition(38 + (25 * index), 178);
+	if(currentMaterial) {
+		shapePrimitives[index]->setMaterial(currentMaterial);
+	}
+	previewPrimitive = shapePrimitives[index];
+}
+
+void MaterialEditorPane::handleEvent(Event *event) {
+	
+	for(int i=0; i < shapeSwitches.size(); i++) {
+		if(event->getDispatcher() == shapeSwitches[i]) {
+			if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CLICK_EVENT) {
+				showPrimitive(i);
+			}
+		}
+	}
+	
+	if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CHANGE_EVENT && currentMaterial) {		
+	
+		if(event->getDispatcher() == nameInput) {
+			currentMaterial->setName(nameInput->getText());
+			dispatchEvent(new Event(), Event::CHANGE_EVENT);
+		}
+	
+		if(event->getDispatcher() ==blendSelector) {			
+			currentMaterial->blendingMode = blendSelector->getSelectedIndex();
+		}
+		if(event->getDispatcher() == shaderSelector) {
+			Shader *selectedShader = (Shader*)shaderSelector->getSelectedItem()->data;
+			
+			clearAll();
+			if(selectedShader) {	
+				for(int i=0; i < selectedShader->expectedTextures.size(); i++) {
+					MaterialTextureSlot *textureSlot = new MaterialTextureSlot(selectedShader->expectedTextures[i]);
+					textureSlotBase->addChild(textureSlot);
+					textureSlot->setPosition(0, (40*i));
+					textureSlots.push_back(textureSlot);
+					
+					if(currentMaterial->getShaderBinding(0)) {
+						Texture *currentTexture = currentMaterial->getShaderBinding(0)->getTexture(selectedShader->expectedTextures[i]);
+						if(currentTexture) {
+							textureSlot->imageShape->setTexture(currentTexture);
+							std::vector<String> parts = currentTexture->getResourcePath().split("/");
+							if(parts.size() > 1) {
+								textureSlot->textureFileName->setText(parts[parts.size()-1]);
+							} else {
+								textureSlot->textureFileName->setText(currentTexture->getResourcePath());			
+							}
+						}
+					}
+				}
+
+			}
+			
+			paramsEntity->setPositionY(70 + (selectedShader->expectedTextures.size()*40));
+
+			bool replacingShader = false;
+			if(currentMaterial->getShader(0) != selectedShader) {
+				currentMaterial->clearShaders();
+				previewPrimitive->clearMaterial();
+				replacingShader = true;
+			}
+			
+			if(selectedShader) {
+				if(replacingShader) {			
+					ShaderBinding *newShaderBinding = selectedShader->createBinding();				
+					currentMaterial->addShader(selectedShader, newShaderBinding);
+					previewPrimitive->setMaterial(currentMaterial);	
+				}
+				
+				for(int i=0; i < textureSlots.size(); i++) {
+					if(textureSlots[i]->textureFileName->getText() != "None") {
+						currentMaterial->getShaderBinding(0)->clearTexture(textureSlots[i]->textureString);			
+						currentMaterial->getShaderBinding(0)->addTexture(textureSlots[i]->textureString, textureSlots[i]->imageShape->getTexture());
+					}
+				}								
+					
+				if(currentMaterial->getShaderBinding(0)) {
+				
+				int yOffset = 30;
+				
+				for(int i=0; i < selectedShader->expectedFragmentParams.size(); i++) {
+					if(!selectedShader->expectedFragmentParams[i].isAuto) {
+					MaterialPropertySlot *propertySlot = new MaterialPropertySlot(colorPicker, currentMaterial->getShaderBinding(0), selectedShader->expectedFragmentParams[i]);
+					paramsEntity->addChild(propertySlot);
+					propertySlot->setPosition(0, yOffset);
+					fragmentPropertySlots.push_back(propertySlot);					
+					yOffset += 45;
+				}
+				}
+								
+				for(int i=0; i < selectedShader->expectedVertexParams.size(); i++) {
+					if(!selectedShader->expectedVertexParams[i].isAuto) {
+					MaterialPropertySlot *propertySlot = new MaterialPropertySlot(colorPicker, currentMaterial->getShaderBinding(0), selectedShader->expectedVertexParams[i]);
+					paramsEntity->addChild(propertySlot);
+					propertySlot->setPosition(0, yOffset);
+					fragmentPropertySlots.push_back(propertySlot);					
+					yOffset += 45;					
+				}
+				}
+								
+
+				}
+			}
+			
+			int winHeight = (fragmentPropertySlots.size() * 45) + (textureSlots.size() * 40) + 100;
+
+			if(winHeight < 250)
+				winHeight = 250;
+	
+			setWindowSize(670, winHeight);			
+		}			
+	}
+	
+	
+	UIWindow::handleEvent(event);
+}
+
+void MaterialEditorPane::clearAll() {
+	for(int i=0; i < textureSlots.size(); i++) {
+		textureSlotBase->removeChild(textureSlots[i]);
+		delete textureSlots[i];
+	}
+	textureSlots.clear();
+	
+	for(int i=0; i < fragmentPropertySlots.size(); i++) {
+		paramsEntity->removeChild(fragmentPropertySlots[i]);
+		delete fragmentPropertySlots[i];
+	}
+	fragmentPropertySlots.clear();									
+}
+
+void MaterialEditorPane::handleDroppedFile(OSFileEntry file, Number x, Number y) {
+	Vector2 screenPos = textureSlotBase->getScreenPosition();
+	
+	x = x - screenPos.x;
+	y = y - screenPos.y;
+		
+	for(int i=0; i < textureSlots.size(); i++) {
+		if(x > textureSlots[i]->getPosition().x && x < textureSlots[i]->getPosition().x + textureSlots[i]->getWidth() && 
+		y > textureSlots[i]->getPosition().y && y < textureSlots[i]->getPosition().y + textureSlots[i]->getHeight()) {
+			Texture *newTexture = CoreServices::getInstance()->getMaterialManager()->createTextureFromFile(file.fullPath);
+			textureSlots[i]->imageShape->setTexture(newTexture);
+			textureSlots[i]->textureFileName->setText(file.name);
+			currentMaterial->getShaderBinding(0)->clearTexture(textureSlots[i]->textureString);			
+			currentMaterial->getShaderBinding(0)->addTexture(textureSlots[i]->textureString, newTexture);
+			
+		}
+	}	
+}
+
+void MaterialEditorPane::setMaterial(Material *material) {
+	currentMaterial = material;
+	previewPrimitive->setMaterial(material);
+		
+	clearAll();	
+	
+	if(!currentMaterial) // ???
+		return;		
+	
+	enabled = true;
+	
+	blendSelector->setSelectedIndex(currentMaterial->blendingMode);
+					
+	if(currentMaterial->getShader(0)) {		
+	
+	for(int i=0; i < shaderSelector->getNumItems(); i++) {
+		Shader *shader = (Shader*)shaderSelector->getItemAtIndex(i)->data;
+		if(shader) {
+			if(currentMaterial->getShader(0)->getName() == shader->getName()) {
+				shaderSelector->setSelectedIndex(i);
+				break;
+			}
+		}
+	}
+	} else {
+		shaderSelector->setSelectedIndex(0);	
+	}
+	
+	nameInput->setText(currentMaterial->getName());
+}
+
+MaterialPropertySlot::MaterialPropertySlot(UIColorPicker *colorPicker, ShaderBinding *binding, ProgramParam param) : UIElement() {
+
+	setWidth(280);
+	setHeight(43);
+
+	this->param = param;
+	this->binding = binding;
+	
+	std::vector<String> stringParts = param.name.split("_");
+	
+	if(stringParts.size() > 0) {
+		for(int i=0; i < stringParts.size(); i++) {
+			finalName += stringParts[i].substr(0,1).toUpperCase() + stringParts[i].substr(1) + " ";	
+		}
+	} else {
+		finalName = param.name.substr(0,1).toUpperCase() + param.name.substr(1);
+	}
+	
+	Config *conf = CoreServices::getInstance()->getConfig();	
+	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
+	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");	
+	Number padding = conf->getNumericValue("Polycode", "uiWindowSkinPadding");		
+
+	propertyName = new ScreenLabel(finalName, fontSize, fontName, Label::ANTIALIAS_FULL);
+	propertyName->setColor(1.0, 1.0, 1.0, 0.7);		
+	addChild(propertyName);
+	
+	numberSlider = NULL;	
+	colorBox = NULL;
+	
+	minLabel = NULL;
+	maxLabel = NULL;
+	
+	switch(param.paramType) {
+		case ProgramParam::PARAM_Number:
+		{
+			
+			Number minVal = (*(Number*)param.minValue);
+			minLabel = new ScreenLabel(String::NumberToString(minVal), fontSize, fontName, Label::ANTIALIAS_FULL);
+			minLabel->setColor(1.0, 1.0, 1.0, 0.3);		
+			addChild(minLabel);			
+			minLabel->setPosition(0.0, 18);
+
+			Number maxVal = (*(Number*)param.maxValue);
+			maxLabel = new ScreenLabel(String::NumberToString(maxVal), fontSize, fontName, Label::ANTIALIAS_FULL);
+			maxLabel->setColor(1.0, 1.0, 1.0, 0.3);		
+			addChild(maxLabel);			
+			maxLabel->setPosition(240, 18);
+
+			numberSlider = new UIHSlider(minVal, maxVal, 180);
+			addChild(numberSlider);
+			numberSlider->setPosition(50, 23);
+			numberSlider->addEventListener(this, UIEvent::CHANGE_EVENT);
+//			binding->addLocalParam(param.name, &numberValue);
+
+			Number numberValue = (*(Number*)binding->getLocalParamByName(param.name)->data);
+			numberSlider->setSliderValue(numberValue);
+					
+			propertyName->setText(finalName+"("+String::NumberToString(numberValue)+")");
+
+		}
+		break;
+		case ProgramParam::PARAM_Color:
+			Color colorValue = ((*(Color*)binding->getLocalParamByName(param.name)->data));
+			colorBox = new UIColorBox(colorPicker, colorValue, 30, 23);
+			colorBox->addEventListener(this, UIEvent::CHANGE_EVENT);			
+			colorBox->setPosition(0.0, 18);
+//			binding->addLocalParam(param.name, &colorValue);			
+			addChild(colorBox);
+		break;
+	}
+}
+
+void MaterialPropertySlot::handleEvent(Event *event) {
+	if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CHANGE_EVENT) {
+		if(event->getDispatcher() == numberSlider) {
+			propertyName->setText(finalName+"("+String::NumberToString(numberSlider->getSliderValue())+")");
+			(*(Number*)binding->getLocalParamByName(param.name)->data) = numberSlider->getSliderValue();
+		}
+		
+		if(event->getDispatcher() == colorBox) {
+			(*(Color*)binding->getLocalParamByName(param.name)->data) = colorBox->getSelectedColor();
+		}
+	}
+}
+
+MaterialPropertySlot::~MaterialPropertySlot() {
+	
+	delete propertyName;
+	
+	if(minLabel)
+		delete minLabel;
+	if(maxLabel)
+		delete maxLabel;
+
+	if(colorBox) {
+		delete colorBox;
+	}
+	
+	if(numberSlider)
+		delete numberSlider;
+}
+
+MaterialTextureSlot::MaterialTextureSlot(String textureNameString) : UIElement() {
+
+	setWidth(280);
+	setHeight(38);
+	
+	textureString = textureNameString;
+	
+	bgShape  = new ScreenShape(ScreenShape::SHAPE_RECT, 280,38);
+	bgShape->setColor(0.0, 0.0, 0.0, 0.4);
+	bgShape->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
+	addChild(bgShape);
+
+	imageShape = new ScreenShape(ScreenShape::SHAPE_RECT, 32,32);
+	imageShape->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
+	imageShape->setPosition(3,3);
+	addChild(imageShape);
+	
+	Config *conf = CoreServices::getInstance()->getConfig();	
+	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
+	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");	
+	Number padding = conf->getNumericValue("Polycode", "uiWindowSkinPadding");	
+	
+	std::vector<String> stringParts = textureNameString.split("_");
+	
+	String finalName;
+	if(stringParts.size() > 0) {
+		for(int i=0; i < stringParts.size(); i++) {
+			finalName += stringParts[i].substr(0,1).toUpperCase() + stringParts[i].substr(1) + " ";	
+		}
+	} else {
+		finalName = textureNameString.substr(0,1).toUpperCase() + textureNameString.substr(1);
+	}
+	
+	textureName = new ScreenLabel(finalName, fontSize, fontName, Label::ANTIALIAS_FULL);
+	textureName->setPosition(40, 3);
+	textureName->setColor(1.0, 1.0, 1.0, 0.5);		
+	addChild(textureName);
+
+	textureFileName = new ScreenLabel("None", fontSize, fontName, Label::ANTIALIAS_FULL);
+	textureFileName->setPosition(40, 20);
+	textureFileName->setColor(1.0, 1.0, 1.0, 0.8);		
+	addChild(textureFileName);
+
+}
+
+MaterialTextureSlot::~MaterialTextureSlot() {
+	delete bgShape;
+	delete imageShape;
+		
+	delete textureName;
+	delete textureFileName;		
+}
+
+MaterialEditorPane::~MaterialEditorPane() {
+
+}
+
+MaterialMainWindow::MaterialMainWindow() : UIElement() {
+	UIColorPicker *colorPicker = new UIColorPicker();
+
+	materialPane = new MaterialEditorPane(colorPicker);
+	addChild(materialPane);
+	
+	addChild(colorPicker);
+	
+	enableScissor = true;
+}
+	
+void MaterialMainWindow::Resize(Number width, Number height) {
+	materialPane->setPosition((width-materialPane->getWidth())/2.0, (height-materialPane->getHeight())/2.0);
+	
+	Vector2 pos = getScreenPosition();	
+	scissorBox.setRect(pos.x,pos.y,width, height);
+}
+
+MaterialBrowser::MaterialBrowser() : UIElement() {
+	treeContainer = new UITreeContainer("boxIcon.png", L"Material Library", 200, 555);
+	treeContainer->getRootNode()->toggleCollapsed();
+	treeContainer->getRootNode()->addEventListener(this, UITreeEvent::SELECTED_EVENT);
+	treeContainer->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
+		
+	shadersNode = treeContainer->getRootNode()->addTreeChild("folder.png", "Shaders", NULL);
+	materialsNode = treeContainer->getRootNode()->addTreeChild("folder.png", "Materials", NULL);
+	cubemapsNode = treeContainer->getRootNode()->addTreeChild("folder.png", "Cubemaps", NULL);
+	cubemapsNode = treeContainer->getRootNode()->addTreeChild("folder.png", "Post Effects", NULL);
+				
+	addChild(treeContainer);		
+	selectedData = NULL;
+	
+	headerBg = new ScreenShape(ScreenShape::SHAPE_RECT,10,10);
+	addChild(headerBg);
+	headerBg->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
+	headerBg->setColor(0.1, 0.1, 0.1, 1.0);
+	
+	newMaterialButton = new UIImageButton("Images/new_material.png");
+	addChild(newMaterialButton);
+	newMaterialButton->setPosition(5,5);
+	
+	selectedNode = NULL;
+
+}
+
+
+void MaterialBrowser::handleEvent(Event *event) {
+
+	if(event->getDispatcher() == treeContainer->getRootNode()) {
+		if(event->getEventCode() == UITreeEvent::SELECTED_EVENT){ 
+			selectedNode = treeContainer->getRootNode()->getSelectedNode();			
+			MaterialBrowserData *data = (MaterialBrowserData *)selectedNode->getUserData();
+			selectedData =  data;
+			dispatchEvent(new Event(), Event::CHANGE_EVENT);
+		}
+	}
+	
+	ScreenEntity::handleEvent(event);
+}
+
+
+UITree *MaterialBrowser::addMaterial(Material *material) {
+	MaterialBrowserData *data = new MaterialBrowserData();
+	data->material = material;
+	return materialsNode->addTreeChild("material_icon.png", material->getName(), (void*)data);
+}
+
+MaterialBrowser::~MaterialBrowser() {
+
+}
+
+void MaterialBrowser::Resize(Number width, Number height) {
+	treeContainer->Resize(width, height-32);
+	treeContainer->setPosition(0, 32);
+	
+	headerBg->setShapeSize(width, 32);	
+}
+
+PolycodeMaterialEditor::PolycodeMaterialEditor() : PolycodeEditor(true){
+	selectedMaterialNode = NULL;
+}
+
+PolycodeMaterialEditor::~PolycodeMaterialEditor() {
+	
+}
+
+bool PolycodeMaterialEditor::openFile(OSFileEntry filePath) {
+	
+	
+	grid = new ScreenImage("Images/editorGrid.png");
+	
+	addChild(grid);
+	grid->snapToPixels = true;	
+	grid->getTexture()->clamp = false;
+	grid->getTexture()->recreateFromImageData();	
+	
+	mainSizer = new UIHSizer(100,100,200,false);
+	addChild(mainSizer);	
+	
+	materialBrowser = new MaterialBrowser();
+	mainSizer->addRightChild(materialBrowser);
+	
+	materialBrowser->addEventListener(this, Event::CHANGE_EVENT);
+	
+	materials = CoreServices::getInstance()->getMaterialManager()->loadMaterialsFromFile(filePath.fullPath);
+	
+	for(int i=0; i < materials.size(); i++) {
+		materialBrowser->addMaterial(materials[i]);
+	}
+	
+	mainWindow = new MaterialMainWindow();
+	mainSizer->addLeftChild(mainWindow);
+	
+	mainWindow->materialPane->addEventListener(this, Event::CHANGE_EVENT);
+	
+	materialBrowser->newMaterialButton->addEventListener(this, UIEvent::CLICK_EVENT);
+	
+	PolycodeEditor::openFile(filePath);
+	return true;
+}
+
+void PolycodeMaterialEditor::handleDroppedFile(OSFileEntry file, Number x, Number y) {		
+	mainWindow->materialPane->handleDroppedFile(file, x,y);
+}
+
+String PolycodeMaterialEditor::createStringValue(unsigned int type, void *value) {
+	String retString;
+	
+	switch(type) {
+		case ProgramParam::PARAM_Number:
+			retString = String::NumberToString(*((Number*)value));
+		break;
+		case ProgramParam::PARAM_Color:
+		{
+			Color color = *((Color*)value);
+			retString = String::NumberToString(color.r) + " " + String::NumberToString(color.g) + " " + String::NumberToString(color.b) + " " + String::NumberToString(color.a);
+		}
+		break;
+		case ProgramParam::PARAM_Vector2:
+		{
+			Vector2 vec = *((Vector2*)value);
+			retString = String::NumberToString(vec.x) + " " + String::NumberToString(vec.y);
+		}
+		break;
+		case ProgramParam::PARAM_Vector3:
+		{
+			Vector3 vec = *((Vector3*)value);
+			retString = String::NumberToString(vec.x) + " " + String::NumberToString(vec.y) + " " + String::NumberToString(vec.z);
+		}
+		break;
+	}
+	
+	return retString;
+}
+
+void PolycodeMaterialEditor::saveFile() {
+
+	Object fileData;
+	fileData.root.name = "polycode_material_library";
+	
+	ObjectEntry *materialsEntry = fileData.root.addChild("materials");
+	
+	for(int i=0; i < materials.size(); i++) {
+		Material *material = materials[i];				
+		
+		ObjectEntry *materialEntry = materialsEntry->addChild("material");
+		materialEntry->addChild("name", material->getName());
+		materialEntry->addChild("blendingMode", material->blendingMode);
+		
+		if(material->getShader(0) && material->getShaderBinding(0)) {
+				
+		Shader *shader = material->getShader(0);
+		
+		ObjectEntry *shaderEntry = materialEntry->addChild("shader");
+		shaderEntry->addChild("name", shader->getName());		
+		ObjectEntry *texturesEntry = shaderEntry->addChild("textures");
+		
+		ShaderBinding *shaderBinding = material->getShaderBinding(0);
+		for(int j=0; j < shader->expectedTextures.size(); j++) {
+			Texture *texture = shaderBinding->getTexture(shader->expectedTextures[j]);
+			if(texture) {
+				String texturePath = texture->getResourcePath();
+				texturePath = texturePath.replace(parentProject->getRootFolder()+"/", "");
+				
+				ObjectEntry *textureEntry = texturesEntry->addChild("texture", texturePath);
+				textureEntry->addChild("name", shader->expectedTextures[j]);
+			}
+		}
+
+		if(shader->expectedFragmentParams.size() > 0 || shader->expectedVertexParams.size() > 0) {
+			ObjectEntry *paramsEntry = shaderEntry->addChild("params");
+			
+			for(int j=0; j < shader->expectedFragmentParams.size(); j++) {
+				if(shaderBinding->getLocalParamByName(shader->expectedFragmentParams[j].name) && !shader->expectedFragmentParams[j].isAuto) {
+				ObjectEntry *paramEntry = paramsEntry->addChild("param");
+				paramEntry->addChild("name", shader->expectedFragmentParams[j].name);
+				paramEntry->addChild("type", shader->expectedFragmentParams[j].typeString);
+				paramEntry->addChild("value", createStringValue(shader->expectedFragmentParams[j].paramType, shaderBinding->getLocalParamByName(shader->expectedFragmentParams[j].name)->data));
+				}
+			}
+
+			for(int j=0; j < shader->expectedVertexParams.size(); j++) {
+				if(shaderBinding->getLocalParamByName(shader->expectedVertexParams[j].name) && !shader->expectedVertexParams[j].isAuto) {
+				ObjectEntry *paramEntry = paramsEntry->addChild("param");
+				paramEntry->addChild("name", shader->expectedVertexParams[j].name);
+				paramEntry->addChild("type", shader->expectedVertexParams[j].typeString);
+				paramEntry->addChild("value", createStringValue(shader->expectedVertexParams[j].paramType, shaderBinding->getLocalParamByName(shader->expectedVertexParams[j].name)->data));
+				}
+			}
+			}
+			
+		}
+	}
+	
+	fileData.saveToXML(filePath);
+
+}
+
+void PolycodeMaterialEditor::handleEvent(Event *event) {
+
+	if(event->getDispatcher() == mainWindow->materialPane && event->getEventType() == "Event" && event->getEventCode() == Event::CHANGE_EVENT) {
+		if(selectedMaterialNode && mainWindow->materialPane->currentMaterial) {
+			selectedMaterialNode->setLabelText(mainWindow->materialPane->currentMaterial->getName());
+		}
+	}
+		
+	if(event->getDispatcher() == materialBrowser->newMaterialButton && event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CLICK_EVENT) {
+		Material *newMaterial = CoreServices::getInstance()->getMaterialManager()->createMaterial("Untitled", "DefaultShader");
+			materialBrowser->addMaterial(newMaterial)->setSelected();
+			materials.push_back(newMaterial);
+	}	
+		
+
+	if(event->getDispatcher() == materialBrowser) {
+		if(event->getEventType() == "Event" && event->getEventCode() == Event::CHANGE_EVENT) {
+			if(materialBrowser->selectedData)  {
+				if(materialBrowser->selectedData->material) {
+					mainWindow->materialPane->setMaterial(materialBrowser->selectedData->material);
+					selectedMaterialNode = materialBrowser->selectedNode;
+				}
+			}			
+		}
+	}
+}
+
+void PolycodeMaterialEditor::Resize(int x, int y) {
+	grid->setImageCoordinates(0,0,x,y);	
+	mainSizer->Resize(x,y);
+	PolycodeEditor::Resize(x,y);
+}
+

+ 6 - 1
IDE/Contents/Source/PolycodeProject.cpp

@@ -129,10 +129,15 @@ bool PolycodeProject::saveFile() {
 	configFile.root["entryPoint"]->stringVal = data.entryPoint;
 	configFile.root["entryPoint"]->stringVal = data.entryPoint;
 	
 	
 	ObjectEntry *color = configFile.root["backgroundColor"];
 	ObjectEntry *color = configFile.root["backgroundColor"];
+	
 	(*color)["red"]->NumberVal = data.backgroundColorR;
 	(*color)["red"]->NumberVal = data.backgroundColorR;
+	(*color)["red"]->type = ObjectEntry::FLOAT_ENTRY;
+	
 	(*color)["green"]->NumberVal = data.backgroundColorG;
 	(*color)["green"]->NumberVal = data.backgroundColorG;
+	(*color)["green"]->type = ObjectEntry::FLOAT_ENTRY;
+		
 	(*color)["blue"]->NumberVal = data.backgroundColorB;
 	(*color)["blue"]->NumberVal = data.backgroundColorB;
-
+	(*color)["blue"]->type = ObjectEntry::FLOAT_ENTRY;
 
 
 	if(configFile.root["modules"]) {
 	if(configFile.root["modules"]) {
 		configFile.root["modules"]->Clear();
 		configFile.root["modules"]->Clear();

+ 14 - 8
IDE/Contents/Source/PolycodeProjectEditor.cpp

@@ -38,7 +38,7 @@ PolycodeProjectEditor::PolycodeProjectEditor(PolycodeProjectManager *projectMana
 
 
 	this->projectManager = projectManager;
 	this->projectManager = projectManager;
 
 
-	grid = new ScreenImage("editorGrid.png");
+	grid = new ScreenImage("Images/editorGrid.png");
 	
 	
 	addChild(grid);
 	addChild(grid);
 	grid->snapToPixels = true;
 	grid->snapToPixels = true;
@@ -77,10 +77,10 @@ PolycodeProjectEditor::PolycodeProjectEditor(PolycodeProjectManager *projectMana
 	mainSettingsWindow->setPosition(10,10);
 	mainSettingsWindow->setPosition(10,10);
 	addChild(mainSettingsWindow);
 	addChild(mainSettingsWindow);
 	
 	
-	ScreenLabel *label2 = new ScreenLabel(L"DEFAULT VIDEO OPTIONS", fontSize+2, fontName, Label::ANTIALIAS_FULL);	
-	label2->setColor(1.0, 1.0, 1.0, 0.5);
+	ScreenLabel *label2 = new ScreenLabel(L"DEFAULT VIDEO OPTIONS", 22, "section", Label::ANTIALIAS_FULL);	
+	label2->setColor(1.0, 1.0, 1.0, 0.4);
 	mainSettingsWindow->addChild(label2);
 	mainSettingsWindow->addChild(label2);
-	label2->setPosition(padding, 50);		
+	label2->setPosition(padding, 40);		
 
 
 		
 		
 	label2 = new ScreenLabel(L"Width:", fontSize, fontName, Label::ANTIALIAS_FULL);
 	label2 = new ScreenLabel(L"Width:", fontSize, fontName, Label::ANTIALIAS_FULL);
@@ -138,10 +138,10 @@ PolycodeProjectEditor::PolycodeProjectEditor(PolycodeProjectManager *projectMana
 	vSyncCheckBox->setPosition(padding, framerateInput->getPosition().y+framerateInput->getHeight()+10);
 	vSyncCheckBox->setPosition(padding, framerateInput->getPosition().y+framerateInput->getHeight()+10);
 	mainSettingsWindow->addChild(vSyncCheckBox);
 	mainSettingsWindow->addChild(vSyncCheckBox);
 	
 	
-	label2 = new ScreenLabel(L"STARTUP OPTIONS", fontSize+2, fontName, Label::ANTIALIAS_FULL);	
-	label2->setColor(1.0, 1.0, 1.0, 0.5);
+	label2 = new ScreenLabel(L"STARTUP OPTIONS", 22, "section", Label::ANTIALIAS_FULL);	
+	label2->setColor(1.0, 1.0, 1.0, 0.4);
 	mainSettingsWindow->addChild(label2);
 	mainSettingsWindow->addChild(label2);
-	label2->setPosition(padding, vSyncCheckBox->getPosition().y+vSyncCheckBox->getHeight()+30);		
+	label2->setPosition(padding, vSyncCheckBox->getPosition().y+vSyncCheckBox->getHeight()+20);		
 	
 	
 	
 	
 	label2 = new ScreenLabel(L"Entry point file:", fontSize, fontName, Label::ANTIALIAS_FULL);
 	label2 = new ScreenLabel(L"Entry point file:", fontSize, fontName, Label::ANTIALIAS_FULL);
@@ -161,9 +161,15 @@ PolycodeProjectEditor::PolycodeProjectEditor(PolycodeProjectManager *projectMana
 	mainSettingsWindow->addChild(label2);
 	mainSettingsWindow->addChild(label2);
 	label2->setPosition(padding, entryPointInput->getPosition().y+entryPointInput->getHeight()+10);		
 	label2->setPosition(padding, entryPointInput->getPosition().y+entryPointInput->getHeight()+10);		
 
 
-	bgColorBox = new UIColorBox(Color(1.0, 0.5, 0.0, 0.9), 30,30);
+	colorPicker = new UIColorPicker();
+	colorPicker->setPosition(200,200);
+	addChild(colorPicker);
+
+	bgColorBox = new UIColorBox(colorPicker, Color(1.0, 0.5, 0.0, 0.9), 30,30);
 	bgColorBox->setPosition(label2->getPosition().x, label2->getPosition().y+label2->getHeight());
 	bgColorBox->setPosition(label2->getPosition().x, label2->getPosition().y+label2->getHeight());
 	mainSettingsWindow->addChild(bgColorBox);
 	mainSettingsWindow->addChild(bgColorBox);
+	
+	
 
 
 }
 }
 
 

+ 12 - 0
IDE/Contents/Source/PolycodeProjectManager.cpp

@@ -87,6 +87,18 @@ PolycodeProject *PolycodeProjectManager::getProjectByProjectFile(String projectF
 	return NULL;
 	return NULL;
 }
 }
 
 
+void PolycodeProjectManager::setActiveProject(PolycodeProject* project) {
+	if(project != activeProject) {
+		
+		if(activeProject != NULL) {
+			CoreServices::getInstance()->getResourceManager()->removeArchive(activeProject->getRootFolder());		
+		}
+		
+		activeProject = project;
+		CoreServices::getInstance()->getResourceManager()->addArchive(project->getRootFolder());
+	}
+}
+
 void PolycodeProjectManager::createNewFile(String templatePath, String newFileName) {
 void PolycodeProjectManager::createNewFile(String templatePath, String newFileName) {
 	if(activeFolder == "")
 	if(activeFolder == "")
 		return;
 		return;

+ 5 - 4
IDE/Contents/Source/PolycodeScreenEditor.cpp

@@ -34,7 +34,7 @@ PolycodeScreenEditor::PolycodeScreenEditor() : PolycodeEditor(true){
 	selectedEntity = NULL;
 	selectedEntity = NULL;
 	isDraggingEntity = false; 
 	isDraggingEntity = false; 
 	
 	
-	grid = new ScreenImage("editorGrid.png");
+	grid = new ScreenImage("Images/editorGrid.png");
 	
 	
 	addChild(grid);
 	addChild(grid);
 	grid->snapToPixels = true;
 	grid->snapToPixels = true;
@@ -47,7 +47,7 @@ PolycodeScreenEditor::PolycodeScreenEditor() : PolycodeEditor(true){
 		
 		
 	baseEntity->setPositionMode(ScreenEntity::POSITION_CENTER);	
 	baseEntity->setPositionMode(ScreenEntity::POSITION_CENTER);	
 
 
-	centerImage = new ScreenImage("screenCenter.png");
+	centerImage = new ScreenImage("Images/screenCenter.png");
 	centerImage->setPositionMode(ScreenEntity::POSITION_CENTER);
 	centerImage->setPositionMode(ScreenEntity::POSITION_CENTER);
 	addChild(centerImage);
 	addChild(centerImage);
 	
 	
@@ -63,7 +63,7 @@ PolycodeScreenEditor::PolycodeScreenEditor() : PolycodeEditor(true){
 	baseEntity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
 	baseEntity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
 	baseEntity->processInputEvents = true;
 	baseEntity->processInputEvents = true;
 									
 									
-	screenTransform = new UIBox("screenTransform.png", 16,16,16,16, 100,100);
+	screenTransform = new UIBox("Images/screenTransform.png", 16,16,16,16, 100,100);
 	screenTransform->visible = false;
 	screenTransform->visible = false;
 	addChild(screenTransform);
 	addChild(screenTransform);
 		
 		
@@ -74,11 +74,12 @@ PolycodeScreenEditor::PolycodeScreenEditor() : PolycodeEditor(true){
 	ScreenLabel *label2 = new ScreenLabel(L"Entity color:", fontSize, fontName, Label::ANTIALIAS_FULL);
 	ScreenLabel *label2 = new ScreenLabel(L"Entity color:", fontSize, fontName, Label::ANTIALIAS_FULL);
 	entityInfoWindow->addChild(label2);
 	entityInfoWindow->addChild(label2);
 	label2->setPosition(padding, entityInfoWindow->topPadding+20);
 	label2->setPosition(padding, entityInfoWindow->topPadding+20);
-
+/*
 	entityColorBox = new UIColorBox(Color(1.0, 1.0, 1.0, 0.0), 30,30);
 	entityColorBox = new UIColorBox(Color(1.0, 1.0, 1.0, 0.0), 30,30);
 	entityColorBox->setPosition(label2->getPosition().x, label2->getPosition().y+label2->getHeight());
 	entityColorBox->setPosition(label2->getPosition().x, label2->getPosition().y+label2->getHeight());
 	entityInfoWindow->addChild(entityColorBox);		
 	entityInfoWindow->addChild(entityColorBox);		
 	entityColorBox->addEventListener(this, UIEvent::CHANGE_EVENT);
 	entityColorBox->addEventListener(this, UIEvent::CHANGE_EVENT);
+	*/
 	
 	
 }
 }
 
 

+ 7 - 2
Modules/Contents/UI/Include/PolyUIColorBox.h

@@ -49,6 +49,8 @@ namespace Polycode {
 			
 			
 			void rebuildFromTextInputs();
 			void rebuildFromTextInputs();
 			
 			
+			void cancelColorListeners();
+			
 			void Update();			
 			void Update();			
 			void onClose();
 			void onClose();
 			
 			
@@ -87,8 +89,8 @@ namespace Polycode {
 
 
 	class _PolyExport UIColorBox : public UIElement {
 	class _PolyExport UIColorBox : public UIElement {
 		public:
 		public:
-			UIColorBox(Color initialColor, Number width, Number height);
-			~UIColorBox();
+			UIColorBox(UIColorPicker *colorPicker, Color initialColor, Number width, Number height);
+			virtual ~UIColorBox();
 			
 			
 			Color getSelectedColor();
 			Color getSelectedColor();
 			
 			
@@ -98,7 +100,10 @@ namespace Polycode {
 				
 				
 		protected:
 		protected:
 		
 		
+			bool listeningToPicker;
 			UIColorPicker *colorPicker;
 			UIColorPicker *colorPicker;
+			
+			Color selectedColor;
 				
 				
 			UIBox *frameImage;
 			UIBox *frameImage;
 			ScreenShape *bgImage;
 			ScreenShape *bgImage;

+ 7 - 2
Modules/Contents/UI/Include/PolyUIComboBox.h

@@ -38,6 +38,7 @@ namespace Polycode {
 			UIComboBoxItem(String label, Number comboWidth, Number comboHeight);
 			UIComboBoxItem(String label, Number comboWidth, Number comboHeight);
 			~UIComboBoxItem();
 			~UIComboBoxItem();
 			
 			
+			void *data;
 			String label;
 			String label;
 			ScreenLabel *itemLabel;
 			ScreenLabel *itemLabel;
 	};
 	};
@@ -51,11 +52,15 @@ namespace Polycode {
 		
 		
 			void updateVis();
 			void updateVis();
 		
 		
-			int addComboItem(String itemName);
+			int addComboItem(String itemName, void *data=NULL);
 			int getSelectedIndex();
 			int getSelectedIndex();
+			UIComboBoxItem *getSelectedItem();
 			void setSelectedIndex(unsigned int newIndex);
 			void setSelectedIndex(unsigned int newIndex);
 			void handleEvent(Event *event);
 			void handleEvent(Event *event);
-				
+			
+			unsigned int getNumItems();
+			UIComboBoxItem *getItemAtIndex(unsigned int index);
+							
 		private:
 		private:
 		
 		
 			std::vector<UIComboBoxItem*> items;
 			std::vector<UIComboBoxItem*> items;

+ 2 - 0
Modules/Contents/UI/Include/PolyUITree.h

@@ -56,6 +56,8 @@ namespace Polycode {
 			void setIcon(String iconFile);
 			void setIcon(String iconFile);
 			void setSelected();
 			void setSelected();
 			
 			
+			void setLabelText(const String &text);
+			
 			void Resize(Number width);
 			void Resize(Number width);
 		
 		
 			int getNumTreeChildren() { return treeChildren.size(); }
 			int getNumTreeChildren() { return treeChildren.size(); }

+ 3 - 1
Modules/Contents/UI/Include/PolyUIWindow.h

@@ -58,7 +58,9 @@ namespace Polycode {
 			bool closeOnEscape;
 			bool closeOnEscape;
 		
 		
 		protected:				
 		protected:				
-
+			
+			Number closeIconX;
+			Number closeIconY;
 		
 		
 			Font *font;
 			Font *font;
 			Tween *windowTween;
 			Tween *windowTween;

+ 35 - 16
Modules/Contents/UI/Source/PolyUIColorBox.cpp

@@ -141,6 +141,14 @@ UIColorPicker::UIColorPicker() : UIWindow(L"Pick a color!", 300, 240) {
 	mainSelector->setDragLimits(Polycode::Rectangle(mainColorRect->getPosition().x,mainColorRect->getPosition().y,mainColorRect->getWidth(), mainColorRect->getHeight()));
 	mainSelector->setDragLimits(Polycode::Rectangle(mainColorRect->getPosition().x,mainColorRect->getPosition().y,mainColorRect->getWidth(), mainColorRect->getHeight()));
 				
 				
 	colorAlpha = 1.0;
 	colorAlpha = 1.0;
+	
+	visible = false;
+	enabled = false;
+	
+}
+
+void UIColorPicker::cancelColorListeners() {
+	dispatchEvent(new Event(), Event::CANCEL_EVENT);
 }
 }
 
 
 void UIColorPicker::onClose() {
 void UIColorPicker::onClose() {
@@ -368,7 +376,7 @@ void UIColorPicker::Update() {
 	UIWindow::Update();
 	UIWindow::Update();
 }
 }
 
 
-UIColorBox::UIColorBox(Color initialColor, Number width, Number height) : UIElement() {
+UIColorBox::UIColorBox(UIColorPicker *colorPicker, Color initialColor, Number width, Number height) : UIElement() {
 
 
 	Config *conf = CoreServices::getInstance()->getConfig();	
 	Config *conf = CoreServices::getInstance()->getConfig();	
 
 
@@ -400,45 +408,56 @@ UIColorBox::UIColorBox(Color initialColor, Number width, Number height) : UIElem
 	frameImage = new UIBox(frameImageFile, st,sr,sb,sl, width, height);	
 	frameImage = new UIBox(frameImageFile, st,sr,sb,sl, width, height);	
 	addChild(frameImage);
 	addChild(frameImage);
 	
 	
-	colorPicker = new UIColorPicker();
-	colorPicker->setPosition(width + 20, -colorPicker->getHeight()/2.0);
+	this->colorPicker = colorPicker;	
+	colorPicker->addEventListener(this, Event::CHANGE_EVENT);	
+	colorPicker->addEventListener(this, Event::CANCEL_EVENT);
 	
 	
-	colorPicker->addEventListener(this, Event::CHANGE_EVENT);
-	
-	addChild(colorPicker);
-	colorPicker->visible = false;
-	colorPicker->enabled = false;
-
 	this->width = width;
 	this->width = width;
 	this->height = height;
 	this->height = height;
 	
 	
-	setBoxColor(initialColor);
+	selectedColor = initialColor;
+	colorShape->color = selectedColor;	
+			
+	listeningToPicker = false;
 }
 }
 
 
 Color UIColorBox::getSelectedColor() {
 Color UIColorBox::getSelectedColor() {
-	return colorPicker->getSelectedColor();
+	return selectedColor;
 }
 }
 
 
 UIColorBox::~UIColorBox() {
 UIColorBox::~UIColorBox() {
-
+	colorPicker->removeAllHandlersForListener(this);
 }
 }
 
 
 void UIColorBox::setBoxColor(Color newColor) {
 void UIColorBox::setBoxColor(Color newColor) {
-	colorPicker->setPickerColor(newColor);
+	selectedColor = newColor;
+	colorShape->color = selectedColor;
+	if(listeningToPicker) {
+		colorPicker->setPickerColor(newColor);	
+	}
 }
 }
 
 
 void UIColorBox::showColorPicker() {
 void UIColorBox::showColorPicker() {
 	colorPicker->visible = true;
 	colorPicker->visible = true;
 	colorPicker->enabled = true;
 	colorPicker->enabled = true;
+	colorPicker->cancelColorListeners();
+	colorPicker->setPickerColor(selectedColor);
+	listeningToPicker = true;
 }
 }
 		
 		
 void UIColorBox::handleEvent(Event *event) {
 void UIColorBox::handleEvent(Event *event) {
 
 
-	if(event->getDispatcher() == colorPicker) {
+	if(event->getDispatcher() == colorPicker && event->getEventType() == "Event") {
 		switch(event->getEventCode()) {
 		switch(event->getEventCode()) {
+			case Event::CANCEL_EVENT:
+				listeningToPicker = false;
+			break;
 			case Event::CHANGE_EVENT:
 			case Event::CHANGE_EVENT:
-				colorShape->color = colorPicker->getSelectedColor();
-				dispatchEvent(new UIEvent(), UIEvent::CHANGE_EVENT);
+				if(listeningToPicker) {
+					selectedColor = colorPicker->getSelectedColor();
+					colorShape->color = selectedColor;
+					dispatchEvent(new UIEvent(), UIEvent::CHANGE_EVENT);
+				}
 			break;
 			break;
 		}		
 		}		
 	}
 	}

+ 22 - 5
Modules/Contents/UI/Source/PolyUIComboBox.cpp

@@ -130,8 +130,9 @@ UIComboBox::~UIComboBox() {
 
 
 }
 }
 
 
-int UIComboBox::addComboItem(String itemName) {
+int UIComboBox::addComboItem(String itemName, void *data) {
 	UIComboBoxItem *newItem = new UIComboBoxItem(itemName, comboWidth, comboHeight);
 	UIComboBoxItem *newItem = new UIComboBoxItem(itemName, comboWidth, comboHeight);
+	newItem->data = data;
 	items.push_back(newItem);
 	items.push_back(newItem);
 	dropDownBox->addChild(newItem);
 	dropDownBox->addChild(newItem);
 	newItem->setPosition(0,nextItemHeight);
 	newItem->setPosition(0,nextItemHeight);
@@ -140,6 +141,14 @@ int UIComboBox::addComboItem(String itemName) {
 	return items.size()-1;
 	return items.size()-1;
 }
 }
 
 
+UIComboBoxItem *UIComboBox::getSelectedItem() {
+	if(selectedIndex < items.size()) {
+		return items[selectedIndex];
+	} else {
+		return NULL;
+	}
+}
+
 void UIComboBox::toggleDropDown() {
 void UIComboBox::toggleDropDown() {
 	isDroppedDown = !isDroppedDown;
 	isDroppedDown = !isDroppedDown;
 	updateVis();
 	updateVis();
@@ -158,8 +167,19 @@ void UIComboBox::setSelectedIndex(unsigned int newIndex) {
 	if(newIndex < items.size()) {
 	if(newIndex < items.size()) {
 		selectedIndex = newIndex;				
 		selectedIndex = newIndex;				
 		selectedLabel->setText(items[selectedIndex]->label);		
 		selectedLabel->setText(items[selectedIndex]->label);		
+		isDroppedDown = false;
+		updateVis();
+		dispatchEvent(new UIEvent(), UIEvent::CHANGE_EVENT);
 	}
 	}
 }
 }
+
+unsigned int UIComboBox::getNumItems() {
+	return items.size();
+}
+
+UIComboBoxItem *UIComboBox::getItemAtIndex(unsigned int index) {
+	return items[index];
+}
 				
 				
 void UIComboBox::handleEvent(Event *event) {
 void UIComboBox::handleEvent(Event *event) {
 
 
@@ -178,10 +198,7 @@ void UIComboBox::handleEvent(Event *event) {
 			break;
 			break;
 			case InputEvent::EVENT_MOUSEDOWN:
 			case InputEvent::EVENT_MOUSEDOWN:
 			{
 			{
-				selectedIndex = selectedOffset;				
-				selectedLabel->setText(items[selectedIndex]->label);				
-				isDroppedDown = false;
-				updateVis();				
+				setSelectedIndex(selectedOffset);
 			}
 			}
 			break;
 			break;
 		}	
 		}	

+ 5 - 0
Modules/Contents/UI/Source/PolyUITree.cpp

@@ -130,6 +130,11 @@ void UITree::Resize(Number width) {
 	}
 	}
 }
 }
 
 
+void UITree::setLabelText(const String &text) {
+	labelText = text;
+	textLabel->setText(text);
+}
+			
 String UITree::getLabelText() {
 String UITree::getLabelText() {
 	return labelText;
 	return labelText;
 }
 }

+ 13 - 6
Modules/Contents/UI/Source/PolyUIWindow.cpp

@@ -71,8 +71,11 @@ UIWindow::UIWindow(String windowName, Number width, Number height) : ScreenEntit
 	
 	
 	closeBtn = new UIImageButton(conf->getStringValue("Polycode", "uiWindowCloseIcon"));
 	closeBtn = new UIImageButton(conf->getStringValue("Polycode", "uiWindowCloseIcon"));
 	addChild(closeBtn);
 	addChild(closeBtn);
-	closeBtn->setPosition(width-closeBtn->getWidth()-conf->getNumericValue("Polycode", "uiCloseIconX"), conf->getNumericValue("Polycode", "uiCloseIconY"));
-
+	closeIconX = conf->getNumericValue("Polycode", "uiCloseIconX");
+	closeIconY = conf->getNumericValue("Polycode", "uiCloseIconY");
+		
+	closeBtn->setPosition(width-closeBtn->getWidth()-closeIconX, closeIconY);	
+	
 	titlebarRect->addEventListener(this, InputEvent::EVENT_MOUSEUP);
 	titlebarRect->addEventListener(this, InputEvent::EVENT_MOUSEUP);
 	titlebarRect->addEventListener(this, InputEvent::EVENT_MOUSEUP_OUTSIDE);	
 	titlebarRect->addEventListener(this, InputEvent::EVENT_MOUSEUP_OUTSIDE);	
 	titlebarRect->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
 	titlebarRect->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
@@ -89,10 +92,14 @@ UIWindow::UIWindow(String windowName, Number width, Number height) : ScreenEntit
 }
 }
 
 
 void UIWindow::setWindowSize(Number w, Number h) {
 void UIWindow::setWindowSize(Number w, Number h) {
-//	windowRect->setScale(w/windowRect->getWidth(), h/windowRect->getHeight());
-//	shadowRect->setScale(w/shadowRect->getWidth(), h/shadowRect->getHeight());
-//	titlebarRect->setScale((w-4)/titlebarRect->getWidth(), 1.0f);
-//	closeBtn->setPosition(w-closeBtn->getWidth()-2, 4);
+	w = w+(padding*2.0);
+	h = h+topPadding;
+
+	windowRect->resizeBox(w, h);
+	setWidth(w);
+	setHeight(h);	
+	closeBtn->setPosition(width-closeBtn->getWidth()-closeIconX, closeIconY);	
+	matrixDirty = true;
 }
 }
 
 
 UIWindow::~UIWindow() {
 UIWindow::~UIWindow() {