Просмотр исходного кода

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 лет назад
Родитель
Сommit
6135171126
88 измененных файлов с 1862 добавлено и 868 удалено
  1. BIN
      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. BIN
      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. BIN
      IDE/Contents/Resources/Fonts/LeagueGothic-CondensedRegular.otf
  51. BIN
      IDE/Contents/Resources/Fonts/LeagueGothic-Regular.otf
  52. BIN
      IDE/Contents/Resources/Images/box_icon.png
  53. BIN
      IDE/Contents/Resources/Images/cubemap_icon.png
  54. BIN
      IDE/Contents/Resources/Images/editorGrid.png
  55. BIN
      IDE/Contents/Resources/Images/material_bg.png
  56. BIN
      IDE/Contents/Resources/Images/material_editor_light.png
  57. BIN
      IDE/Contents/Resources/Images/material_grid.png
  58. BIN
      IDE/Contents/Resources/Images/material_icon.png
  59. BIN
      IDE/Contents/Resources/Images/new_cubemap.png
  60. BIN
      IDE/Contents/Resources/Images/new_material.png
  61. BIN
      IDE/Contents/Resources/Images/new_screenshader.png
  62. BIN
      IDE/Contents/Resources/Images/new_shader.png
  63. BIN
      IDE/Contents/Resources/Images/plane_icon.png
  64. BIN
      IDE/Contents/Resources/Images/screenshader_icon.png
  65. BIN
      IDE/Contents/Resources/Images/shader_icon.png
  66. BIN
      IDE/Contents/Resources/Images/small_selector.png
  67. BIN
      IDE/Contents/Resources/Images/sphere_icon.png
  68. BIN
      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

BIN
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;
 uniform sampler2D diffuse;
 
+uniform vec4 diffuse_color;
+uniform vec4 ambient_color;
+
+
 float calculateAttenuation(in int i, in float dist)
 {
     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));
 }
 
-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 s = pos-lpos; 
 	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);
 
 		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 s = pos-lpos; 
 	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);
 		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++) {
 		if (gl_LightSource[i].spotCutoff == 180.0) {
-			pointLight(i, normal, pos, diffuse, specular);
+			pointLight(i, normal, pos, diffuse);
 		} 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()
 {
 	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 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.a = diffuse_color.a * texColor.a;  
+
     // fog
 	const float LOG2 = 1.442695;
 	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 vec4 pos;
 varying vec4 vertexColor;
+
 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)
 {
@@ -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) {
-	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 lpos = gl_LightSource[i].position;
 	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) {
-	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 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
@@ -92,16 +97,13 @@ void main()
 	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;
 		
 	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
 	const float LOG2 = 1.442695;
 	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 vertexColor;
 
+uniform vec4 diffuse_color;
+uniform vec4 specular_color;
+uniform vec4 ambient_color;
+uniform float shininess;
+
 float calculateAttenuation(in int i, in float dist)
 {
     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) {
-	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 lpos = gl_LightSource[i].position;
 	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) {
-	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 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
@@ -91,12 +96,11 @@ void main()
 	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;
 		
     vec4 color = (diffuse_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);
     
     // fog

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

@@ -1,14 +1,21 @@
 varying vec3 normal;
 varying vec4 pos;
 varying vec4 vertexColor;
+varying vec4 ShadowCoord0;
+varying vec4 ShadowCoord1;
+
 uniform sampler2D diffuse;
 uniform sampler2D shadowMap0;
 uniform sampler2D shadowMap1;
-varying vec4 ShadowCoord0;
-varying vec4 ShadowCoord1;
+
 uniform mat4 shadowMatrix0;
 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)
 {
@@ -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) {
-	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 lpos = gl_LightSource[i].position;
 	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)
 		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 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
@@ -115,16 +122,13 @@ void main()
 	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;
 		
 	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
 	const float LOG2 = 1.442695;
 	float z = gl_FragCoord.z / gl_FragCoord.w;

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

@@ -1,10 +1,12 @@
 uniform sampler2D diffuse;
 varying vec4 vertexColor;
+varying vec4 specularColor;
 
 void main()
 {
 	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);	
-    vec4 color = texColor*vertexColor;    
+    vec4 color = (texColor*vertexColor) + specularColor;    
+    color.a = vertexColor.a * texColor.a;
     
     // fog
 	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)
 {
     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) {
-	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 lpos = gl_LightSource[i].position;
 	vec4 s = pos-lpos; 
 	vec4 sn = -normalize(s);
-	
+
 	vec3 light = sn.xyz;
 	vec3 n = normalize(normal);
 	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) {
-	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 lpos = gl_LightSource[i].position;
 	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 spot = 0.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);
 	if(nDotL > 0.0) {
 		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 specularColor;
 
 void main() {
 	vec3 normal = gl_NormalMatrix * gl_Normal;
@@ -90,15 +96,16 @@ void main() {
 	vec4 rawpos = gl_Vertex;
     vertexColor = gl_Color;
 	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
-	
+
 	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;		
-		
-    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);  	
 }

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

@@ -1,9 +1,11 @@
 
 varying vec4 vertexColor;
+varying vec4 specularColor;
 
 void main()
 {
-    vec4 color = vertexColor;
+    vec4 color = vertexColor + specularColor;
+    color.a = vertexColor.a;
     
     // fog
 	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 vec4 pos;
 varying vec4 vertexColor;
+
 uniform sampler2D diffuse;
 uniform sampler2D normal_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)
 {
     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) {
-	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 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) {
-	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 lpos = gl_LightSource[i].position;
 	
@@ -124,17 +130,15 @@ void main()
 	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;
-	
-	diffuse_val.a = 1.0;
-	specular_val.a = 1.0;
-		
+			
 	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);		
 		
     vec4 color = (diffuse_val  * texColor * vertexColor) +
                  (specular_val * 1.0)+
-                 (gl_FrontMaterial.ambient * texColor * vertexColor);
+                 (ambient_color * texColor * vertexColor);
     color = clamp(color, 0.0, 1.0);
-    
+    color.a = diffuse_color.a * texColor.a;
+
     // fog
 	const float LOG2 = 1.442695;
 	float z = gl_FragCoord.z / gl_FragCoord.w;

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

@@ -7,17 +7,28 @@
 				</params>				
 			</vp>
 			<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>
 		</shader>	
-		<shader type="glsl" name="DefaultShaderNoTexture" numAreaLights="4" numSpotLights="2">		
+		<shader type="glsl" name="DefaultShaderNoTexture" numAreaLights="4" numSpotLights="2">	
 			<vp source="DefaultShader.vert">
-				<params>			
+				<params>
 				</params>				
 			</vp>
 			<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>				
 			</fp>
 		</shader>
@@ -27,29 +38,47 @@
 				</params>				
 			</vp>
 			<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>
 		</shader>
 		
 		<shader type="glsl" name="DefaultShaderVertex" numAreaLights="4" numSpotLights="2">		
 			<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>				
 			</vp>
 			<fp source="DefaultShaderVertex.frag">
-				<params>			
-				</params>				
+				<params>
+				</params>
+				<textures>
+					<texture name="diffuse"/>
+				</textures>
 			</fp>
 		</shader>			
 		<shader type="glsl" name="DefaultShaderVertexNoTexture" numAreaLights="4" numSpotLights="2">		
 			<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>				
 			</vp>
 			<fp source="DefaultShaderVertexNoTexture.frag">
-				<params>			
-				</params>				
+				<params>
+				</params>
 			</fp>
 		</shader>			
 		
@@ -59,8 +88,13 @@
 				</params>				
 			</vp>
 			<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>
 		</shader>															
 		<shader type="glsl" name="Unlit" numAreaLights="0" numSpotLights="0">		
@@ -70,7 +104,10 @@
 			</vp>
 			<fp source="Unlit.frag">
 				<params>			
-				</params>				
+				</params>
+				<textures>
+					<texture name="diffuse"/>
+				</textures>
 			</fp>
 		</shader>
 		<shader type="glsl" name="NorColSpec" numAreaLights="4" numSpotLights="2">		
@@ -79,8 +116,17 @@
 				</params>				
 			</vp>
 			<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>
 		</shader>											
 	</shaders>	

BIN
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 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)
 {
     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) {
-	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 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) {
-	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 lpos = gl_LightSource[i].position;
 	
@@ -132,9 +138,10 @@ void main()
 		
     vec4 color = (diffuse_val  * texColor * vertexColor) +
                  (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
 	const float LOG2 = 1.442695;
 	float z = gl_FragCoord.z / gl_FragCoord.w;

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

@@ -7,11 +7,20 @@
 				</params>				
 			</vp>
 			<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>
 		</shader>	
-		<shader type="glsl" name="HDRProcessShader">
+		<shader type="glsl" name="HDRProcessShader" screen="true">
 			<vp source="ScreenShader.vert"/>
 			<fp source="HDRProcess.frag">
 				<params>
@@ -19,7 +28,7 @@
 				</params>								
 			</fp>
 		</shader>		
-		<shader type="glsl" name="HDRProcessShaderBloom">
+		<shader type="glsl" name="HDRProcessShaderBloom" screen="true">
 			<vp source="ScreenShader.vert"/>
 			<fp source="HDRProcessBloom.frag">
 				<params>
@@ -28,19 +37,19 @@
 				</params>								
 			</fp>			
 		</shader>		
-		<shader type="glsl" name="HDRBloomH">
+		<shader type="glsl" name="HDRBloomH" screen="true">
 			<vp source="ScreenShader.vert"/>
 			<fp source="HDRBloomH.frag"/>
 		</shader>
-		<shader type="glsl" name="HDRBloomV">
+		<shader type="glsl" name="HDRBloomV" screen="true">
 			<vp source="ScreenShader.vert"/>
 			<fp source="HDRBloomV.frag"/>
 		</shader>	
-		<shader type="glsl" name="PassThrough">
+		<shader type="glsl" name="PassThrough" screen="true">
 			<vp source="ScreenShader.vert"/>
 			<fp source="PassThrough.frag"/>
 		</shader>	
-		<shader type="glsl" name="ExtractBloom">
+		<shader type="glsl" name="ExtractBloom" screen="true">
 			<vp source="ScreenShader.vert"/>
 			<fp source="ExtractBloom.frag">
 				<params>
@@ -50,11 +59,11 @@
 		</shader>							
 	</shaders>
 	<materials>
-		<material name="HDRProcess">
+		<material name="HDRProcess" screen="true">
 			<shader name="HDRProcessShader">
 			</shader>
 		</material>	
-		<material name="HDRProcessBloom">
+		<material name="HDRProcessBloom" screen="true">
 			<rendertargets type="rgba_fp16">
 				<rendertarget id="base_target"  sizeMode="normalized" width="1.0" height="1.0"/>			
 				<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.
 			* @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.

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

@@ -25,68 +25,13 @@ THE SOFTWARE.
 #include "PolyGlobals.h"
 #include "PolyString.h"
 #include "PolyResource.h"
+#include "PolyShader.h"
 
 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 {
@@ -94,7 +39,7 @@ class _PolyExport GLSLProgramParam {
 			GLSLProgram(int type);
 			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;
 //			GLSLparameter modelViewProjection;

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

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

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

@@ -45,22 +45,10 @@ namespace Polycode {
 		
 	protected:
 
-		void addParamToProgram(GLSLProgram *program,TiXmlNode *node);		
+		GLSLProgramParam addParamToProgram(GLSLProgram *program,TiXmlNode *node);		
 		void recreateGLSLProgram(GLSLProgram *prog, 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;
 	};

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

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

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

@@ -23,6 +23,7 @@ THE SOFTWARE.
 #pragma once
 #include "PolyGlobals.h"
 #include "PolyImage.h"
+#include "PolyObject.h"
 #include <vector>
 
 class TiXmlNode;
@@ -72,16 +73,28 @@ namespace Polycode {
 			Cubemap *cubemapFromXMLNode(TiXmlNode *node);
 		
 			// materials
-			void loadMaterialsFromFile(String fileName);
 			Material *materialFromXMLNode(TiXmlNode *node);
+			
+			Material *createMaterial(String materialName, String shaderName);
+			
 			Shader *setShaderFromXMLNode(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;
 		
 		private:
 			std::vector<Texture*> textures;
 			std::vector<Material*> materials;
+			std::vector<Shader*> shaders;
 		
 			std::vector <PolycodeShaderModule*> shaderModules;
 	};

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

@@ -25,6 +25,7 @@ THE SOFTWARE.
 #include "PolyGlobals.h"
 #include "PolyMatrix4.h"
 #include "PolyVector2.h"
+#include "PolyShader.h"
 #include "PolyImage.h"
 #include "PolyRectangle.h"
 
@@ -210,7 +211,10 @@ namespace Polycode {
 		void enableShaders(bool flag);
 		
 		Number getViewportWidth();
-		Number getViewportHeight();			
+		Number getViewportHeight();		
+		
+		void *getDataPointerForName(const String &name);
+		void setRendererShaderParams(Shader *shader, ShaderBinding *binding);
 
 		virtual void initOSSpecific() {};
 		
@@ -229,7 +233,7 @@ namespace Polycode {
 		static const int BLEND_MODE_COLOR = 2;
 		static const int BLEND_MODE_PREMULTIPLIED = 3;
 		static const int BLEND_MODE_MULTIPLY = 4;
-						
+								
 		static const int FOG_LINEAR = 0;
 		static const int FOG_EXP = 1;
 		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);
 			
 			/**
-			* 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;}
 		
-			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 parseShaders(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);
 
+			/**
+			* Clears the currently applied material
+			*/
+			void clearMaterial();
+
 			/**
 			* Set material from existing Material instance.
 			* @param material Material to apply.

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

@@ -32,6 +32,27 @@ namespace Polycode {
 	class Cubemap;
 	class ShaderBinding;
 	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 {
 		public:
@@ -50,9 +71,16 @@ namespace Polycode {
 
 			int numSpotLights;
 			int numAreaLights;
-							
+			
+			std::vector<String> expectedTextures;
+			std::vector<ProgramParam> expectedFragmentParams;
+			std::vector<ProgramParam> expectedVertexParams;
+								
+			bool screenShader;
+			
 		protected:
 		
+		
 			String name;
 			int type;
 	};
@@ -74,9 +102,6 @@ namespace Polycode {
 		public:	
 			String name;
 			void *data;
-			
-			void setNumber(Number n) { memcpy(data, &n, sizeof(n)); }
-			void setVector3(Vector3 v) { memcpy(data, &v, sizeof(v)); }
 	};	
 	
 	class RenderTargetBinding {
@@ -95,7 +120,8 @@ namespace Polycode {
 		public:
 			ShaderBinding(Shader *shader);
 			virtual ~ShaderBinding();
-			
+
+			virtual Texture *getTexture(const String& name){};
 			virtual void clearTexture(const String& name){};
 			virtual void addTexture(const String& name, Texture *texture)  {};
 			virtual void addParam(const String& type, const String& name, const String& value) {};
@@ -117,8 +143,6 @@ namespace Polycode {
 			RenderTargetBinding *getOutTargetBinding(unsigned int index);
 			
 			void addLocalParam(const String& name, void *ptr);
-			void addLocalParamNumber(const String& name, Number n);
-			void addLocalParamVector3(const String& name, Vector3 v);
 		
 			Shader* shader;
 			std::vector<LocalShaderParam*> localParams;

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

@@ -43,13 +43,16 @@ namespace Polycode {
 		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) {

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

@@ -411,14 +411,14 @@ void OpenGLRenderer::setBlendingMode(int blendingMode) {
 				glBlendFunc (GL_SRC_ALPHA, GL_ONE);
 		break;
 		case BLEND_MODE_COLOR:
-				glBlendFunc (GL_SRC_ALPHA_SATURATE, GL_ONE);
+				glBlendFunc (GL_DST_COLOR, GL_SRC_COLOR);
 		break;
 		case BLEND_MODE_PREMULTIPLIED:
 			glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
 		break;
 		case BLEND_MODE_MULTIPLY:
 			glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA);
-		break;		
+		break;
 		default:
 			glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 		break;
@@ -717,27 +717,6 @@ void OpenGLRenderer::applyMaterial(Material *material,  ShaderBinding *localOpti
 		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;
 	
 	switch(material->getShader(shaderIndex)->getType()) {
@@ -763,6 +742,8 @@ void OpenGLRenderer::applyMaterial(Material *material,  ShaderBinding *localOpti
 			}
 		break;
 	}
+	
+	setBlendingMode(material->blendingMode);
 }
 
 void OpenGLRenderer::clearShader() {

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

@@ -24,6 +24,7 @@ THE SOFTWARE.
 #include "PolyGLSLProgram.h"
 #include "PolyVector3.h"
 #include "PolyVector2.h"
+#include "PolyColor.h"
 #include "PolyLogger.h"
 
 #ifdef _WINDOWS
@@ -62,50 +63,78 @@ GLSLProgram::~GLSLProgram() {
 	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;
 	newParam.name = name;
+	newParam.typeString = typeString;
+	newParam.valueString = valueString;	
 	newParam.paramType = paramType;
 	newParam.defaultData = defaultData;
+	newParam.minValue = minData;
+	newParam.maxValue = maxData;
 	newParam.isAuto = isAuto;
 	newParam.autoID = autoID;
-//	newParam.cgParam = cgGetNamedParameter(program, name.c_str());
+
 	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") {
 			*retType = GLSLProgramParam::PARAM_Number;
 			Number *val = new Number();
 			*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();
-			defaultData = (void*)val;
+			(*valueRes) = (void*)val;
 			vector<String> values = value.split(" ");
 			if(values.size() == 2) {
 				val->set(atof(values[0].c_str()), atof(values[1].c_str()));
 			} 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();
-			defaultData = (void*)val;
+			(*valueRes) = (void*)val;
 			vector<String> values = value.split(" ");
 			if(values.size() == 3) {
 				val->set(atof(values[0].c_str()), atof(values[1].c_str()), atof(values[2].c_str()));
 			} 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 {
 			*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) {
 	GLSLTextureBinding binding;
 	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) {
 	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;
 	newParam->data = defaultData;
 	newParam->name = name;

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

@@ -116,6 +116,11 @@ Shader *GLSLShaderModule::createShader(TiXmlNode *node) {
 	GLSLProgram *vp = NULL;
 	GLSLProgram *fp = NULL;
 	GLSLShader *retShader = NULL;
+	
+	std::vector<String> expectedTextures;
+	std::vector<ProgramParam> expectedFragmentParams;	
+	std::vector<ProgramParam> expectedVertexParams;
+		
 	TiXmlElement *nodeElement = node->ToElement();
 	if (!nodeElement) return NULL; // Skip comment nodes
 	
@@ -130,7 +135,7 @@ Shader *GLSLShaderModule::createShader(TiXmlNode *node) {
 					if(strcmp(pChild2->Value(), "params") == 0) {
 						for (pChild3 = pChild2->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 							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) {
 						for (pChild3 = pChild2->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 							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) {
 		GLSLShader *cgShader = new GLSLShader(vp,fp);
 		cgShader->setName(String(nodeElement->Attribute("name")));
+		cgShader->expectedTextures = expectedTextures;
+		cgShader->expectedVertexParams = expectedVertexParams;
+		cgShader->expectedFragmentParams = expectedFragmentParams;				
 		retShader = cgShader;
 		shaders.push_back((Shader*)cgShader);
 	}
@@ -167,239 +185,49 @@ void GLSLShaderModule::clearShader() {
 	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) {
-	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;
 		LocalShaderParam *localParam = materialOptions->getLocalParamByName(param.name);
-		if(localParam)
+		if(localParam) {
 			paramData = localParam->data;
+		}
+		
 		localParam = localOptions->getLocalParamByName(param.name);
-		if(localParam)
+		if(localParam) {
 			paramData = localParam->data;
-		
-		Number *fval;
+		}
 		
 		switch(param.paramType) {
 			case GLSLProgramParam::PARAM_Number:
 			{
+				Number *fval;			
 				fval = (Number*)paramData;
 				int paramLocation = glGetUniformLocation(glslShader->shader_id, param.name.c_str());
 				glUniform1f(paramLocation, *fval);
 				break;
 			}
-			case GLSLProgramParam::PARAM_Number2:
+			case GLSLProgramParam::PARAM_Vector2:
 			{
 				Vector2 *fval2 = (Vector2*)paramData;
 				int paramLocation = glGetUniformLocation(glslShader->shader_id, param.name.c_str());
 				glUniform2f(paramLocation, fval2->x, fval2->y);				break;				
 			}			
-			case GLSLProgramParam::PARAM_Number3:
+			case GLSLProgramParam::PARAM_Vector3:
 			{
 				Vector3 *fval3 = (Vector3*)paramData;
 				int paramLocation = glGetUniformLocation(glslShader->shader_id, param.name.c_str());
 				glUniform3f(paramLocation, fval3->x,fval3->y,fval3->z);
 				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) {	
@@ -434,13 +262,6 @@ bool GLSLShaderModule::applyShaderMaterial(Renderer *renderer, Material *materia
 	int lightIndex = 0;
 	
 	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};				
 	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());	
 				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;
 				
 			
@@ -577,9 +393,6 @@ bool GLSLShaderModule::applyShaderMaterial(Renderer *renderer, Material *materia
 				}
 				glUniformMatrix4fv(mloc, 1, false, mat);
 		
-						
-	//			glPopMatrix();
-				
 					
 			}
 			shadowMapTextureIndex++;
@@ -643,174 +456,32 @@ bool GLSLShaderModule::applyShaderMaterial(Renderer *renderer, Material *materia
 		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;
 }
 
-void GLSLShaderModule::addParamToProgram(GLSLProgram *program,TiXmlNode *node) {
+GLSLProgramParam GLSLShaderModule::addParamToProgram(GLSLProgram *program,TiXmlNode *node) {
 		bool isAuto = false;
 		int autoID = 0;
 		int paramType = GLSLProgramParam::PARAM_UNKNOWN;
 		void *defaultData = NULL;
+		void *minData = NULL;
+		void *maxData = NULL;
+		
 		TiXmlElement *nodeElement = node->ToElement();
 		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() {

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

@@ -23,21 +23,30 @@
 #include "PolyMaterial.h"
 #include "PolyLogger.h"
 #include "PolyShader.h"
+#include "PolyRenderer.h"
+#include "PolyCoreServices.h"
 
 using namespace Polycode;
 
 Material::Material(const String& name) : Resource(Resource::RESOURCE_MATERIAL) {
 	this->name = name;
-	specularValue = 75.0;
-	specularStrength = 1.0;
 	fp16RenderTargets = false;
 	shaderModule = NULL;
+	blendingMode = Renderer::BLEND_MODE_NORMAL;
 }
 
 Material::~Material() {
 	
 	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
 /*	
 	for(int i=0; i < materialShaders.size(); i++)	{
@@ -54,12 +63,30 @@ Material::~Material() {
 	for(int i=0; i < renderTargets.size(); i++)	{
 		delete renderTargets[i];
 	}
-	renderTargets.clear();	
+	renderTargets.clear();		
 }
-
+			
 void Material::addShader(Shader *shader,ShaderBinding *shaderBinding) {
 	materialShaders.push_back(shader);
 	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 {
-	return materialShaders[index];
+	if(index < materialShaders.size()) { 
+		return materialShaders[index];
+	} else {
+		return NULL;
+	}
 }
 
 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) {

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

@@ -56,13 +56,6 @@ Texture *MaterialManager::getTextureByResourcePath(const String& resourcePath) c
 	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) {
 	for(int i=0;i < textures.size(); i++) {
 		if(textures[i] == texture) {
@@ -105,15 +98,15 @@ Texture *MaterialManager::createTextureFromFile(const String& fileName, bool cla
 	} else {
 		Logger::log("Error loading image, using default texture.\n");
 		delete image;		
-		newTexture = getTextureByResourcePath("default.png");
+		newTexture = getTextureByResourcePath("default/default.png");
 		return newTexture;
 	}
 		
 	delete image;
 
-	vector<String> bits = fileName.split("/");
+//	vector<String> bits = fileName.split("/");
 	
-	newTexture->setResourcePath(bits[bits.size()-1]);
+	newTexture->setResourcePath(fileName);
 	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) {
@@ -186,6 +190,14 @@ Shader *MaterialManager::createShaderFromXMLNode(TiXmlNode *node) {
 		numSpotLights = atoi(nodeElement->Attribute("numSpotLights"));
 	}
 	
+	retShader->screenShader = false;
+	
+	if(nodeElement->Attribute("screen")) {
+		if(String(nodeElement->Attribute("screen")) == "true") {
+			retShader->screenShader = true;
+		}
+	}
+	
 	if(retShader) {
 		retShader->numAreaLights = numAreaLights;
 		retShader->numSpotLights = numSpotLights;		
@@ -249,6 +261,47 @@ Cubemap *MaterialManager::cubemapFromXMLNode(TiXmlNode *node) {
 	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) {
 	TiXmlElement *nodeElement = node->ToElement();
 	if (!nodeElement) return NULL; // Skip comment nodes
@@ -263,6 +316,11 @@ Material *MaterialManager::materialFromXMLNode(TiXmlNode *node) {
 	vector<ShaderRenderTarget*> renderTargets;	
 
 	Material *newMaterial = new Material(mname);
+	
+	
+	if(nodeElement->Attribute("blendingMode")) {
+		newMaterial->blendingMode = atoi(nodeElement->Attribute("blendingMode"));
+	}
 
 	for (pChild3 = node->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 		TiXmlElement *pChild3Element = pChild3->ToElement();
@@ -317,36 +375,6 @@ Material *MaterialManager::materialFromXMLNode(TiXmlNode *node) {
 	for (pChild3 = node->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
 		TiXmlElement *pChild3Element = pChild3->ToElement();
 		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) {
 			materialShader = setShaderFromXMLNode(pChild3);
@@ -421,7 +449,9 @@ Material *MaterialManager::materialFromXMLNode(TiXmlNode *node) {
 								if(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){

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

@@ -112,10 +112,11 @@ TiXmlElement *Object::createElementFromObjectEntry(ObjectEntry *entry) {
 		case ObjectEntry::STRING_ENTRY: {
 			newElement->LinkEndChild(new TiXmlText( entry->stringVal.c_str() ));
 		} 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];
-				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);
 				
@@ -138,9 +139,7 @@ TiXmlElement *Object::createElementFromObjectEntry(ObjectEntry *entry) {
 						break;
 						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;
 						default:
 							needLinkChild = true;
@@ -153,10 +152,10 @@ TiXmlElement *Object::createElementFromObjectEntry(ObjectEntry *entry) {
 					newElement->LinkEndChild(childElement);
 				}
 			}
-		} break;
-	}
+
 	
 	return newElement;
+
 }
 
 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;
 	setAmbientColor(0.0,0.0,0.0);
 	cullingFrontFaces = false;
+	
 }
 
 Renderer::~Renderer() {
@@ -319,6 +320,28 @@ void Renderer::billboardMatrix() {
 	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) {
 	if(mesh->arrayDirtyMap[arrayType] == true || 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());
 								newShader->setResourceName(newShader->getName());
 								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++) {	
 		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 {
@@ -183,7 +174,7 @@ void ResourceManager::addResource(Resource *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;
 	resourceDir = OSBasics::parseFolder(dirPath, false);
 	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());
 				Texture *t = CoreServices::getInstance()->getMaterialManager()->createTextureFromFile(resourceDir[i].fullPath);
 				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);
 				}
 			}
 		} 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());
 	} 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) {
-	parseTextures(dirPath, recursive);
+	parseTextures(dirPath, recursive, "");
 	parsePrograms(dirPath, recursive);
 	parseShaders(dirPath, recursive);
 	parseCubemaps(dirPath, recursive);	
@@ -246,9 +250,11 @@ Resource *ResourceManager::getResource(int resourceType, const String& resourceN
 			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");
 	// need to add some sort of default resource for each type
 	return NULL;

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

@@ -104,7 +104,18 @@ void SceneMesh::setTexture(Texture *texture) {
 	this->texture = texture;
 }
 
+void SceneMesh::clearMaterial() {
+	if(localShaderOptions)
+		delete localShaderOptions;
+	localShaderOptions = NULL;
+	this->material = NULL;
+}
+
 void SceneMesh::setMaterial(Material *material) {
+
+	if(this->material)
+		clearMaterial();
+	
 	if(!material)
 		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) {
-	width = newWidth;
-	height = newHeight;
-	
-	setHitbox(width, height);
+
+	setWidth(newWidth);
+	setHeight(newHeight);
+
 	
 	Number whalf = floor(width/2.0f);
 	Number hhalf = floor(height/2.0f);
@@ -115,6 +115,8 @@ void ScreenShape::setShapeSize(Number newWidth, Number newHeight) {
 		default:
 		break;
 	}
+	
+		
 	mesh->arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
 	rebuildTransformMatrix();
 	matrixDirty = true;
@@ -168,6 +170,7 @@ void ScreenShape::Render() {
 	ScreenMesh::Render();
 
 	if(strokeEnabled) {
+		renderer->setTexture(NULL);
 		if(lineSmooth) {
 				renderer->setLineSmooth(true);
 		}

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

@@ -29,7 +29,18 @@ ShaderBinding::ShaderBinding(Shader *shader) {
 }
 
 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() {
@@ -56,18 +67,6 @@ void ShaderBinding::addLocalParam(const String& name, void *ptr) {
 	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) {
 	renderTargetBindings.push_back(binding);
 	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 */; };
 		6D6D3FA614B446A600219173 /* PolycodeToolLauncher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D6D3FA514B446A600219173 /* PolycodeToolLauncher.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 */; };
 		6D80E91F12AB53FB0037A708 /* PolycodeIDEApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D80E91A12AB53FB0037A708 /* PolycodeIDEApp.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 */; };
 		6DFE89C314B3FC0900DA7ABD /* libz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DFE89BC14B3FC0900DA7ABD /* libz.a */; };
 		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 */; };
 		8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
 		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>"; };
 		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>"; };
+		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>"; };
 		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>"; };
@@ -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>"; };
 		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>"; };
+		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>"; };
 		8D1107320486CEB800E47090 /* Polycode.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Polycode.app; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
@@ -229,6 +234,7 @@
 		29B97317FDCFA39411CA2CEA /* Resources */ = {
 			isa = PBXGroup;
 			children = (
+				6DFF77A9164090040040AED8 /* hdr.pak */,
 				6DFE89CB14B3FE3D00DA7ABD /* default.pak */,
 				6D8A55B814B3EABB005F6411 /* main_icon.icns */,
 				8D1107310486CEB800E47090 /* Polycode-Info.plist */,
@@ -250,6 +256,7 @@
 		6D80E91212AB53FB0037A708 /* Include */ = {
 			isa = PBXGroup;
 			children = (
+				6D80B0D0163B14D100EF3C04 /* PolycodeMaterialEditor.h */,
 				6DD1835F1628A4D2005A5682 /* PolycodeRemoteDebugger.h */,
 				6D3DC79F16220440003ED2C9 /* PolycodeConsole.h */,
 				6D56156514C542FB00FC8BD4 /* PolycodeScreenEditor.h */,
@@ -278,6 +285,7 @@
 		6D80E91812AB53FB0037A708 /* Source */ = {
 			isa = PBXGroup;
 			children = (
+				6D80B0CD163B14CB00EF3C04 /* PolycodeMaterialEditor.cpp */,
 				6DD1835C1628A4CC005A5682 /* PolycodeRemoteDebugger.cpp */,
 				6D3DC79C1622043A003ED2C9 /* PolycodeConsole.cpp */,
 				6D56156714C5430300FC8BD4 /* PolycodeScreenEditor.cpp */,
@@ -358,6 +366,7 @@
 				1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */,
 				6D8A55B914B3EABB005F6411 /* main_icon.icns in Resources */,
 				6DFE89CC14B3FE3D00DA7ABD /* default.pak in Resources */,
+				6DFF77AA164090040040AED8 /* hdr.pak in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -406,6 +415,7 @@
 				6D56156814C5430300FC8BD4 /* PolycodeScreenEditor.cpp in Sources */,
 				6D3DC79D1622043A003ED2C9 /* PolycodeConsole.cpp in Sources */,
 				6DD1835D1628A4CC005A5682 /* PolycodeRemoteDebugger.cpp in Sources */,
+				6D80B0CE163B14CB00EF3C04 /* PolycodeMaterialEditor.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

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

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

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

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

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

@@ -38,7 +38,14 @@ class PolycodeImageEditor : public PolycodeEditor {
 	protected:
 		ScreenImage *grid;
 	
-		ScreenImage *editorImage;
+		ScreenShape *editorImage;
+		
+		ScreenShape *leftShape;		
+		ScreenShape *rightShape;		
+		ScreenShape *topShape;		
+		ScreenShape *bottomShape;								
+		
+		Number aspectRatio;
 };
 
 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);
 	void Resize(int x, int y);
-	void saveFile();	
+	void saveFile();
 		
 	protected:
 	
@@ -62,6 +62,7 @@ class PolycodeProjectEditor : public PolycodeEditor {
 	UITextInput *entryPointInput;	
 	UIColorBox *bgColorBox;
 	
+	UIColorPicker *colorPicker;
 	
 	PolycodeProject *associatedProject;
 	

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

@@ -41,10 +41,7 @@ class PolycodeProjectManager {
 	void setProjectBrowser(PolycodeProjectBrowser *projectBrowser) { this->projectBrowser = projectBrowser; }
 	
 	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(); }
 	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" ?>
 <polycode_material_library>
-	<shaders>
-	</shaders>
-	<materials>
-	</materials>
 </polycode_material_library>

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


BIN
IDE/Contents/Resources/Fonts/LeagueGothic-CondensedRegular.otf


BIN
IDE/Contents/Resources/Fonts/LeagueGothic-Regular.otf


BIN
IDE/Contents/Resources/Images/box_icon.png


BIN
IDE/Contents/Resources/Images/cubemap_icon.png


BIN
IDE/Contents/Resources/Images/editorGrid.png


BIN
IDE/Contents/Resources/Images/material_bg.png


BIN
IDE/Contents/Resources/Images/material_editor_light.png


BIN
IDE/Contents/Resources/Images/material_grid.png


BIN
IDE/Contents/Resources/Images/material_icon.png


BIN
IDE/Contents/Resources/Images/new_cubemap.png


BIN
IDE/Contents/Resources/Images/new_material.png


BIN
IDE/Contents/Resources/Images/new_screenshader.png


BIN
IDE/Contents/Resources/Images/new_shader.png


BIN
IDE/Contents/Resources/Images/plane_icon.png


BIN
IDE/Contents/Resources/Images/screenshader_icon.png


BIN
IDE/Contents/Resources/Images/shader_icon.png


BIN
IDE/Contents/Resources/Images/small_selector.png


BIN
IDE/Contents/Resources/Images/sphere_icon.png


BIN
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);
 	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);
-	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);
@@ -130,7 +135,7 @@ void NewFileWindow::parseTemplatesIntoTree(UITree *tree, OSFileEntry folder) {
 			data->type = 1;
 			data->templatePath = entry.fullPath;
 			newChild->setUserData(data);
-			if(entry.name == "LUA Source File.lua") {
+			if(entry.name == "Lua Script.lua") {
 				defaultTemplateTree = newChild;
 				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);
 	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);
-	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);
-	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);
-	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->addEventListener(this, UIEvent::CLICK_EVENT);	
 	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);

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

@@ -90,19 +90,20 @@ BackTraceWindow::BackTraceWindow() : UIElement() {
 	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
 	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->setColor(0.0, 0.0, 0.0, 0.35);
 	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);
-	label->setPosition(5,2);
+	label->setPosition(5,0);
 	
 }	
 
 void BackTraceWindow::Resize(Number width, Number height) {
-	labelBg->setShapeSize(width, 20);
+	labelBg->setShapeSize(width, 30);
 	this->width = width;
 	this->height = height;	
 	adjustEntries();
@@ -111,7 +112,7 @@ void BackTraceWindow::Resize(Number width, Number height) {
 void BackTraceWindow::adjustEntries() {
 	for(int i=0; i < entries.size(); i++) {
 		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);
 	grid->snapToPixels = true;
@@ -45,7 +45,7 @@ bool PolycodeFontEditor::openFile(OSFileEntry filePath) {
 	grid->getTexture()->recreateFromImageData();	
 	
 //	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->setPosition(-50,-50);
 	

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

@@ -46,7 +46,7 @@ PolycodeFrame::PolycodeFrame() : ScreenEntity() {
 	welcomeEntity = new ScreenEntity();
 	welcomeEntity->processInputEvents = true;
 	addChild(welcomeEntity);
-	welcomeImage = new ScreenImage("welcome.png");
+	welcomeImage = new ScreenImage("Images/welcome.png");
 	welcomeEntity->addChild(welcomeImage);
 	welcomeEntity->snapToPixels = true;
 	
@@ -86,20 +86,20 @@ PolycodeFrame::PolycodeFrame() : ScreenEntity() {
 	topBarBg->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
 	addChild(topBarBg);
 	
-	logo = new ScreenImage("barlogo.png");	
+	logo = new ScreenImage("Images/barlogo.png");	
 	addChild(logo);		
 	
 	
-	playButton = new UIImageButton("play_button.png");
+	playButton = new UIImageButton("Images/play_button.png");
 	addChild(playButton);
 	playButton->setPosition(10,8);
 
-	stopButton = new UIImageButton("stop_button.png");
+	stopButton = new UIImageButton("Images/stop_button.png");
 	addChild(stopButton);
 	stopButton->setPosition(10,8);
 
 	
-	resizer = new ScreenImage("corner_resize.png");	
+	resizer = new ScreenImage("Images/corner_resize.png");	
 	addChild(resizer);
 	resizer->setColor(0,0,0,0.4);
 	
@@ -186,8 +186,8 @@ void PolycodeFrame::handleEvent(Event *event) {
 				if(isDragging) {
 					if(editorHolder->currentEditor) {
 						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);
 					}
 				}

+ 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()->addDirResource("default");	
 
+	CoreServices::getInstance()->getResourceManager()->addArchive("hdr.pak");
+	CoreServices::getInstance()->getResourceManager()->addDirResource("hdr");	
+
+
 	CoreServices::getInstance()->getResourceManager()->addArchive("api.pak");
 
 	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"); 
 	
@@ -72,12 +80,13 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 	frame->getProjectBrowser()->addEventListener(this, PolycodeProjectBrowserEvent::SHOW_MENU);
 	
 	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);
 	frame->console->setDebugger(debugger);
 	
 	editorManager->registerEditorFactory(new PolycodeImageEditorFactory());
+	editorManager->registerEditorFactory(new PolycodeMaterialEditorFactory());	
 	editorManager->registerEditorFactory(new PolycodeScreenEditorFactory());	
 	editorManager->registerEditorFactory(new PolycodeFontEditorFactory());
 	editorManager->registerEditorFactory(new PolycodeTextEditorFactory());
@@ -229,6 +238,7 @@ void PolycodeIDEApp::openFile(OSFileEntry file) {
 	} else {
 		editor = editorManager->createEditorForExtension(file.extension);
 		if(editor) {
+			editor->parentProject = projectManager->getActiveProject();
 			if(editor->openFile(file)) {
 				frame->addEditor(editor);					
 				frame->showEditor(editor);

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

@@ -32,16 +32,50 @@ PolycodeImageEditor::~PolycodeImageEditor() {
 
 bool PolycodeImageEditor::openFile(OSFileEntry filePath) {
 	
-	grid = new ScreenImage("editorGrid.png");
+	grid = new ScreenImage("Images/editorGrid.png");
 	
 	addChild(grid);
 	grid->snapToPixels = true;
 	
 	grid->getTexture()->clamp = false;
 	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);
 	
 	PolycodeEditor::openFile(filePath);
@@ -49,8 +83,26 @@ bool PolycodeImageEditor::openFile(OSFileEntry filePath) {
 }
 
 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);	
+	
+	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);
 }
 

+ 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;
 	
 	ObjectEntry *color = configFile.root["backgroundColor"];
+	
 	(*color)["red"]->NumberVal = data.backgroundColorR;
+	(*color)["red"]->type = ObjectEntry::FLOAT_ENTRY;
+	
 	(*color)["green"]->NumberVal = data.backgroundColorG;
+	(*color)["green"]->type = ObjectEntry::FLOAT_ENTRY;
+		
 	(*color)["blue"]->NumberVal = data.backgroundColorB;
-
+	(*color)["blue"]->type = ObjectEntry::FLOAT_ENTRY;
 
 	if(configFile.root["modules"]) {
 		configFile.root["modules"]->Clear();

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

@@ -38,7 +38,7 @@ PolycodeProjectEditor::PolycodeProjectEditor(PolycodeProjectManager *projectMana
 
 	this->projectManager = projectManager;
 
-	grid = new ScreenImage("editorGrid.png");
+	grid = new ScreenImage("Images/editorGrid.png");
 	
 	addChild(grid);
 	grid->snapToPixels = true;
@@ -77,10 +77,10 @@ PolycodeProjectEditor::PolycodeProjectEditor(PolycodeProjectManager *projectMana
 	mainSettingsWindow->setPosition(10,10);
 	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);
-	label2->setPosition(padding, 50);		
+	label2->setPosition(padding, 40);		
 
 		
 	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);
 	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);
-	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);
@@ -161,9 +161,15 @@ PolycodeProjectEditor::PolycodeProjectEditor(PolycodeProjectManager *projectMana
 	mainSettingsWindow->addChild(label2);
 	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());
 	mainSettingsWindow->addChild(bgColorBox);
+	
+	
 
 }
 

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

@@ -87,6 +87,18 @@ PolycodeProject *PolycodeProjectManager::getProjectByProjectFile(String projectF
 	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) {
 	if(activeFolder == "")
 		return;

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

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

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

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

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

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

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

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

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

@@ -58,7 +58,9 @@ namespace Polycode {
 			bool closeOnEscape;
 		
 		protected:				
-
+			
+			Number closeIconX;
+			Number closeIconY;
 		
 			Font *font;
 			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()));
 				
 	colorAlpha = 1.0;
+	
+	visible = false;
+	enabled = false;
+	
+}
+
+void UIColorPicker::cancelColorListeners() {
+	dispatchEvent(new Event(), Event::CANCEL_EVENT);
 }
 
 void UIColorPicker::onClose() {
@@ -368,7 +376,7 @@ void UIColorPicker::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();	
 
@@ -400,45 +408,56 @@ UIColorBox::UIColorBox(Color initialColor, Number width, Number height) : UIElem
 	frameImage = new UIBox(frameImageFile, st,sr,sb,sl, width, height);	
 	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->height = height;
 	
-	setBoxColor(initialColor);
+	selectedColor = initialColor;
+	colorShape->color = selectedColor;	
+			
+	listeningToPicker = false;
 }
 
 Color UIColorBox::getSelectedColor() {
-	return colorPicker->getSelectedColor();
+	return selectedColor;
 }
 
 UIColorBox::~UIColorBox() {
-
+	colorPicker->removeAllHandlersForListener(this);
 }
 
 void UIColorBox::setBoxColor(Color newColor) {
-	colorPicker->setPickerColor(newColor);
+	selectedColor = newColor;
+	colorShape->color = selectedColor;
+	if(listeningToPicker) {
+		colorPicker->setPickerColor(newColor);	
+	}
 }
 
 void UIColorBox::showColorPicker() {
 	colorPicker->visible = true;
 	colorPicker->enabled = true;
+	colorPicker->cancelColorListeners();
+	colorPicker->setPickerColor(selectedColor);
+	listeningToPicker = true;
 }
 		
 void UIColorBox::handleEvent(Event *event) {
 
-	if(event->getDispatcher() == colorPicker) {
+	if(event->getDispatcher() == colorPicker && event->getEventType() == "Event") {
 		switch(event->getEventCode()) {
+			case Event::CANCEL_EVENT:
+				listeningToPicker = false;
+			break;
 			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;
 		}		
 	}

+ 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);
+	newItem->data = data;
 	items.push_back(newItem);
 	dropDownBox->addChild(newItem);
 	newItem->setPosition(0,nextItemHeight);
@@ -140,6 +141,14 @@ int UIComboBox::addComboItem(String itemName) {
 	return items.size()-1;
 }
 
+UIComboBoxItem *UIComboBox::getSelectedItem() {
+	if(selectedIndex < items.size()) {
+		return items[selectedIndex];
+	} else {
+		return NULL;
+	}
+}
+
 void UIComboBox::toggleDropDown() {
 	isDroppedDown = !isDroppedDown;
 	updateVis();
@@ -158,8 +167,19 @@ void UIComboBox::setSelectedIndex(unsigned int newIndex) {
 	if(newIndex < items.size()) {
 		selectedIndex = newIndex;				
 		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) {
 
@@ -178,10 +198,7 @@ void UIComboBox::handleEvent(Event *event) {
 			break;
 			case InputEvent::EVENT_MOUSEDOWN:
 			{
-				selectedIndex = selectedOffset;				
-				selectedLabel->setText(items[selectedIndex]->label);				
-				isDroppedDown = false;
-				updateVis();				
+				setSelectedIndex(selectedOffset);
 			}
 			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() {
 	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"));
 	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_OUTSIDE);	
 	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) {
-//	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() {