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

Added two new default shaders, fixed up particle systems, binding generation will now include public class members that are not pointers.

Ivan Safrin 14 лет назад
Родитель
Сommit
0ea079f5f6
36 измененных файлов с 2365 добавлено и 1309 удалено
  1. BIN
      Assets/Default asset pack/default.pak
  2. 103 0
      Assets/Default asset pack/default/DefaultParticleShader.frag
  3. 11 0
      Assets/Default asset pack/default/DefaultParticleShader.vert
  4. 1 1
      Assets/Default asset pack/default/DefaultShader.frag
  5. 1 1
      Assets/Default asset pack/default/DefaultShaderShadows.frag
  6. 1 0
      Assets/Default asset pack/default/DefaultShaderVertex.vert
  7. 9 0
      Assets/Default asset pack/default/Unlit.frag
  8. 8 0
      Assets/Default asset pack/default/Unlit.vert
  9. 21 1
      Assets/Default asset pack/default/default.mat
  10. 336 346
      Bindings/Build/Mac OS X/Bindings.xcodeproj/project.xcworkspace/xcuserdata/ivansafrin.xcuserdatad/UserInterfaceState.xcuserstate
  11. 27 0
      Bindings/Contents/LUA/API/Polycode/Bone.lua
  12. 105 0
      Bindings/Contents/LUA/API/Polycode/BoneTrack.lua
  13. 18 0
      Bindings/Contents/LUA/API/Polycode/Entity.lua
  14. 27 0
      Bindings/Contents/LUA/API/Polycode/InputEvent.lua
  15. 30 3
      Bindings/Contents/LUA/API/Polycode/Particle.lua
  16. 97 26
      Bindings/Contents/LUA/API/Polycode/ParticleEmitter.lua
  17. 28 1
      Bindings/Contents/LUA/API/Polycode/Renderer.lua
  18. 28 1
      Bindings/Contents/LUA/API/Polycode/Scene.lua
  19. 15 0
      Bindings/Contents/LUA/API/Polycode/SceneLight.lua
  20. 10 1
      Bindings/Contents/LUA/API/Polycode/SceneMesh.lua
  21. 11 0
      Bindings/Contents/LUA/API/Polycode/SceneParticleEmitter.lua
  22. 11 0
      Bindings/Contents/LUA/API/Polycode/ScreenParticleEmitter.lua
  23. 9 0
      Bindings/Contents/LUA/API/Polycode/ScreenShape.lua
  24. 24 0
      Bindings/Contents/LUA/API/Polycode/String.lua
  25. 37 1
      Bindings/Contents/LUA/API/Polycode/Vertex.lua
  26. 442 93
      Bindings/Contents/LUA/Include/PolycodeLUAWrappers.h
  27. 52 6
      Bindings/Contents/LUA/Source/PolycodeLUA.cpp
  28. 104 67
      Bindings/Scripts/create_lua_library/create_lua_library.py
  29. 406 184
      Core/Build/Mac OS X/PolyCore.xcodeproj/project.xcworkspace/xcuserdata/ivansafrin.xcuserdatad/UserInterfaceState.xcuserstate
  30. 8 5
      Core/Contents/Include/PolyMesh.h
  31. 3 1
      Core/Contents/Include/PolyParticle.h
  32. 15 20
      Core/Contents/Include/PolyParticleEmitter.h
  33. 37 6
      Core/Contents/Source/PolyParticle.cpp
  34. 41 52
      Core/Contents/Source/PolyParticleEmitter.cpp
  35. 2 2
      Core/Contents/Source/PolyScene.cpp
  36. 287 491
      Player/Build/Mac OS X/Polycode Player.xcodeproj/project.xcworkspace/xcuserdata/ivansafrin.xcuserdatad/UserInterfaceState.xcuserstate

BIN
Assets/Default asset pack/default.pak


+ 103 - 0
Assets/Default asset pack/default/DefaultParticleShader.frag

@@ -0,0 +1,103 @@
+float calculateAttenuation(in int i, in float dist)
+{
+    return(1.0 / (gl_LightSource[i].constantAttenuation +
+                  gl_LightSource[i].linearAttenuation * dist +
+                  gl_LightSource[i].quadraticAttenuation * dist * dist));
+}
+
+void pointLight(in int i, in vec3 N, in vec3 V, in float shininess,
+                inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
+{
+    vec3 D = gl_LightSource[i].position.xyz - V;
+    vec3 L = normalize(D);
+
+    float dist = length(D);
+    float attenuation = calculateAttenuation(i, dist);
+
+    float nDotL = 1.0; //dot(N,L);
+
+    if (nDotL > 0.0)
+    {   
+        vec3 E = normalize(-V);
+        vec3 R = reflect(-L, N);
+       
+        float pf = pow(max(dot(R,E), 0.0), shininess);
+
+        diffuse  += gl_LightSource[i].diffuse  * attenuation * nDotL;
+        specular += gl_LightSource[i].specular * attenuation * pf;
+    }
+   
+    ambient  += gl_LightSource[i].ambient * attenuation;
+}
+
+void spotLight(in int i, in vec3 N, in vec3 V, in float shininess,
+               inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
+{
+    vec3 D = gl_LightSource[i].position.xyz - V;
+    vec3 L = normalize(D);
+
+    float dist = length(D);
+    float attenuation = calculateAttenuation(i, dist);
+	
+    float nDotL = dot(N,L);	
+    if (nDotL > 0.0)
+    {   
+        float spotEffect = dot(normalize(gl_LightSource[i].spotDirection), -L);
+       
+        if (spotEffect > gl_LightSource[i].spotCosCutoff)
+        {
+            attenuation *=  pow(spotEffect, gl_LightSource[i].spotExponent);
+
+            vec3 E = normalize(-V);
+            vec3 R = reflect(-L, N);
+       
+            float pf = pow(max(dot(R,E), 0.0), shininess);
+
+            diffuse  += gl_LightSource[i].diffuse  * attenuation * nDotL;
+            specular += gl_LightSource[i].specular * attenuation * pf;
+        }
+    }
+   
+    ambient  += gl_LightSource[i].ambient * attenuation;
+}
+
+void calculateLighting(in int numLights, in vec3 N, in vec3 V, in float shininess,
+                       inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
+{
+    // Just loop through each light, and if its enabled add
+    // its contributions to the color of the pixel.
+    for (int i = 0; i < numLights; i++)
+    {
+		if (gl_LightSource[i].spotCutoff == 180.0)
+                pointLight(i, N, V, shininess, ambient, diffuse, specular);
+            else
+                 spotLight(i, N, V, shininess, ambient, diffuse, specular);
+
+    }
+}
+
+uniform sampler2D diffuse;
+varying vec3 normal;
+varying vec3 vertex;
+varying vec4 vertexColor;
+
+void main()
+{
+    vec3 n = normalize(normal);
+   
+    vec4 ambient_c  = vec4(0.0);
+    vec4 diffuse_c  = vec4(0.0);
+    vec4 specular_c = vec4(0.0);
+
+    calculateLighting(6, n, vertex, gl_FrontMaterial.shininess, ambient_c, diffuse_c, specular_c);
+   
+	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);
+    
+    vec4 color = gl_FrontLightModelProduct.sceneColor  +
+                 (ambient_c  * 1.0) +
+                 (diffuse_c  * 1.0) +
+                 (specular_c * 1.0);
+	color.a = 1.0;
+    color = clamp(color*texColor*vertexColor, 0.0, 1.0);
+    gl_FragColor = color;
+}

+ 11 - 0
Assets/Default asset pack/default/DefaultParticleShader.vert

@@ -0,0 +1,11 @@
+varying vec3 normal;
+varying vec3 vertex;
+varying vec4 vertexColor;
+void main()
+{
+    gl_TexCoord[0] = gl_MultiTexCoord0;		
+    normal = normalize(gl_NormalMatrix * gl_Normal);   
+    vertex = vec3(gl_ModelViewMatrix * gl_Vertex);     
+    vertexColor = gl_Color;
+    gl_Position = ftransform();
+}

+ 1 - 1
Assets/Default asset pack/default/DefaultShader.frag

@@ -98,7 +98,7 @@ void main()
                  (ambient_c  * 1.0) +
                  (diffuse_c  * 1.0) +
                  (specular_c * 1.0);
+	color.a = 1.0;				 
     color = clamp(color*texColor*vertexColor, 0.0, 1.0);
-    color.a = vertexColor.a;
     gl_FragColor = color;
 }

+ 1 - 1
Assets/Default asset pack/default/DefaultShaderShadows.frag

@@ -124,8 +124,8 @@ void main()
                  (ambient_c  * 1.0) +
                  (diffuse_c  * 1.0) +
                  (specular_c * 1.0);
+	color.a = 1.0;				 
     color = clamp(color*texColor*vertexColor, 0.0, 1.0);
-    color.a = vertexColor.a;
     gl_FragColor = color;
 
 }

+ 1 - 0
Assets/Default asset pack/default/DefaultShaderVertex.vert

@@ -95,6 +95,7 @@ void main()
                  (ambient_c  * 1.0) +
                  (diffuse_c  * 1.0) +
                  (specular_c * 1.0);
+	color.a = 1.0;				 
     color = clamp(color*gl_Color, 0.0, 1.0);
    vertexColor = color;    
 }

+ 9 - 0
Assets/Default asset pack/default/Unlit.frag

@@ -0,0 +1,9 @@
+
+uniform sampler2D diffuse;
+varying vec4 vertexColor;
+
+void main()
+{
+	vec4 texColor = texture2D(diffuse, gl_TexCoord[0].st);
+    gl_FragColor = texColor*vertexColor;
+}

+ 8 - 0
Assets/Default asset pack/default/Unlit.vert

@@ -0,0 +1,8 @@
+
+varying vec4 vertexColor;
+void main()
+{
+    gl_TexCoord[0] = gl_MultiTexCoord0;		
+    vertexColor = gl_Color;
+    gl_Position = ftransform();
+}

+ 21 - 1
Assets/Default asset pack/default/default.mat

@@ -50,7 +50,27 @@
 				<params>			
 				</params>				
 			</fp>
-		</shader>		
+		</shader>	
+		<shader type="glsl" name="DefaultParticleShader" numAreaLights="4" numSpotLights="2">		
+			<vp source="DefaultParticleShader.vert">
+				<params>			
+				</params>				
+			</vp>
+			<fp source="DefaultParticleShader.frag">
+				<params>			
+				</params>				
+			</fp>
+		</shader>	
+		<shader type="glsl" name="Unlit" numAreaLights="0" numSpotLights="0">		
+			<vp source="Unlit.vert">
+				<params>			
+				</params>				
+			</vp>
+			<fp source="Unlit.frag">
+				<params>			
+				</params>				
+			</fp>
+		</shader>										
 	</shaders>
 	<materials>
 		<material name="Default">

Разница между файлами не показана из-за своего большого размера
+ 336 - 346
Bindings/Build/Mac OS X/Bindings.xcodeproj/project.xcworkspace/xcuserdata/ivansafrin.xcuserdatad/UserInterfaceState.xcuserstate


+ 27 - 0
Bindings/Contents/LUA/API/Polycode/Bone.lua

@@ -7,6 +7,33 @@ class "Bone" (SceneEntity)
 function Bone:__index__(name)
 	if name == "parentBoneId" then
 		return Polycore.Bone_get_parentBoneId(self.__ptr)
+	elseif name == "boneMatrix" then
+		retVal = Polycore.Bone_get_boneMatrix(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Matrix4("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "restMatrix" then
+		retVal = Polycore.Bone_get_restMatrix(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Matrix4("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "baseMatrix" then
+		retVal = Polycore.Bone_get_baseMatrix(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Matrix4("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
 	end
 end
 

+ 105 - 0
Bindings/Contents/LUA/API/Polycode/BoneTrack.lua

@@ -2,8 +2,113 @@ class "BoneTrack"
 
 
 
+function BoneTrack:__index__(name)
+	if name == "LocXVec" then
+		retVal = Polycore.BoneTrack_get_LocXVec(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "LocYVec" then
+		retVal = Polycore.BoneTrack_get_LocYVec(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "LocZVec" then
+		retVal = Polycore.BoneTrack_get_LocZVec(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "ScaleXVec" then
+		retVal = Polycore.BoneTrack_get_ScaleXVec(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "ScaleYVec" then
+		retVal = Polycore.BoneTrack_get_ScaleYVec(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "ScaleZVec" then
+		retVal = Polycore.BoneTrack_get_ScaleZVec(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "boneQuat" then
+		retVal = Polycore.BoneTrack_get_boneQuat(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Quaternion("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "QuatWVec" then
+		retVal = Polycore.BoneTrack_get_QuatWVec(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "QuatXVec" then
+		retVal = Polycore.BoneTrack_get_QuatXVec(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "QuatYVec" then
+		retVal = Polycore.BoneTrack_get_QuatYVec(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "QuatZVec" then
+		retVal = Polycore.BoneTrack_get_QuatZVec(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	end
+end
 
 
+function BoneTrack:__set_callback(name,value)
+	return false
+end
 
 
 function BoneTrack:BoneTrack(...)

+ 18 - 0
Bindings/Contents/LUA/API/Polycode/Entity.lua

@@ -15,6 +15,15 @@ function Entity:__index__(name)
 		return Polycore.Entity_get_backfaceCulled(self.__ptr)
 	elseif name == "renderWireframe" then
 		return Polycore.Entity_get_renderWireframe(self.__ptr)
+	elseif name == "color" then
+		retVal = Polycore.Entity_get_color(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Color("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
 	elseif name == "enabled" then
 		return Polycore.Entity_get_enabled(self.__ptr)
 	elseif name == "visible" then
@@ -29,6 +38,15 @@ function Entity:__index__(name)
 		return Polycore.Entity_get_colorAffectsChildren(self.__ptr)
 	elseif name == "depthOnly" then
 		return Polycore.Entity_get_depthOnly(self.__ptr)
+	elseif name == "bBox" then
+		retVal = Polycore.Entity_get_bBox(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
 	elseif name == "ignoreParentMatrix" then
 		return Polycore.Entity_get_ignoreParentMatrix(self.__ptr)
 	elseif name == "isMask" then

+ 27 - 0
Bindings/Contents/LUA/API/Polycode/InputEvent.lua

@@ -18,6 +18,33 @@ EVENT_KEYUP = 14
 function InputEvent:__index__(name)
 	if name == "mouseButton" then
 		return Polycore.InputEvent_get_mouseButton(self.__ptr)
+	elseif name == "mousePosition" then
+		retVal = Polycore.InputEvent_get_mousePosition(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector2("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "key" then
+		retVal = Polycore.InputEvent_get_key(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = PolyKEY("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "charCode" then
+		retVal = Polycore.InputEvent_get_charCode(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = wchar_t("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
 	elseif name == "timestamp" then
 		return Polycore.InputEvent_get_timestamp(self.__ptr)
 	end

+ 30 - 3
Bindings/Contents/LUA/API/Polycode/Particle.lua

@@ -5,7 +5,34 @@ class "Particle"
 BILLBOARD_PARTICLE = 0
 MESH_PARTICLE = 1
 function Particle:__index__(name)
-	if name == "life" then
+	if name == "velVector" then
+		retVal = Polycore.Particle_get_velVector(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "dirVector" then
+		retVal = Polycore.Particle_get_dirVector(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "deviation" then
+		retVal = Polycore.Particle_get_deviation(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "life" then
 		return Polycore.Particle_get_life(self.__ptr)
 	elseif name == "lifespan" then
 		return Polycore.Particle_get_lifespan(self.__ptr)
@@ -63,8 +90,8 @@ function Particle:Reset(continuious)
 	local retVal = Polycore.Particle_Reset(self.__ptr, continuious)
 end
 
-function Particle:createSceneParticle(particleType, texture, particleMesh)
-	local retVal = Polycore.Particle_createSceneParticle(self.__ptr, particleType, texture.__ptr, particleMesh.__ptr)
+function Particle:createSceneParticle(particleType, material, particleMesh)
+	local retVal = Polycore.Particle_createSceneParticle(self.__ptr, particleType, material.__ptr, particleMesh.__ptr)
 end
 
 function Particle:createScreenParticle(particleType, texture, particleMesh)

+ 97 - 26
Bindings/Contents/LUA/API/Polycode/ParticleEmitter.lua

@@ -4,16 +4,91 @@ class "ParticleEmitter"
 
 CONTINUOUS_EMITTER = 0
 TRIGGERED_EMITTER = 1
-CLOUD_EMITTER = 2
 function ParticleEmitter:__index__(name)
 	if name == "particleSpeedMod" then
 		return Polycore.ParticleEmitter_get_particleSpeedMod(self.__ptr)
 	elseif name == "brightnessDeviation" then
 		return Polycore.ParticleEmitter_get_brightnessDeviation(self.__ptr)
+	elseif name == "deviation" then
+		retVal = Polycore.ParticleEmitter_get_deviation(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "dirVector" then
+		retVal = Polycore.ParticleEmitter_get_dirVector(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "gravVector" then
+		retVal = Polycore.ParticleEmitter_get_gravVector(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
 	elseif name == "lifespan" then
 		return Polycore.ParticleEmitter_get_lifespan(self.__ptr)
 	elseif name == "rotationFollowsPath" then
 		return Polycore.ParticleEmitter_get_rotationFollowsPath(self.__ptr)
+	elseif name == "scaleCurve" then
+		retVal = Polycore.ParticleEmitter_get_scaleCurve(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = BezierCurve("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "colorCurveR" then
+		retVal = Polycore.ParticleEmitter_get_colorCurveR(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = BezierCurve("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "colorCurveG" then
+		retVal = Polycore.ParticleEmitter_get_colorCurveG(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = BezierCurve("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "colorCurveB" then
+		retVal = Polycore.ParticleEmitter_get_colorCurveB(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = BezierCurve("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "colorCurveA" then
+		retVal = Polycore.ParticleEmitter_get_colorCurveA(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = BezierCurve("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "useColorCurves" then
+		return Polycore.ParticleEmitter_get_useColorCurves(self.__ptr)
+	elseif name == "useScaleCurves" then
+		return Polycore.ParticleEmitter_get_useScaleCurves(self.__ptr)
 	end
 end
 
@@ -31,11 +106,31 @@ function ParticleEmitter:__set_callback(name,value)
 	elseif name == "rotationFollowsPath" then
 		Polycore.ParticleEmitter_set_rotationFollowsPath(self.__ptr, value)
 		return true
+	elseif name == "useColorCurves" then
+		Polycore.ParticleEmitter_set_useColorCurves(self.__ptr, value)
+		return true
+	elseif name == "useScaleCurves" then
+		Polycore.ParticleEmitter_set_useScaleCurves(self.__ptr, value)
+		return true
 	end
 	return false
 end
 
 
+function ParticleEmitter:ParticleEmitter(...)
+	for k,v in pairs(arg) do
+		if type(v) == "table" then
+			if v.__ptr ~= nil then
+				arg[k] = v.__ptr
+			end
+		end
+	end
+	if self.__ptr == nil and arg[1] ~= "__skip_ptr__" then
+		self.__ptr = Polycore.ParticleEmitter(unpack(arg))
+		Polycore.__ptr_lookup[self.__ptr] = self
+	end
+end
+
 function ParticleEmitter:createParticles()
 	local retVal =  Polycore.ParticleEmitter_createParticles(self.__ptr)
 end
@@ -44,14 +139,6 @@ function ParticleEmitter:setRotationSpeed(speed)
 	local retVal = Polycore.ParticleEmitter_setRotationSpeed(self.__ptr, speed)
 end
 
-function ParticleEmitter:setStartingColor(c)
-	local retVal = Polycore.ParticleEmitter_setStartingColor(self.__ptr, c.__ptr)
-end
-
-function ParticleEmitter:setEndingColor(c)
-	local retVal = Polycore.ParticleEmitter_setEndingColor(self.__ptr, c.__ptr)
-end
-
 function ParticleEmitter:setParticleBlendingMode(mode)
 	local retVal = Polycore.ParticleEmitter_setParticleBlendingMode(self.__ptr, mode)
 end
@@ -86,23 +173,7 @@ function ParticleEmitter:emitterEnabled()
 end
 
 function ParticleEmitter:setEmitterRadius(rad)
-	local retVal = Polycore.ParticleEmitter_setEmitterRadius(self.__ptr, rad)
-end
-
-function ParticleEmitter:setStartingScaleModifier(mod)
-	local retVal = Polycore.ParticleEmitter_setStartingScaleModifier(self.__ptr, mod)
-end
-
-function ParticleEmitter:setEndingScaleModifier(mod)
-	local retVal = Polycore.ParticleEmitter_setEndingScaleModifier(self.__ptr, mod)
-end
-
-function ParticleEmitter:setEmitRotationVector(rotVector)
-	local retVal = Polycore.ParticleEmitter_setEmitRotationVector(self.__ptr, rotVector.__ptr)
-end
-
-function ParticleEmitter:setEmitRotationDeviance(rotVector)
-	local retVal = Polycore.ParticleEmitter_setEmitRotationDeviance(self.__ptr, rotVector.__ptr)
+	local retVal = Polycore.ParticleEmitter_setEmitterRadius(self.__ptr, rad.__ptr)
 end
 
 function ParticleEmitter:setAllAtOnce(val)

+ 28 - 1
Bindings/Contents/LUA/API/Polycode/Renderer.lua

@@ -15,8 +15,35 @@ DEPTH_FUNCTION_LEQUAL = 1
 TEX_FILTERING_NEAREST = 0
 TEX_FILTERING_LINEAR = 1
 function Renderer:__index__(name)
-	if name == "exposureLevel" then
+	if name == "ambientColor" then
+		retVal = Polycore.Renderer_get_ambientColor(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Color("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "clearColor" then
+		retVal = Polycore.Renderer_get_clearColor(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Color("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "exposureLevel" then
 		return Polycore.Renderer_get_exposureLevel(self.__ptr)
+	elseif name == "cameraPosition" then
+		retVal = Polycore.Renderer_get_cameraPosition(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
 	end
 end
 

+ 28 - 1
Bindings/Contents/LUA/API/Polycode/Scene.lua

@@ -10,8 +10,35 @@ ENTITY_CAMERA = 2
 ENTITY_ENTITY = 3
 ENTITY_COLLMESH = 4
 function Scene:__index__(name)
-	if name == "useClearColor" then
+	if name == "clearColor" then
+		retVal = Polycore.Scene_get_clearColor(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Color("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "useClearColor" then
 		return Polycore.Scene_get_useClearColor(self.__ptr)
+	elseif name == "ambientColor" then
+		retVal = Polycore.Scene_get_ambientColor(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Color("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "fogColor" then
+		retVal = Polycore.Scene_get_fogColor(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Color("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
 	elseif name == "enabled" then
 		return Polycore.Scene_get_enabled(self.__ptr)
 	end

+ 15 - 0
Bindings/Contents/LUA/API/Polycode/SceneLight.lua

@@ -6,8 +6,23 @@ class "SceneLight" (SceneEntity)
 
 AREA_LIGHT = 0
 SPOT_LIGHT = 1
+function SceneLight:__index__(name)
+	if name == "lightColor" then
+		retVal = Polycore.SceneLight_get_lightColor(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Color("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	end
+end
 
 
+function SceneLight:__set_callback(name,value)
+	return false
+end
 
 
 function SceneLight:SceneLight(...)

+ 10 - 1
Bindings/Contents/LUA/API/Polycode/SceneMesh.lua

@@ -5,7 +5,16 @@ class "SceneMesh" (SceneEntity)
 
 
 function SceneMesh:__index__(name)
-	if name == "showVertexNormals" then
+	if name == "lightmapIndex" then
+		retVal = Polycore.SceneMesh_get_lightmapIndex(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = unsigned int("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "showVertexNormals" then
 		return Polycore.SceneMesh_get_showVertexNormals(self.__ptr)
 	end
 end

+ 11 - 0
Bindings/Contents/LUA/API/Polycode/SceneParticleEmitter.lua

@@ -28,6 +28,17 @@ function SceneParticleEmitter:SceneParticleEmitter(...)
 	end
 end
 
+function SceneParticleEmitter:getEmitter()
+	local retVal =  Polycore.SceneParticleEmitter_getEmitter(self.__ptr)
+	if Polycore.__ptr_lookup[retVal] ~= nil then
+		return Polycore.__ptr_lookup[retVal]
+	else
+		Polycore.__ptr_lookup[retVal] = ParticleEmitter("__skip_ptr__")
+		Polycore.__ptr_lookup[retVal].__ptr = retVal
+		return Polycore.__ptr_lookup[retVal]
+	end
+end
+
 function SceneParticleEmitter:addParticleBody(particleBody)
 	local retVal = Polycore.SceneParticleEmitter_addParticleBody(self.__ptr, particleBody.__ptr)
 end

+ 11 - 0
Bindings/Contents/LUA/API/Polycode/ScreenParticleEmitter.lua

@@ -28,6 +28,17 @@ function ScreenParticleEmitter:ScreenParticleEmitter(...)
 	end
 end
 
+function ScreenParticleEmitter:getEmitter()
+	local retVal =  Polycore.ScreenParticleEmitter_getEmitter(self.__ptr)
+	if Polycore.__ptr_lookup[retVal] ~= nil then
+		return Polycore.__ptr_lookup[retVal]
+	else
+		Polycore.__ptr_lookup[retVal] = ParticleEmitter("__skip_ptr__")
+		Polycore.__ptr_lookup[retVal].__ptr = retVal
+		return Polycore.__ptr_lookup[retVal]
+	end
+end
+
 function ScreenParticleEmitter:addParticleBody(particleBody)
 	local retVal = Polycore.ScreenParticleEmitter_addParticleBody(self.__ptr, particleBody.__ptr)
 end

+ 9 - 0
Bindings/Contents/LUA/API/Polycode/ScreenShape.lua

@@ -10,6 +10,15 @@ SHAPE_CUSTOM = 4
 function ScreenShape:__index__(name)
 	if name == "strokeEnabled" then
 		return Polycore.ScreenShape_get_strokeEnabled(self.__ptr)
+	elseif name == "strokeColor" then
+		retVal = Polycore.ScreenShape_get_strokeColor(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Color("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
 	elseif name == "lineSmooth" then
 		return Polycore.ScreenShape_get_lineSmooth(self.__ptr)
 	end

+ 24 - 0
Bindings/Contents/LUA/API/Polycode/String.lua

@@ -3,8 +3,32 @@ class "String"
 
 
 ENCODING_UTF8 = 0
+function String:__index__(name)
+	if name == "contents" then
+		retVal = Polycore.String_get_contents(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = wstring("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "s_contents" then
+		retVal = Polycore.String_get_s_contents(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = string("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	end
+end
 
 
+function String:__set_callback(name,value)
+	return false
+end
 
 
 function String:String(...)

+ 37 - 1
Bindings/Contents/LUA/API/Polycode/Vertex.lua

@@ -5,7 +5,43 @@ class "Vertex" (Vector3)
 
 
 function Vertex:__index__(name)
-	if name == "useVertexColor" then
+	if name == "restNormal" then
+		retVal = Polycore.Vertex_get_restNormal(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "restPosition" then
+		retVal = Polycore.Vertex_get_restPosition(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "normal" then
+		retVal = Polycore.Vertex_get_normal(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Vector3("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "vertexColor" then
+		retVal = Polycore.Vertex_get_vertexColor(self.__ptr)
+		if Polycore.__ptr_lookup[retVal] ~= nil then
+			return Polycore.__ptr_lookup[retVal]
+		else
+			Polycore.__ptr_lookup[retVal] = Color("__skip_ptr__")
+			Polycore.__ptr_lookup[retVal].__ptr = retVal
+			return Polycore.__ptr_lookup[retVal]
+		end
+	elseif name == "useVertexColor" then
 		return Polycore.Vertex_get_useVertexColor(self.__ptr)
 	end
 end

+ 442 - 93
Bindings/Contents/LUA/Include/PolycodeLUAWrappers.h

@@ -420,6 +420,27 @@ static int Polycore_Bone_get_parentBoneId(lua_State *L) {
 	return 1;
 }
 
+static int Polycore_Bone_get_boneMatrix(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Bone *inst = (Bone*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->boneMatrix);
+	return 1;
+}
+
+static int Polycore_Bone_get_restMatrix(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Bone *inst = (Bone*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->restMatrix);
+	return 1;
+}
+
+static int Polycore_Bone_get_baseMatrix(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Bone *inst = (Bone*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->baseMatrix);
+	return 1;
+}
+
 static int Polycore_Bone_set_parentBoneId(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Bone *inst = (Bone*)lua_topointer(L, 1);
@@ -1701,6 +1722,13 @@ static int Polycore_Entity_get_renderWireframe(lua_State *L) {
 	return 1;
 }
 
+static int Polycore_Entity_get_color(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Entity *inst = (Entity*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->color);
+	return 1;
+}
+
 static int Polycore_Entity_get_enabled(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Entity *inst = (Entity*)lua_topointer(L, 1);
@@ -1750,6 +1778,13 @@ static int Polycore_Entity_get_depthOnly(lua_State *L) {
 	return 1;
 }
 
+static int Polycore_Entity_get_bBox(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Entity *inst = (Entity*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->bBox);
+	return 1;
+}
+
 static int Polycore_Entity_get_ignoreParentMatrix(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Entity *inst = (Entity*)lua_topointer(L, 1);
@@ -3089,6 +3124,27 @@ static int Polycore_InputEvent_get_mouseButton(lua_State *L) {
 	return 1;
 }
 
+static int Polycore_InputEvent_get_mousePosition(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	InputEvent *inst = (InputEvent*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->mousePosition);
+	return 1;
+}
+
+static int Polycore_InputEvent_get_key(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	InputEvent *inst = (InputEvent*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->key);
+	return 1;
+}
+
+static int Polycore_InputEvent_get_charCode(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	InputEvent *inst = (InputEvent*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->charCode);
+	return 1;
+}
+
 static int Polycore_InputEvent_get_timestamp(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	InputEvent *inst = (InputEvent*)lua_topointer(L, 1);
@@ -3665,9 +3721,9 @@ static int Polycore_Mesh_set_useVertexColors(lua_State *L) {
 }
 
 static int Polycore_Mesh(lua_State *L) {
-	luaL_checktype(L, 1, LUA_TSTRING);
-	String fileName = String(lua_tostring(L, 1));
-	Mesh *inst = new Mesh(fileName);
+	luaL_checktype(L, 1, LUA_TNUMBER);
+	int meshType = lua_tointeger(L, 1);
+	Mesh *inst = new Mesh(meshType);
 	lua_pushlightuserdata(L, (void*)inst);
 	return 1;
 }
@@ -4071,6 +4127,27 @@ static int Polycore_delete_ObjectEntry(lua_State *L) {
 	return 0;
 }
 
+static int Polycore_Particle_get_velVector(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Particle *inst = (Particle*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->velVector);
+	return 1;
+}
+
+static int Polycore_Particle_get_dirVector(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Particle *inst = (Particle*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->dirVector);
+	return 1;
+}
+
+static int Polycore_Particle_get_deviation(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Particle *inst = (Particle*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->deviation);
+	return 1;
+}
+
 static int Polycore_Particle_get_life(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Particle *inst = (Particle*)lua_topointer(L, 1);
@@ -4192,10 +4269,10 @@ static int Polycore_Particle_createSceneParticle(lua_State *L) {
 	luaL_checktype(L, 2, LUA_TNUMBER);
 	int particleType = lua_tointeger(L, 2);
 	luaL_checktype(L, 3, LUA_TLIGHTUSERDATA);
-	Texture * texture = (Texture *)lua_topointer(L, 3);
+	Material * material = (Material *)lua_topointer(L, 3);
 	luaL_checktype(L, 4, LUA_TLIGHTUSERDATA);
 	Mesh * particleMesh = (Mesh *)lua_topointer(L, 4);
-	inst->createSceneParticle(particleType, texture, particleMesh);
+	inst->createSceneParticle(particleType, material, particleMesh);
 	return 0;
 }
 
@@ -4223,30 +4300,45 @@ static int Polycore_ScreenParticleEmitter(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TSTRING);
 	String imageFile = String(lua_tostring(L, 1));
 	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
-	Mesh * particleMesh = (Mesh *)lua_topointer(L, 2);
-	luaL_checktype(L, 3, LUA_TLIGHTUSERDATA);
-	ScreenMesh * emitter = (ScreenMesh *)lua_topointer(L, 3);
-	luaL_checktype(L, 4, LUA_TLIGHTUSERDATA);
-	Screen * particleParentScreen = (Screen *)lua_topointer(L, 4);
+	Screen * particleParentScreen = (Screen *)lua_topointer(L, 2);
+	luaL_checktype(L, 3, LUA_TNUMBER);
+	int particleType = lua_tointeger(L, 3);
+	luaL_checktype(L, 4, LUA_TNUMBER);
+	int emitterType = lua_tointeger(L, 4);
 	luaL_checktype(L, 5, LUA_TNUMBER);
-	int particleType = lua_tointeger(L, 5);
+	Number lifespan = lua_tonumber(L, 5);
 	luaL_checktype(L, 6, LUA_TNUMBER);
-	int emitterType = lua_tointeger(L, 6);
-	luaL_checktype(L, 7, LUA_TNUMBER);
-	Number lifespan = lua_tonumber(L, 7);
-	luaL_checktype(L, 8, LUA_TNUMBER);
-	unsigned int numParticles = lua_tointeger(L, 8);
+	unsigned int numParticles = lua_tointeger(L, 6);
+	luaL_checktype(L, 7, LUA_TLIGHTUSERDATA);
+	Vector3 direction = *(Vector3*)lua_topointer(L, 7);
+	luaL_checktype(L, 8, LUA_TLIGHTUSERDATA);
+	Vector3 gravity = *(Vector3*)lua_topointer(L, 8);
 	luaL_checktype(L, 9, LUA_TLIGHTUSERDATA);
-	Vector3 direction = *(Vector3*)lua_topointer(L, 9);
-	luaL_checktype(L, 10, LUA_TLIGHTUSERDATA);
-	Vector3 gravity = *(Vector3*)lua_topointer(L, 10);
-	luaL_checktype(L, 11, LUA_TLIGHTUSERDATA);
-	Vector3 deviation = *(Vector3*)lua_topointer(L, 11);
-	ScreenParticleEmitter *inst = new ScreenParticleEmitter(imageFile, particleMesh, emitter, particleParentScreen, particleType, emitterType, lifespan, numParticles, direction, gravity, deviation);
+	Vector3 deviation = *(Vector3*)lua_topointer(L, 9);
+	Mesh * particleMesh;
+	if(lua_islightuserdata(L, 10)) {
+		particleMesh = (Mesh *)lua_topointer(L, 10);
+	} else {
+		particleMesh = NULL;
+	}
+	ScreenMesh * emitter;
+	if(lua_islightuserdata(L, 11)) {
+		emitter = (ScreenMesh *)lua_topointer(L, 11);
+	} else {
+		emitter = NULL;
+	}
+	ScreenParticleEmitter *inst = new ScreenParticleEmitter(imageFile, particleParentScreen, particleType, emitterType, lifespan, numParticles, direction, gravity, deviation, particleMesh, emitter);
 	lua_pushlightuserdata(L, (void*)inst);
 	return 1;
 }
 
+static int Polycore_ScreenParticleEmitter_getEmitter(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ScreenParticleEmitter *inst = (ScreenParticleEmitter*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, (void*)inst->getEmitter());
+	return 1;
+}
+
 static int Polycore_ScreenParticleEmitter_addParticleBody(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	ScreenParticleEmitter *inst = (ScreenParticleEmitter*)lua_topointer(L, 1);
@@ -4283,30 +4375,45 @@ static int Polycore_SceneParticleEmitter(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TSTRING);
 	String imageFile = String(lua_tostring(L, 1));
 	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
-	Mesh * particleMesh = (Mesh *)lua_topointer(L, 2);
-	luaL_checktype(L, 3, LUA_TLIGHTUSERDATA);
-	SceneMesh * emitter = (SceneMesh *)lua_topointer(L, 3);
-	luaL_checktype(L, 4, LUA_TLIGHTUSERDATA);
-	Scene * particleParentScene = (Scene *)lua_topointer(L, 4);
+	Scene * particleParentScene = (Scene *)lua_topointer(L, 2);
+	luaL_checktype(L, 3, LUA_TNUMBER);
+	int particleType = lua_tointeger(L, 3);
+	luaL_checktype(L, 4, LUA_TNUMBER);
+	int emitterType = lua_tointeger(L, 4);
 	luaL_checktype(L, 5, LUA_TNUMBER);
-	int particleType = lua_tointeger(L, 5);
+	Number lifespan = lua_tonumber(L, 5);
 	luaL_checktype(L, 6, LUA_TNUMBER);
-	int emitterType = lua_tointeger(L, 6);
-	luaL_checktype(L, 7, LUA_TNUMBER);
-	Number lifespan = lua_tonumber(L, 7);
-	luaL_checktype(L, 8, LUA_TNUMBER);
-	unsigned int numParticles = lua_tointeger(L, 8);
+	unsigned int numParticles = lua_tointeger(L, 6);
+	luaL_checktype(L, 7, LUA_TLIGHTUSERDATA);
+	Vector3 direction = *(Vector3*)lua_topointer(L, 7);
+	luaL_checktype(L, 8, LUA_TLIGHTUSERDATA);
+	Vector3 gravity = *(Vector3*)lua_topointer(L, 8);
 	luaL_checktype(L, 9, LUA_TLIGHTUSERDATA);
-	Vector3 direction = *(Vector3*)lua_topointer(L, 9);
-	luaL_checktype(L, 10, LUA_TLIGHTUSERDATA);
-	Vector3 gravity = *(Vector3*)lua_topointer(L, 10);
-	luaL_checktype(L, 11, LUA_TLIGHTUSERDATA);
-	Vector3 deviation = *(Vector3*)lua_topointer(L, 11);
-	SceneParticleEmitter *inst = new SceneParticleEmitter(imageFile, particleMesh, emitter, particleParentScene, particleType, emitterType, lifespan, numParticles, direction, gravity, deviation);
+	Vector3 deviation = *(Vector3*)lua_topointer(L, 9);
+	Mesh * particleMesh;
+	if(lua_islightuserdata(L, 10)) {
+		particleMesh = (Mesh *)lua_topointer(L, 10);
+	} else {
+		particleMesh = NULL;
+	}
+	SceneMesh * emitter;
+	if(lua_islightuserdata(L, 11)) {
+		emitter = (SceneMesh *)lua_topointer(L, 11);
+	} else {
+		emitter = NULL;
+	}
+	SceneParticleEmitter *inst = new SceneParticleEmitter(imageFile, particleParentScene, particleType, emitterType, lifespan, numParticles, direction, gravity, deviation, particleMesh, emitter);
 	lua_pushlightuserdata(L, (void*)inst);
 	return 1;
 }
 
+static int Polycore_SceneParticleEmitter_getEmitter(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	SceneParticleEmitter *inst = (SceneParticleEmitter*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, (void*)inst->getEmitter());
+	return 1;
+}
+
 static int Polycore_SceneParticleEmitter_addParticleBody(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	SceneParticleEmitter *inst = (SceneParticleEmitter*)lua_topointer(L, 1);
@@ -4353,6 +4460,27 @@ static int Polycore_ParticleEmitter_get_brightnessDeviation(lua_State *L) {
 	return 1;
 }
 
+static int Polycore_ParticleEmitter_get_deviation(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->deviation);
+	return 1;
+}
+
+static int Polycore_ParticleEmitter_get_dirVector(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->dirVector);
+	return 1;
+}
+
+static int Polycore_ParticleEmitter_get_gravVector(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->gravVector);
+	return 1;
+}
+
 static int Polycore_ParticleEmitter_get_lifespan(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
@@ -4367,6 +4495,55 @@ static int Polycore_ParticleEmitter_get_rotationFollowsPath(lua_State *L) {
 	return 1;
 }
 
+static int Polycore_ParticleEmitter_get_scaleCurve(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->scaleCurve);
+	return 1;
+}
+
+static int Polycore_ParticleEmitter_get_colorCurveR(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->colorCurveR);
+	return 1;
+}
+
+static int Polycore_ParticleEmitter_get_colorCurveG(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->colorCurveG);
+	return 1;
+}
+
+static int Polycore_ParticleEmitter_get_colorCurveB(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->colorCurveB);
+	return 1;
+}
+
+static int Polycore_ParticleEmitter_get_colorCurveA(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->colorCurveA);
+	return 1;
+}
+
+static int Polycore_ParticleEmitter_get_useColorCurves(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
+	lua_pushboolean(L, inst->useColorCurves);
+	return 1;
+}
+
+static int Polycore_ParticleEmitter_get_useScaleCurves(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
+	lua_pushboolean(L, inst->useScaleCurves);
+	return 1;
+}
+
 static int Polycore_ParticleEmitter_set_particleSpeedMod(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
@@ -4399,37 +4576,59 @@ static int Polycore_ParticleEmitter_set_rotationFollowsPath(lua_State *L) {
 	return 0;
 }
 
-static int Polycore_ParticleEmitter_createParticles(lua_State *L) {
+static int Polycore_ParticleEmitter_set_useColorCurves(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
-	inst->createParticles();
+	bool param = lua_toboolean(L, 2);
+	inst->useColorCurves = param;
 	return 0;
 }
 
-static int Polycore_ParticleEmitter_setRotationSpeed(lua_State *L) {
+static int Polycore_ParticleEmitter_set_useScaleCurves(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
-	luaL_checktype(L, 2, LUA_TNUMBER);
-	Number speed = lua_tonumber(L, 2);
-	inst->setRotationSpeed(speed);
+	bool param = lua_toboolean(L, 2);
+	inst->useScaleCurves = param;
 	return 0;
 }
 
-static int Polycore_ParticleEmitter_setStartingColor(lua_State *L) {
+static int Polycore_ParticleEmitter(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TSTRING);
+	String imageFile = String(lua_tostring(L, 1));
+	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
+	Mesh * particleMesh = (Mesh *)lua_topointer(L, 2);
+	luaL_checktype(L, 3, LUA_TNUMBER);
+	int particleType = lua_tointeger(L, 3);
+	luaL_checktype(L, 4, LUA_TNUMBER);
+	int emitterType = lua_tointeger(L, 4);
+	luaL_checktype(L, 5, LUA_TNUMBER);
+	Number lifespan = lua_tonumber(L, 5);
+	luaL_checktype(L, 6, LUA_TNUMBER);
+	unsigned int numParticles = lua_tointeger(L, 6);
+	luaL_checktype(L, 7, LUA_TLIGHTUSERDATA);
+	Vector3 direction = *(Vector3*)lua_topointer(L, 7);
+	luaL_checktype(L, 8, LUA_TLIGHTUSERDATA);
+	Vector3 gravity = *(Vector3*)lua_topointer(L, 8);
+	luaL_checktype(L, 9, LUA_TLIGHTUSERDATA);
+	Vector3 deviation = *(Vector3*)lua_topointer(L, 9);
+	ParticleEmitter *inst = new ParticleEmitter(imageFile, particleMesh, particleType, emitterType, lifespan, numParticles, direction, gravity, deviation);
+	lua_pushlightuserdata(L, (void*)inst);
+	return 1;
+}
+
+static int Polycore_ParticleEmitter_createParticles(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
-	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
-	Color c = *(Color*)lua_topointer(L, 2);
-	inst->setStartingColor(c);
+	inst->createParticles();
 	return 0;
 }
 
-static int Polycore_ParticleEmitter_setEndingColor(lua_State *L) {
+static int Polycore_ParticleEmitter_setRotationSpeed(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
-	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
-	Color c = *(Color*)lua_topointer(L, 2);
-	inst->setEndingColor(c);
+	luaL_checktype(L, 2, LUA_TNUMBER);
+	Number speed = lua_tonumber(L, 2);
+	inst->setRotationSpeed(speed);
 	return 0;
 }
 
@@ -4504,47 +4703,11 @@ static int Polycore_ParticleEmitter_emitterEnabled(lua_State *L) {
 }
 
 static int Polycore_ParticleEmitter_setEmitterRadius(lua_State *L) {
-	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
-	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
-	luaL_checktype(L, 2, LUA_TNUMBER);
-	Number rad = lua_tonumber(L, 2);
-	inst->setEmitterRadius(rad);
-	return 0;
-}
-
-static int Polycore_ParticleEmitter_setStartingScaleModifier(lua_State *L) {
-	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
-	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
-	luaL_checktype(L, 2, LUA_TNUMBER);
-	Number mod = lua_tonumber(L, 2);
-	inst->setStartingScaleModifier(mod);
-	return 0;
-}
-
-static int Polycore_ParticleEmitter_setEndingScaleModifier(lua_State *L) {
-	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
-	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
-	luaL_checktype(L, 2, LUA_TNUMBER);
-	Number mod = lua_tonumber(L, 2);
-	inst->setEndingScaleModifier(mod);
-	return 0;
-}
-
-static int Polycore_ParticleEmitter_setEmitRotationVector(lua_State *L) {
-	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
-	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
-	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
-	Vector3 rotVector = *(Vector3*)lua_topointer(L, 2);
-	inst->setEmitRotationVector(rotVector);
-	return 0;
-}
-
-static int Polycore_ParticleEmitter_setEmitRotationDeviance(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	ParticleEmitter *inst = (ParticleEmitter*)lua_topointer(L, 1);
 	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
-	Vector3 rotVector = *(Vector3*)lua_topointer(L, 2);
-	inst->setEmitRotationDeviance(rotVector);
+	Vector3 rad = *(Vector3*)lua_topointer(L, 2);
+	inst->setEmitterRadius(rad);
 	return 0;
 }
 
@@ -5196,6 +5359,20 @@ static int Polycore_delete_Rectangle(lua_State *L) {
 	return 0;
 }
 
+static int Polycore_Renderer_get_ambientColor(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Renderer *inst = (Renderer*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->ambientColor);
+	return 1;
+}
+
+static int Polycore_Renderer_get_clearColor(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Renderer *inst = (Renderer*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->clearColor);
+	return 1;
+}
+
 static int Polycore_Renderer_get_exposureLevel(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Renderer *inst = (Renderer*)lua_topointer(L, 1);
@@ -5203,6 +5380,13 @@ static int Polycore_Renderer_get_exposureLevel(lua_State *L) {
 	return 1;
 }
 
+static int Polycore_Renderer_get_cameraPosition(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Renderer *inst = (Renderer*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->cameraPosition);
+	return 1;
+}
+
 static int Polycore_Renderer_set_exposureLevel(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Renderer *inst = (Renderer*)lua_topointer(L, 1);
@@ -6243,6 +6427,13 @@ static int Polycore_delete_ResourceManager(lua_State *L) {
 	return 0;
 }
 
+static int Polycore_Scene_get_clearColor(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Scene *inst = (Scene*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->clearColor);
+	return 1;
+}
+
 static int Polycore_Scene_get_useClearColor(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Scene *inst = (Scene*)lua_topointer(L, 1);
@@ -6250,6 +6441,20 @@ static int Polycore_Scene_get_useClearColor(lua_State *L) {
 	return 1;
 }
 
+static int Polycore_Scene_get_ambientColor(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Scene *inst = (Scene*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->ambientColor);
+	return 1;
+}
+
+static int Polycore_Scene_get_fogColor(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Scene *inst = (Scene*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->fogColor);
+	return 1;
+}
+
 static int Polycore_Scene_get_enabled(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Scene *inst = (Scene*)lua_topointer(L, 1);
@@ -6408,8 +6613,12 @@ static int Polycore_Scene_getEntityAtScreenPosition(lua_State *L) {
 static int Polycore_Scene_Render(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Scene *inst = (Scene*)lua_topointer(L, 1);
-	luaL_checktype(L, 2, LUA_TLIGHTUSERDATA);
-	Camera * targetCamera = (Camera *)lua_topointer(L, 2);
+	Camera * targetCamera;
+	if(lua_islightuserdata(L, 2)) {
+		targetCamera = (Camera *)lua_topointer(L, 2);
+	} else {
+		targetCamera = NULL;
+	}
 	inst->Render(targetCamera);
 	return 0;
 }
@@ -6651,6 +6860,13 @@ static int Polycore_delete_SceneLabel(lua_State *L) {
 	return 0;
 }
 
+static int Polycore_SceneLight_get_lightColor(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	SceneLight *inst = (SceneLight*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->lightColor);
+	return 1;
+}
+
 static int Polycore_SceneLight(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TNUMBER);
 	int type = lua_tointeger(L, 1);
@@ -6909,6 +7125,13 @@ static int Polycore_delete_SceneManager(lua_State *L) {
 	return 0;
 }
 
+static int Polycore_SceneMesh_get_lightmapIndex(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	SceneMesh *inst = (SceneMesh*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->lightmapIndex);
+	return 1;
+}
+
 static int Polycore_SceneMesh_get_showVertexNormals(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	SceneMesh *inst = (SceneMesh*)lua_topointer(L, 1);
@@ -8122,6 +8345,13 @@ static int Polycore_ScreenShape_get_strokeEnabled(lua_State *L) {
 	return 1;
 }
 
+static int Polycore_ScreenShape_get_strokeColor(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	ScreenShape *inst = (ScreenShape*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->strokeColor);
+	return 1;
+}
+
 static int Polycore_ScreenShape_get_lineSmooth(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	ScreenShape *inst = (ScreenShape*)lua_topointer(L, 1);
@@ -8643,6 +8873,83 @@ static int Polycore_delete_SkeletonAnimation(lua_State *L) {
 	return 0;
 }
 
+static int Polycore_BoneTrack_get_LocXVec(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	BoneTrack *inst = (BoneTrack*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->LocXVec);
+	return 1;
+}
+
+static int Polycore_BoneTrack_get_LocYVec(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	BoneTrack *inst = (BoneTrack*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->LocYVec);
+	return 1;
+}
+
+static int Polycore_BoneTrack_get_LocZVec(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	BoneTrack *inst = (BoneTrack*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->LocZVec);
+	return 1;
+}
+
+static int Polycore_BoneTrack_get_ScaleXVec(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	BoneTrack *inst = (BoneTrack*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->ScaleXVec);
+	return 1;
+}
+
+static int Polycore_BoneTrack_get_ScaleYVec(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	BoneTrack *inst = (BoneTrack*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->ScaleYVec);
+	return 1;
+}
+
+static int Polycore_BoneTrack_get_ScaleZVec(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	BoneTrack *inst = (BoneTrack*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->ScaleZVec);
+	return 1;
+}
+
+static int Polycore_BoneTrack_get_boneQuat(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	BoneTrack *inst = (BoneTrack*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->boneQuat);
+	return 1;
+}
+
+static int Polycore_BoneTrack_get_QuatWVec(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	BoneTrack *inst = (BoneTrack*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->QuatWVec);
+	return 1;
+}
+
+static int Polycore_BoneTrack_get_QuatXVec(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	BoneTrack *inst = (BoneTrack*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->QuatXVec);
+	return 1;
+}
+
+static int Polycore_BoneTrack_get_QuatYVec(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	BoneTrack *inst = (BoneTrack*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->QuatYVec);
+	return 1;
+}
+
+static int Polycore_BoneTrack_get_QuatZVec(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	BoneTrack *inst = (BoneTrack*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->QuatZVec);
+	return 1;
+}
+
 static int Polycore_BoneTrack(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Bone * bone = (Bone *)lua_topointer(L, 1);
@@ -9024,6 +9331,20 @@ static int Polycore_delete_SoundManager(lua_State *L) {
 	return 0;
 }
 
+static int Polycore_String_get_contents(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	String *inst = (String*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->contents);
+	return 1;
+}
+
+static int Polycore_String_get_s_contents(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	String *inst = (String*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->s_contents);
+	return 1;
+}
+
 static int Polycore_String(lua_State *L) {
 	String *inst = new String();
 	lua_pushlightuserdata(L, (void*)inst);
@@ -9773,6 +10094,34 @@ static int Polycore_delete_Vector3(lua_State *L) {
 	return 0;
 }
 
+static int Polycore_Vertex_get_restNormal(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Vertex *inst = (Vertex*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->restNormal);
+	return 1;
+}
+
+static int Polycore_Vertex_get_restPosition(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Vertex *inst = (Vertex*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->restPosition);
+	return 1;
+}
+
+static int Polycore_Vertex_get_normal(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Vertex *inst = (Vertex*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->normal);
+	return 1;
+}
+
+static int Polycore_Vertex_get_vertexColor(lua_State *L) {
+	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
+	Vertex *inst = (Vertex*)lua_topointer(L, 1);
+	lua_pushlightuserdata(L, &inst->vertexColor);
+	return 1;
+}
+
 static int Polycore_Vertex_get_useVertexColor(lua_State *L) {
 	luaL_checktype(L, 1, LUA_TLIGHTUSERDATA);
 	Vertex *inst = (Vertex*)lua_topointer(L, 1);

+ 52 - 6
Bindings/Contents/LUA/Source/PolycodeLUA.cpp

@@ -45,6 +45,9 @@ int luaopen_Polycode(lua_State *L) {
 		{"BezierCurve_rebuildBuffers", Polycore_BezierCurve_rebuildBuffers},
 		{"delete_BezierCurve", Polycore_delete_BezierCurve},
 		{"Bone_get_parentBoneId", Polycore_Bone_get_parentBoneId},
+		{"Bone_get_boneMatrix", Polycore_Bone_get_boneMatrix},
+		{"Bone_get_restMatrix", Polycore_Bone_get_restMatrix},
+		{"Bone_get_baseMatrix", Polycore_Bone_get_baseMatrix},
 		{"Bone_set_parentBoneId", Polycore_Bone_set_parentBoneId},
 		{"Bone", Polycore_Bone},
 		{"Bone_enableBoneLabel", Polycore_Bone_enableBoneLabel},
@@ -195,6 +198,7 @@ int luaopen_Polycode(lua_State *L) {
 		{"Entity_get_alphaTest", Polycore_Entity_get_alphaTest},
 		{"Entity_get_backfaceCulled", Polycore_Entity_get_backfaceCulled},
 		{"Entity_get_renderWireframe", Polycore_Entity_get_renderWireframe},
+		{"Entity_get_color", Polycore_Entity_get_color},
 		{"Entity_get_enabled", Polycore_Entity_get_enabled},
 		{"Entity_get_visible", Polycore_Entity_get_visible},
 		{"Entity_get_depthWrite", Polycore_Entity_get_depthWrite},
@@ -202,6 +206,7 @@ int luaopen_Polycode(lua_State *L) {
 		{"Entity_get_blendingMode", Polycore_Entity_get_blendingMode},
 		{"Entity_get_colorAffectsChildren", Polycore_Entity_get_colorAffectsChildren},
 		{"Entity_get_depthOnly", Polycore_Entity_get_depthOnly},
+		{"Entity_get_bBox", Polycore_Entity_get_bBox},
 		{"Entity_get_ignoreParentMatrix", Polycore_Entity_get_ignoreParentMatrix},
 		{"Entity_get_isMask", Polycore_Entity_get_isMask},
 		{"Entity_set_custEntityType", Polycore_Entity_set_custEntityType},
@@ -351,6 +356,9 @@ int luaopen_Polycode(lua_State *L) {
 		{"Image_getPixels", Polycore_Image_getPixels},
 		{"delete_Image", Polycore_delete_Image},
 		{"InputEvent_get_mouseButton", Polycore_InputEvent_get_mouseButton},
+		{"InputEvent_get_mousePosition", Polycore_InputEvent_get_mousePosition},
+		{"InputEvent_get_key", Polycore_InputEvent_get_key},
+		{"InputEvent_get_charCode", Polycore_InputEvent_get_charCode},
 		{"InputEvent_get_timestamp", Polycore_InputEvent_get_timestamp},
 		{"InputEvent_set_mouseButton", Polycore_InputEvent_set_mouseButton},
 		{"InputEvent_set_timestamp", Polycore_InputEvent_set_timestamp},
@@ -463,6 +471,9 @@ int luaopen_Polycode(lua_State *L) {
 		{"ObjectEntry", Polycore_ObjectEntry},
 		{"ObjectEntry_addChild", Polycore_ObjectEntry_addChild},
 		{"delete_ObjectEntry", Polycore_delete_ObjectEntry},
+		{"Particle_get_velVector", Polycore_Particle_get_velVector},
+		{"Particle_get_dirVector", Polycore_Particle_get_dirVector},
+		{"Particle_get_deviation", Polycore_Particle_get_deviation},
 		{"Particle_get_life", Polycore_Particle_get_life},
 		{"Particle_get_lifespan", Polycore_Particle_get_lifespan},
 		{"Particle_get_brightnessDeviation", Polycore_Particle_get_brightnessDeviation},
@@ -481,27 +492,40 @@ int luaopen_Polycode(lua_State *L) {
 		{"Particle_createScreenParticle", Polycore_Particle_createScreenParticle},
 		{"delete_Particle", Polycore_delete_Particle},
 		{"ScreenParticleEmitter", Polycore_ScreenParticleEmitter},
+		{"ScreenParticleEmitter_getEmitter", Polycore_ScreenParticleEmitter_getEmitter},
 		{"ScreenParticleEmitter_addParticleBody", Polycore_ScreenParticleEmitter_addParticleBody},
 		{"ScreenParticleEmitter_getBaseMatrix", Polycore_ScreenParticleEmitter_getBaseMatrix},
 		{"ScreenParticleEmitter_Update", Polycore_ScreenParticleEmitter_Update},
 		{"delete_ScreenParticleEmitter", Polycore_delete_ScreenParticleEmitter},
 		{"SceneParticleEmitter", Polycore_SceneParticleEmitter},
+		{"SceneParticleEmitter_getEmitter", Polycore_SceneParticleEmitter_getEmitter},
 		{"SceneParticleEmitter_addParticleBody", Polycore_SceneParticleEmitter_addParticleBody},
 		{"SceneParticleEmitter_getBaseMatrix", Polycore_SceneParticleEmitter_getBaseMatrix},
 		{"SceneParticleEmitter_Update", Polycore_SceneParticleEmitter_Update},
 		{"delete_SceneParticleEmitter", Polycore_delete_SceneParticleEmitter},
 		{"ParticleEmitter_get_particleSpeedMod", Polycore_ParticleEmitter_get_particleSpeedMod},
 		{"ParticleEmitter_get_brightnessDeviation", Polycore_ParticleEmitter_get_brightnessDeviation},
+		{"ParticleEmitter_get_deviation", Polycore_ParticleEmitter_get_deviation},
+		{"ParticleEmitter_get_dirVector", Polycore_ParticleEmitter_get_dirVector},
+		{"ParticleEmitter_get_gravVector", Polycore_ParticleEmitter_get_gravVector},
 		{"ParticleEmitter_get_lifespan", Polycore_ParticleEmitter_get_lifespan},
 		{"ParticleEmitter_get_rotationFollowsPath", Polycore_ParticleEmitter_get_rotationFollowsPath},
+		{"ParticleEmitter_get_scaleCurve", Polycore_ParticleEmitter_get_scaleCurve},
+		{"ParticleEmitter_get_colorCurveR", Polycore_ParticleEmitter_get_colorCurveR},
+		{"ParticleEmitter_get_colorCurveG", Polycore_ParticleEmitter_get_colorCurveG},
+		{"ParticleEmitter_get_colorCurveB", Polycore_ParticleEmitter_get_colorCurveB},
+		{"ParticleEmitter_get_colorCurveA", Polycore_ParticleEmitter_get_colorCurveA},
+		{"ParticleEmitter_get_useColorCurves", Polycore_ParticleEmitter_get_useColorCurves},
+		{"ParticleEmitter_get_useScaleCurves", Polycore_ParticleEmitter_get_useScaleCurves},
 		{"ParticleEmitter_set_particleSpeedMod", Polycore_ParticleEmitter_set_particleSpeedMod},
 		{"ParticleEmitter_set_brightnessDeviation", Polycore_ParticleEmitter_set_brightnessDeviation},
 		{"ParticleEmitter_set_lifespan", Polycore_ParticleEmitter_set_lifespan},
 		{"ParticleEmitter_set_rotationFollowsPath", Polycore_ParticleEmitter_set_rotationFollowsPath},
+		{"ParticleEmitter_set_useColorCurves", Polycore_ParticleEmitter_set_useColorCurves},
+		{"ParticleEmitter_set_useScaleCurves", Polycore_ParticleEmitter_set_useScaleCurves},
+		{"ParticleEmitter", Polycore_ParticleEmitter},
 		{"ParticleEmitter_createParticles", Polycore_ParticleEmitter_createParticles},
 		{"ParticleEmitter_setRotationSpeed", Polycore_ParticleEmitter_setRotationSpeed},
-		{"ParticleEmitter_setStartingColor", Polycore_ParticleEmitter_setStartingColor},
-		{"ParticleEmitter_setEndingColor", Polycore_ParticleEmitter_setEndingColor},
 		{"ParticleEmitter_setParticleBlendingMode", Polycore_ParticleEmitter_setParticleBlendingMode},
 		{"ParticleEmitter_setDepthWrite", Polycore_ParticleEmitter_setDepthWrite},
 		{"ParticleEmitter_setDepthTest", Polycore_ParticleEmitter_setDepthTest},
@@ -511,10 +535,6 @@ int luaopen_Polycode(lua_State *L) {
 		{"ParticleEmitter_enableEmitter", Polycore_ParticleEmitter_enableEmitter},
 		{"ParticleEmitter_emitterEnabled", Polycore_ParticleEmitter_emitterEnabled},
 		{"ParticleEmitter_setEmitterRadius", Polycore_ParticleEmitter_setEmitterRadius},
-		{"ParticleEmitter_setStartingScaleModifier", Polycore_ParticleEmitter_setStartingScaleModifier},
-		{"ParticleEmitter_setEndingScaleModifier", Polycore_ParticleEmitter_setEndingScaleModifier},
-		{"ParticleEmitter_setEmitRotationVector", Polycore_ParticleEmitter_setEmitRotationVector},
-		{"ParticleEmitter_setEmitRotationDeviance", Polycore_ParticleEmitter_setEmitRotationDeviance},
 		{"ParticleEmitter_setAllAtOnce", Polycore_ParticleEmitter_setAllAtOnce},
 		{"ParticleEmitter_Trigger", Polycore_ParticleEmitter_Trigger},
 		{"ParticleEmitter_resetParticle", Polycore_ParticleEmitter_resetParticle},
@@ -585,7 +605,10 @@ int luaopen_Polycode(lua_State *L) {
 		{"Rectangle", Polycore_Rectangle},
 		{"Rectangle_setRect", Polycore_Rectangle_setRect},
 		{"delete_Rectangle", Polycore_delete_Rectangle},
+		{"Renderer_get_ambientColor", Polycore_Renderer_get_ambientColor},
+		{"Renderer_get_clearColor", Polycore_Renderer_get_clearColor},
 		{"Renderer_get_exposureLevel", Polycore_Renderer_get_exposureLevel},
+		{"Renderer_get_cameraPosition", Polycore_Renderer_get_cameraPosition},
 		{"Renderer_set_exposureLevel", Polycore_Renderer_set_exposureLevel},
 		{"Renderer_Resize", Polycore_Renderer_Resize},
 		{"Renderer_BeginRender", Polycore_Renderer_BeginRender},
@@ -691,7 +714,10 @@ int luaopen_Polycode(lua_State *L) {
 		{"ResourceManager_getResource", Polycore_ResourceManager_getResource},
 		{"ResourceManager_addShaderModule", Polycore_ResourceManager_addShaderModule},
 		{"delete_ResourceManager", Polycore_delete_ResourceManager},
+		{"Scene_get_clearColor", Polycore_Scene_get_clearColor},
 		{"Scene_get_useClearColor", Polycore_Scene_get_useClearColor},
+		{"Scene_get_ambientColor", Polycore_Scene_get_ambientColor},
+		{"Scene_get_fogColor", Polycore_Scene_get_fogColor},
 		{"Scene_get_enabled", Polycore_Scene_get_enabled},
 		{"Scene_set_useClearColor", Polycore_Scene_set_useClearColor},
 		{"Scene_set_enabled", Polycore_Scene_set_enabled},
@@ -736,6 +762,7 @@ int luaopen_Polycode(lua_State *L) {
 		{"SceneLabel_getLabel", Polycore_SceneLabel_getLabel},
 		{"SceneLabel_Render", Polycore_SceneLabel_Render},
 		{"delete_SceneLabel", Polycore_delete_SceneLabel},
+		{"SceneLight_get_lightColor", Polycore_SceneLight_get_lightColor},
 		{"SceneLight", Polycore_SceneLight},
 		{"SceneLight_getIntensity", Polycore_SceneLight_getIntensity},
 		{"SceneLight_getConstantAttenuation", Polycore_SceneLight_getConstantAttenuation},
@@ -765,6 +792,7 @@ int luaopen_Polycode(lua_State *L) {
 		{"SceneManager_removeScene", Polycore_SceneManager_removeScene},
 		{"SceneManager_registerRenderTexture", Polycore_SceneManager_registerRenderTexture},
 		{"delete_SceneManager", Polycore_delete_SceneManager},
+		{"SceneMesh_get_lightmapIndex", Polycore_SceneMesh_get_lightmapIndex},
 		{"SceneMesh_get_showVertexNormals", Polycore_SceneMesh_get_showVertexNormals},
 		{"SceneMesh_set_showVertexNormals", Polycore_SceneMesh_set_showVertexNormals},
 		{"SceneMesh", Polycore_SceneMesh},
@@ -904,6 +932,7 @@ int luaopen_Polycode(lua_State *L) {
 		{"ScreenMesh_setTexture", Polycore_ScreenMesh_setTexture},
 		{"delete_ScreenMesh", Polycore_delete_ScreenMesh},
 		{"ScreenShape_get_strokeEnabled", Polycore_ScreenShape_get_strokeEnabled},
+		{"ScreenShape_get_strokeColor", Polycore_ScreenShape_get_strokeColor},
 		{"ScreenShape_get_lineSmooth", Polycore_ScreenShape_get_lineSmooth},
 		{"ScreenShape_set_strokeEnabled", Polycore_ScreenShape_set_strokeEnabled},
 		{"ScreenShape_set_lineSmooth", Polycore_ScreenShape_set_lineSmooth},
@@ -961,6 +990,17 @@ int luaopen_Polycode(lua_State *L) {
 		{"SkeletonAnimation_Update", Polycore_SkeletonAnimation_Update},
 		{"SkeletonAnimation_setSpeed", Polycore_SkeletonAnimation_setSpeed},
 		{"delete_SkeletonAnimation", Polycore_delete_SkeletonAnimation},
+		{"BoneTrack_get_LocXVec", Polycore_BoneTrack_get_LocXVec},
+		{"BoneTrack_get_LocYVec", Polycore_BoneTrack_get_LocYVec},
+		{"BoneTrack_get_LocZVec", Polycore_BoneTrack_get_LocZVec},
+		{"BoneTrack_get_ScaleXVec", Polycore_BoneTrack_get_ScaleXVec},
+		{"BoneTrack_get_ScaleYVec", Polycore_BoneTrack_get_ScaleYVec},
+		{"BoneTrack_get_ScaleZVec", Polycore_BoneTrack_get_ScaleZVec},
+		{"BoneTrack_get_boneQuat", Polycore_BoneTrack_get_boneQuat},
+		{"BoneTrack_get_QuatWVec", Polycore_BoneTrack_get_QuatWVec},
+		{"BoneTrack_get_QuatXVec", Polycore_BoneTrack_get_QuatXVec},
+		{"BoneTrack_get_QuatYVec", Polycore_BoneTrack_get_QuatYVec},
+		{"BoneTrack_get_QuatZVec", Polycore_BoneTrack_get_QuatZVec},
 		{"BoneTrack", Polycore_BoneTrack},
 		{"BoneTrack_Play", Polycore_BoneTrack_Play},
 		{"BoneTrack_Stop", Polycore_BoneTrack_Stop},
@@ -1004,6 +1044,8 @@ int luaopen_Polycode(lua_State *L) {
 		{"SoundManager_initAL", Polycore_SoundManager_initAL},
 		{"SoundManager_setGlobalVolume", Polycore_SoundManager_setGlobalVolume},
 		{"delete_SoundManager", Polycore_delete_SoundManager},
+		{"String_get_contents", Polycore_String_get_contents},
+		{"String_get_s_contents", Polycore_String_get_s_contents},
 		{"String", Polycore_String},
 		{"String_size", Polycore_String_size},
 		{"String_length", Polycore_String_length},
@@ -1093,6 +1135,10 @@ int luaopen_Polycode(lua_State *L) {
 		{"Vector3_crossProduct", Polycore_Vector3_crossProduct},
 		{"Vector3_Normalize", Polycore_Vector3_Normalize},
 		{"delete_Vector3", Polycore_delete_Vector3},
+		{"Vertex_get_restNormal", Polycore_Vertex_get_restNormal},
+		{"Vertex_get_restPosition", Polycore_Vertex_get_restPosition},
+		{"Vertex_get_normal", Polycore_Vertex_get_normal},
+		{"Vertex_get_vertexColor", Polycore_Vertex_get_vertexColor},
 		{"Vertex_get_useVertexColor", Polycore_Vertex_get_useVertexColor},
 		{"Vertex_set_useVertexColor", Polycore_Vertex_set_useVertexColor},
 		{"Vertex", Polycore_Vertex},

+ 104 - 67
Bindings/Scripts/create_lua_library/create_lua_library.py

@@ -57,6 +57,8 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 				ignore_classes = ["PolycodeShaderModule", "Object", "Threaded", "OpenGLCubemap"]
 				for ckey in cppHeader.classes:
 					c = cppHeader.classes[ckey]
+		#			if ckey == "ParticleEmitter":
+		#				print c
 					lout = ""
 					inherits = False
 					if len(c["inherits"]) > 0:
@@ -76,20 +78,29 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 					if ckey == "OSFileEntry":
 						print c["methods"]["public"]
 					parsed_methods = []
-					ignore_methods = ["readByte32", "readByte16", "getCustomEntitiesByType", "Core","ParticleEmitter", "Renderer", "Shader", "Texture", "handleEvent", "secondaryHandler"]
+					ignore_methods = ["readByte32", "readByte16", "getCustomEntitiesByType", "Core", "Renderer", "Shader", "Texture", "handleEvent", "secondaryHandler"]
 					lout += "\n\n"
 	
 					pps = []
 					for pp in c["properties"]["public"]:
 						if pp["type"].find("static ") != -1:
-							lout += "%s = %s\n" % (pp["name"], pp["defaltValue"])
+							if "defaltValue" in pp:
+								lout += "%s = %s\n" % (pp["name"], pp["defaltValue"])
 						else:
-							if pp["type"] == "Number" or  pp["type"] == "String" or pp["type"] == "int" or pp["type"] == "bool":
+							#there are some bugs in the class parser that cause it to return junk
+							if pp["type"].find("*") == -1 and pp["type"].find("vector") == -1 and pp["name"] != "16" and pp["name"] != "setScale" and pp["name"] != "setPosition" and pp["name"] != "BUFFER_CACHE_PRECISION":
 								pps.append(pp)
+							#if pp["type"] == "Number" or  pp["type"] == "String" or pp["type"] == "int" or pp["type"] == "bool":
+							#	pps.append(pp)
 							#else:
 							#	print(">>> Skipping %s[%s %s]" % (ckey, pp["type"], pp["name"]))
 	
 					pidx = 0
+			
+					# hack to fix the lack of multiple inheritance
+					#if ckey == "ScreenParticleEmitter" or ckey == "SceneParticleEmitter":
+					#		pps.append({"name": "emitter", "type": "ParticleEmitter"})
+	
 					if len(pps) > 0:
 						lout += "function %s:__index__(name)\n" % ckey
 						for pp in pps:
@@ -97,29 +108,47 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 								lout += "\tif name == \"%s\" then\n" % (pp["name"])
 							else:
 								lout += "\telseif name == \"%s\" then\n" % (pp["name"])
-							lout += "\t\treturn %s.%s_get_%s(self.__ptr)\n" % (libName, ckey, pp["name"])
-							
-							sout += "\t\t{\"%s_get_%s\", %s_%s_get_%s},\n" % (ckey, pp["name"], libName, ckey, pp["name"])
-							out += "static int %s_%s_get_%s(lua_State *L) {\n" % (libName, ckey, pp["name"])
-							out += "\tluaL_checktype(L, 1, LUA_TLIGHTUSERDATA);\n"
-							out += "\t%s *inst = (%s*)lua_topointer(L, 1);\n" % (ckey.replace("Polygon", "Polycode::Polygon").replace("Rectangle", "Polycode::Rectangle"), ckey.replace("Polygon", "Polycode::Polygon").replace("Rectangle", "Polycode::Rectangle"))
-	
-							outfunc = "lua_pushlightuserdata"
-							retFunc = ""
-							if pp["type"] == "Number":
-								outfunc = "lua_pushnumber"
-							if pp["type"] == "String":
-								outfunc = "lua_pushstring"
-								retFunc = ".c_str()"
-							if pp["type"] == "int":
-								outfunc = "lua_pushinteger"
-							if pp["type"] == "bool":
-								outfunc = "lua_pushboolean"
-	
-							out += "\t%s(L, inst->%s%s);\n" % (outfunc, pp["name"], retFunc)
-	
-							out += "\treturn 1;\n"
-							out += "}\n\n"
+
+							if pp["type"] == "Number" or  pp["type"] == "String" or pp["type"] == "int" or pp["type"] == "bool":
+								lout += "\t\treturn %s.%s_get_%s(self.__ptr)\n" % (libName, ckey, pp["name"])
+							elif (ckey == "ScreenParticleEmitter" or ckey == "SceneParticleEmitter") and pp["name"] == "emitter":
+								lout += "\t\tlocal ret = %s(\"__skip_ptr__\")\n" % (pp["type"])
+								lout += "\t\tret.__ptr = self.__ptr\n"
+								lout += "\t\treturn ret\n"
+							else:
+								lout += "\t\tretVal = %s.%s_get_%s(self.__ptr)\n" % (libName, ckey, pp["name"])
+								lout += "\t\tif Polycore.__ptr_lookup[retVal] ~= nil then\n"
+								lout += "\t\t\treturn Polycore.__ptr_lookup[retVal]\n"
+								lout += "\t\telse\n"
+								lout += "\t\t\tPolycore.__ptr_lookup[retVal] = %s(\"__skip_ptr__\")\n" % (pp["type"])
+								lout += "\t\t\tPolycore.__ptr_lookup[retVal].__ptr = retVal\n"
+								lout += "\t\t\treturn Polycore.__ptr_lookup[retVal]\n"
+								lout += "\t\tend\n"
+
+							if not ((ckey == "ScreenParticleEmitter" or ckey == "SceneParticleEmitter") and pp["name"] == "emitter"):
+								sout += "\t\t{\"%s_get_%s\", %s_%s_get_%s},\n" % (ckey, pp["name"], libName, ckey, pp["name"])
+								out += "static int %s_%s_get_%s(lua_State *L) {\n" % (libName, ckey, pp["name"])
+								out += "\tluaL_checktype(L, 1, LUA_TLIGHTUSERDATA);\n"
+								out += "\t%s *inst = (%s*)lua_topointer(L, 1);\n" % (ckey.replace("Polygon", "Polycode::Polygon").replace("Rectangle", "Polycode::Rectangle"), ckey.replace("Polygon", "Polycode::Polygon").replace("Rectangle", "Polycode::Rectangle"))
+	
+								outfunc = "lua_pushlightuserdata"
+								retFunc = ""
+								if pp["type"] == "Number":
+									outfunc = "lua_pushnumber"
+								if pp["type"] == "String":
+									outfunc = "lua_pushstring"
+									retFunc = ".c_str()"
+								if pp["type"] == "int":
+									outfunc = "lua_pushinteger"
+								if pp["type"] == "bool":
+									outfunc = "lua_pushboolean"
+	
+								if pp["type"] == "Number" or  pp["type"] == "String" or pp["type"] == "int" or pp["type"] == "bool":
+									out += "\t%s(L, inst->%s%s);\n" % (outfunc, pp["name"], retFunc)
+								else:
+									out += "\t%s(L, &inst->%s%s);\n" % (outfunc, pp["name"], retFunc)
+								out += "\treturn 1;\n"
+								out += "}\n\n"
 							pidx = pidx + 1
 	
 						lout += "\tend\n"
@@ -130,36 +159,37 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 					if len(pps) > 0:
 						lout += "function %s:__set_callback(name,value)\n" % ckey
 						for pp in pps:
-							if pidx == 0:
-								lout += "\tif name == \"%s\" then\n" % (pp["name"])
-							else:
-								lout += "\telseif name == \"%s\" then\n" % (pp["name"])
-							lout += "\t\t%s.%s_set_%s(self.__ptr, value)\n" % (libName, ckey, pp["name"])
-							lout += "\t\treturn true\n"
-	
-							sout += "\t\t{\"%s_set_%s\", %s_%s_set_%s},\n" % (ckey, pp["name"], libName, ckey, pp["name"])
-							out += "static int %s_%s_set_%s(lua_State *L) {\n" % (libName, ckey, pp["name"])
-							out += "\tluaL_checktype(L, 1, LUA_TLIGHTUSERDATA);\n"
-							out += "\t%s *inst = (%s*)lua_topointer(L, 1);\n" % (ckey.replace("Polygon", "Polycode::Polygon").replace("Rectangle", "Polycode::Rectangle"), ckey.replace("Polygon", "Polycode::Polygon").replace("Rectangle", "Polycode::Rectangle"))
-	
-							outfunc = "lua_topointer"
-							if pp["type"] == "Number":
-								outfunc = "lua_tonumber"
-							if pp["type"] == "String":
-								outfunc = "lua_tostring"
-							if pp["type"] == "int":
-								outfunc = "lua_tointeger"
-							if pp["type"] == "bool":
-								outfunc = "lua_toboolean"
-	
-							out += "\t%s param = %s(L, 2);\n" % (pp["type"], outfunc)
-							out += "\tinst->%s = param;\n" % (pp["name"])
-	
-							out += "\treturn 0;\n"
-							out += "}\n\n"
-							pidx = pidx + 1
-	
-						lout += "\tend\n"
+							if pp["type"] == "Number" or  pp["type"] == "String" or pp["type"] == "int" or pp["type"] == "bool":
+								if pidx == 0:
+									lout += "\tif name == \"%s\" then\n" % (pp["name"])
+								else:
+									lout += "\telseif name == \"%s\" then\n" % (pp["name"])
+								lout += "\t\t%s.%s_set_%s(self.__ptr, value)\n" % (libName, ckey, pp["name"])
+								lout += "\t\treturn true\n"
+	
+								sout += "\t\t{\"%s_set_%s\", %s_%s_set_%s},\n" % (ckey, pp["name"], libName, ckey, pp["name"])
+								out += "static int %s_%s_set_%s(lua_State *L) {\n" % (libName, ckey, pp["name"])
+								out += "\tluaL_checktype(L, 1, LUA_TLIGHTUSERDATA);\n"
+								out += "\t%s *inst = (%s*)lua_topointer(L, 1);\n" % (ckey.replace("Polygon", "Polycode::Polygon").replace("Rectangle", "Polycode::Rectangle"), ckey.replace("Polygon", "Polycode::Polygon").replace("Rectangle", "Polycode::Rectangle"))
+	
+								outfunc = "lua_topointer"
+								if pp["type"] == "Number":
+									outfunc = "lua_tonumber"
+								if pp["type"] == "String":
+									outfunc = "lua_tostring"
+								if pp["type"] == "int":
+									outfunc = "lua_tointeger"
+								if pp["type"] == "bool":
+									outfunc = "lua_toboolean"
+	
+								out += "\t%s param = %s(L, 2);\n" % (pp["type"], outfunc)
+								out += "\tinst->%s = param;\n" % (pp["name"])
+		
+								out += "\treturn 0;\n"
+								out += "}\n\n"
+								pidx = pidx + 1
+						if pidx != 0:
+							lout += "\tend\n"
 						lout += "\treturn false\n"
 						lout += "end\n"
 						
@@ -228,17 +258,24 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 									
 									param["type"] = param["type"].replace("Polygon", "Polycode::Polygon").replace("Rectangle", "Polycode::Rectangle")
 	
-									if "defaltValue" in param and checkfunc != "lua_islightuserdata":
-										param["defaltValue"] = param["defaltValue"].replace(" 0f", ".0f")
-										param["defaltValue"] = param["defaltValue"].replace(": :", "::")
-										param["defaltValue"] = param["defaltValue"].replace("0 ", "0.")
-	
-										out += "\t%s %s;\n" % (param["type"], param["name"])
-										out += "\tif(%s(L, %d)) {\n" % (checkfunc, idx)
-										out += "\t\t%s = %s(L, %d);\n" % (param["name"], luafunc, idx)
-										out += "\t} else {\n"
-										out += "\t\t%s = %s;\n" % (param["name"], param["defaltValue"])
-										out += "\t}\n"
+									if "defaltValue" in param:
+										if checkfunc != "lua_islightuserdata" or (checkfunc == "lua_islightuserdata" and param["defaltValue"] == "NULL"):
+											param["defaltValue"] = param["defaltValue"].replace(" 0f", ".0f")
+											param["defaltValue"] = param["defaltValue"].replace(": :", "::")
+											param["defaltValue"] = param["defaltValue"].replace("0 ", "0.")
+	
+											out += "\t%s %s;\n" % (param["type"], param["name"])
+											out += "\tif(%s(L, %d)) {\n" % (checkfunc, idx)
+											out += "\t\t%s = %s(L, %d);\n" % (param["name"], luafunc, idx)
+											out += "\t} else {\n"
+											out += "\t\t%s = %s;\n" % (param["name"], param["defaltValue"])
+											out += "\t}\n"
+										else:
+											out += "\tluaL_checktype(L, %d, %s);\n" % (idx, luatype);
+											if param["type"] == "String":
+												out += "\t%s %s = String(%s(L, %d));\n" % (param["type"], param["name"], luafunc, idx)
+											else:
+												out += "\t%s %s = %s(L, %d);\n" % (param["type"], param["name"], luafunc, idx)
 									else:
 										out += "\tluaL_checktype(L, %d, %s);\n" % (idx, luatype);
 										if param["type"] == "String":

Разница между файлами не показана из-за своего большого размера
+ 406 - 184
Core/Build/Mac OS X/PolyCore.xcodeproj/project.xcworkspace/xcuserdata/ivansafrin.xcuserdatad/UserInterfaceState.xcuserstate


+ 8 - 5
Core/Contents/Include/PolyMesh.h

@@ -105,17 +105,20 @@ namespace Polycode {
 	*/
 	class _PolyExport Mesh {
 		public:
-			/**
-			* Construct from a mesh loaded from a file.
-			* @param fileName Path to mesh file.
-			*/
-			Mesh(String fileName);
+		
 			
 			/**
 			* Construct with an empty mesh of specified type.
 			* @param meshType Type of mesh. Possible values are: Mesh::QUAD_MESH, Mesh::TRI_MESH, Mesh::TRIFAN_MESH, Mesh::TRISTRIP_MESH, Mesh::LINE_MESH, Mesh::POINT_MESH.
 			*/			
 			Mesh(int meshType);
+					
+			/**
+			* Construct from a mesh loaded from a file.
+			* @param fileName Path to mesh file.
+			*/
+			Mesh(String fileName);
+
 			~Mesh();
 			
 			/**

+ 3 - 1
Core/Contents/Include/PolyParticle.h

@@ -37,7 +37,7 @@ namespace Polycode {
 			~Particle();
 			void Reset(bool continuious);
 			
-			void createSceneParticle(int particleType, Texture *texture, Mesh *particleMesh);
+			void createSceneParticle(int particleType, Material *material, Mesh *particleMesh);
 			void createScreenParticle(int particleType, Texture *texture, Mesh *particleMesh);
 		
 			Entity *particleBody;						
@@ -52,6 +52,8 @@ namespace Polycode {
 			Number perlinPosY;
 			Number perlinPosZ;
 			
+			static Mesh* billboardMesh;
+			
 			static const int BILLBOARD_PARTICLE = 0;
 			static const int MESH_PARTICLE = 1;
 	};

+ 15 - 20
Core/Contents/Include/PolyParticleEmitter.h

@@ -41,8 +41,6 @@ namespace Polycode {
 			void createParticles();
 			
 			void setRotationSpeed(Number speed);
-			void setStartingColor(Color c);
-			void setEndingColor(Color c);
 			void setParticleBlendingMode(int mode);
 			void setDepthWrite(bool val);
 			void setDepthTest(bool val);		
@@ -53,11 +51,8 @@ namespace Polycode {
 			void enableEmitter(bool val);
 			bool emitterEnabled();
 			
-			void setEmitterRadius(Number rad);
-			void setStartingScaleModifier(Number mod);
-			void setEndingScaleModifier(Number mod);
-			void setEmitRotationVector(Vector3 rotVector);
-			void setEmitRotationDeviance(Vector3 rotVector);
+			void setEmitterRadius(Vector3 rad);
+			
 			void setAllAtOnce(bool val);
 			
 			void Trigger();
@@ -66,8 +61,8 @@ namespace Polycode {
 			void setPerlinModSize(Number size);
 			void setParticleCount(int count);
 		
-			virtual void addParticleBody(Entity *particleBody) = 0;
-			virtual Matrix4 getBaseMatrix() = 0;
+			virtual void addParticleBody(Entity *particleBody) {}
+			virtual Matrix4 getBaseMatrix() {Matrix4 m; return m;}
 		
 			Number particleSpeedMod;
 			Number brightnessDeviation;
@@ -76,7 +71,7 @@ namespace Polycode {
 
 			static const int CONTINUOUS_EMITTER = 0;
 			static const int TRIGGERED_EMITTER = 1;
-			static const int CLOUD_EMITTER = 2;
+		//	static const int CLOUD_EMITTER = 2;
 			
 			Vector3 deviation;
 			Vector3 dirVector;
@@ -92,6 +87,9 @@ namespace Polycode {
 			BezierCurve colorCurveG;
 			BezierCurve colorCurveB;
 			BezierCurve colorCurveA;
+			
+			bool useColorCurves;
+			bool useScaleCurves;
 		
 		protected:
 		
@@ -108,17 +106,10 @@ namespace Polycode {
 		
 			bool isEmitterEnabled;
 		
-			Vector3 emitRotationVector;
-			Vector3 emitRotationDeviance;
-			Number emitterRadius;
+			Vector3 emitterRadius;
 			Number perlinModSize;
 			Perlin *motionPerlin;
 			bool perlinEnabled;
-			Number startingScaleMod;
-			Number endingScaleMod;
-			
-			Color startingColor;
-			Color endingColor;
 			
 			Number rotationSpeed;
 			Number numParticles;
@@ -130,9 +121,11 @@ namespace Polycode {
 
 	class _PolyExport SceneParticleEmitter : public SceneEntity, public ParticleEmitter {
 	public:
-		SceneParticleEmitter(String imageFile, Mesh *particleMesh, SceneMesh *emitter, Scene *particleParentScene, int particleType, int emitterType, Number lifespan, unsigned int numParticles, Vector3 direction, Vector3 gravity, Vector3 deviation);
+		SceneParticleEmitter(String imageFile, Scene *particleParentScene, int particleType, int emitterType, Number lifespan, unsigned int numParticles, Vector3 direction, Vector3 gravity, Vector3 deviation, Mesh *particleMesh = NULL, SceneMesh *emitter = NULL);
 		~SceneParticleEmitter();		
 		
+		ParticleEmitter *getEmitter() { return this; }
+		
 		void addParticleBody(Entity *particleBody);
 		Matrix4 getBaseMatrix();
 		void Update();
@@ -145,9 +138,11 @@ namespace Polycode {
 	
 	class _PolyExport ScreenParticleEmitter : public ScreenEntity, public ParticleEmitter {
 	public:
-		ScreenParticleEmitter(String imageFile, Mesh *particleMesh, ScreenMesh *emitter, Screen *particleParentScreen, int particleType, int emitterType, Number lifespan, unsigned int numParticles, Vector3 direction, Vector3 gravity, Vector3 deviation);
+		ScreenParticleEmitter(String imageFile, Screen *particleParentScreen, int particleType, int emitterType, Number lifespan, unsigned int numParticles, Vector3 direction, Vector3 gravity, Vector3 deviation, Mesh *particleMesh = NULL, ScreenMesh *emitter = NULL);
 		~ScreenParticleEmitter();		
 		
+		ParticleEmitter *getEmitter() { return this; }		
+		
 		void addParticleBody(Entity *particleBody);
 		Matrix4 getBaseMatrix();
 		void Update();

+ 37 - 6
Core/Contents/Source/PolyParticle.cpp

@@ -24,23 +24,51 @@
 
 using namespace Polycode;
 
+Mesh *Particle::billboardMesh = NULL;
+
 Particle::Particle(int particleType, bool isScreenParticle, Material *material, Texture *texture, Mesh *particleMesh) {
 	life = 0;
 	if(isScreenParticle) {
 		createScreenParticle(particleType, texture, particleMesh);		
 	} else {
-		createSceneParticle(particleType, texture, particleMesh);
+		createSceneParticle(particleType, material, particleMesh);
 	}
 	
 	Reset(true);
 }
 
-void Particle::createSceneParticle(int particleType, Texture *texture, Mesh *particleMesh) {
+void Particle::createSceneParticle(int particleType, Material *material, Mesh *particleMesh) {
 	switch(particleType) {
 		case BILLBOARD_PARTICLE:
 		{
-			ScenePrimitive *primitive = new ScenePrimitive(ScenePrimitive::TYPE_PLANE, 1.0f, 1.0f);
-			primitive->setTexture(texture);
+			if(!billboardMesh) {
+				billboardMesh = new Mesh(Mesh::QUAD_MESH);
+				
+				Polygon *imagePolygon = new Polygon();
+				imagePolygon->addVertex(0,1,0,0,0);	
+				imagePolygon->addVertex(1,1,0, 1, 0);			
+				imagePolygon->addVertex(1,0,0, 1, 1);		
+				imagePolygon->addVertex(0,0,0,0,1);
+
+				billboardMesh->addPolygon(imagePolygon);
+		
+		for(int i=0; i < billboardMesh->getPolygonCount(); i++) {
+			for(int j=0; j < billboardMesh->getPolygon(i)->getVertexCount(); j++) {
+				billboardMesh->getPolygon(i)->getVertex(j)->x = billboardMesh->getPolygon(i)->getVertex(j)->x - (1.0/2.0f);
+				billboardMesh->getPolygon(i)->getVertex(j)->z = billboardMesh->getPolygon(i)->getVertex(j)->z - (1.0/2.0f);
+			}
+		}
+
+		billboardMesh->calculateNormals();
+		billboardMesh->arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;		
+		billboardMesh->arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true;				
+		billboardMesh->arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;						
+		billboardMesh->arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;					
+				
+			} 
+			SceneMesh *primitive = new SceneMesh(billboardMesh);
+			
+			primitive->setMaterial(material);
 			primitive->billboardMode = true;
 			primitive->billboardRoll = true;
 //			primitive->alphaTest = true;
@@ -55,7 +83,7 @@ void Particle::createSceneParticle(int particleType, Texture *texture, Mesh *par
 			SceneMesh *primitive = new SceneMesh(particleMesh);
 			if(particleMesh->getMeshType() == Mesh::TRI_MESH)
 				primitive->cacheToVertexBuffer(true);
-			primitive->setTexture(texture);
+			primitive->setMaterial(material);
 			//			primitive->billboardMode = true;
 			//			primitive->billboardRoll = true;
 			//primitive->depthTest = false;
@@ -71,8 +99,11 @@ void Particle::createSceneParticle(int particleType, Texture *texture, Mesh *par
 
 void Particle::createScreenParticle(int particleType, Texture *texture, Mesh *particleMesh) {
 	
-	ScreenShape *primitive = new ScreenShape(ScreenShape::SHAPE_RECT, 1.0f, 1.0f);
+	ScreenShape *primitive = new ScreenShape(ScreenShape::SHAPE_RECT, 10.0f, 10.0f);
 	primitive->setTexture(texture);	
+//	primitive->billboardMode = true;
+//	primitive->billboardRoll = true;
+	
 	particleBody = primitive;			
 	return;
 	

+ 41 - 52
Core/Contents/Source/PolyParticleEmitter.cpp

@@ -24,7 +24,7 @@
 
 using namespace Polycode;
 
-SceneParticleEmitter::SceneParticleEmitter(String imageFile, Mesh *particleMesh, SceneMesh *emitter, Scene *particleParentScene, int particleType, int emitterType, Number lifespan, unsigned int numParticles, Vector3 direction, Vector3 gravity, Vector3 deviation)
+SceneParticleEmitter::SceneParticleEmitter(String imageFile, Scene *particleParentScene, int particleType, int emitterType, Number lifespan, unsigned int numParticles, Vector3 direction, Vector3 gravity, Vector3 deviation, Mesh *particleMesh, SceneMesh *emitter)
 : ParticleEmitter(imageFile, particleMesh, particleType, emitterType, lifespan, numParticles,  direction, gravity, deviation),
 SceneEntity()
 {
@@ -51,8 +51,8 @@ void SceneParticleEmitter::Update() {
 }
 
 
-ScreenParticleEmitter::ScreenParticleEmitter(String imageFile, Mesh *particleMesh, ScreenMesh *emitter, Screen *particleParentScreen, int particleType, int emitterType, Number lifespan, unsigned int numParticles, Vector3 direction, Vector3 gravity, Vector3 deviation) 
-: ParticleEmitter(imageFile, particleMesh, particleType, emitterType, lifespan, numParticles,  direction, gravity, deviation),
+ScreenParticleEmitter::ScreenParticleEmitter(String imageFile, Screen *particleParentScreen, int particleType, int emitterType, Number lifespan, unsigned int numParticles, Vector3 direction, Vector3 gravity, Vector3 deviation, Mesh *particleMesh, ScreenMesh *emitter)
+		: ParticleEmitter(imageFile, particleMesh, particleType, emitterType, lifespan, numParticles,  direction, gravity, deviation),
 ScreenEntity()
 {
 	isScreenEmitter = true;
@@ -87,18 +87,12 @@ ParticleEmitter::ParticleEmitter(String imageFile, Mesh *particleMesh, int parti
 	this->deviation = deviation;
 	pMesh = particleMesh;
 	rotationFollowsPath = false;
-	rotationSpeed = 0.0f;
-	startingColor.setColor(1.0f,1.0f,1.0f,1.0f);
-	endingColor.setColor(1.0f,1.0f,1.0f,1.0f);	
+	rotationSpeed = 100.0f;
 	perlinEnabled = false;
-	startingScaleMod = 1.0f;
-	endingScaleMod = 1.0f;
-	emitterRadius = 0.0f;
+	emitterRadius = Vector3(0.0f,0.0f,0.0f);
 	perlinModSize = 0.002;
 	brightnessDeviation = 0.0f;
 	particleSpeedMod = 1.0f;
-	emitRotationVector.set(0.0f, 0.0f, 0.0f);
-	emitRotationDeviance.set(360.0f, 360.0f, 360.0f);
 	isEmitterEnabled = true;
 	allAtOnce = false;
 	
@@ -111,14 +105,17 @@ ParticleEmitter::ParticleEmitter(String imageFile, Mesh *particleMesh, int parti
 	motionPerlin = new Perlin(3,5,1.0,rand());
 	
 	textureFile = imageFile;
+	
+	useColorCurves = false;
+	useScaleCurves = false;	
 }
 
 void ParticleEmitter::createParticles() {
 	
-//	if(isScreenEmitter)
+	if(isScreenEmitter)
 		particleTexture = CoreServices::getInstance()->getMaterialManager()->createTextureFromFile(textureFile);	
-//	else
-//		particleMaterial = (Material*)CoreServices::getInstance()->getResourceManager()->getResource(Resource::RESOURCE_MATERIAL, textureFile);	
+	else
+		particleMaterial = (Material*)CoreServices::getInstance()->getResourceManager()->getResource(Resource::RESOURCE_MATERIAL, textureFile);	
 	
 	
 	Particle *particle;	
@@ -136,29 +133,14 @@ void ParticleEmitter::createParticles() {
 	updateEmitter();	
 }
 
-void ParticleEmitter::setEmitterRadius(Number rad) {
+void ParticleEmitter::setEmitterRadius(Vector3 rad) {
 	emitterRadius = rad;
 }
 
-void ParticleEmitter::setEndingColor(Color c) {
-	endingColor = c;
-}
-
-void ParticleEmitter::setStartingColor(Color c) {
-	startingColor = c;
-}
-
 void ParticleEmitter::setRotationSpeed(Number speed) {
 	rotationSpeed = speed;
 }
 
-void ParticleEmitter::setStartingScaleModifier(Number mod) {
-	startingScaleMod = mod;
-}
-
-void ParticleEmitter::setEndingScaleModifier(Number mod) {
-	endingScaleMod = mod;
-}
 
 void ParticleEmitter::setParticleBlendingMode(int mode) {
 	for(int i=0;i < particles.size(); i++) {
@@ -191,14 +173,6 @@ void ParticleEmitter::setBillboardMode(bool mode) {
 	}
 }
 
-void ParticleEmitter::setEmitRotationVector(Vector3 rotVector) {
-	emitRotationVector = rotVector;
-}
-
-void ParticleEmitter::setEmitRotationDeviance(Vector3 rotVector) {
-	emitRotationDeviance = rotVector;
-}
-
 void ParticleEmitter::enablePerlin(bool val) {
 	perlinEnabled = val;
 }
@@ -269,7 +243,7 @@ void ParticleEmitter::resetParticle(Particle *particle) {
 //		startVector = *randPoly->getVertex(rand() % 3);
 //		startVector = emitterMesh->getConcatenatedMatrix() * startVector;
 //	} else {
-		startVector = Vector3(-(emitterRadius/2.0f)+emitterRadius*((Number)rand()/RAND_MAX),-(emitterRadius/2.0f)+emitterRadius*((Number)rand()/RAND_MAX),-(emitterRadius/2.0f)+emitterRadius*((Number)rand()/RAND_MAX));	
+		startVector = Vector3(-(emitterRadius.x/2.0f)+emitterRadius.x*((Number)rand()/RAND_MAX),-(emitterRadius.y/2.0f)+emitterRadius.y*((Number)rand()/RAND_MAX),-(emitterRadius.z/2.0f)+emitterRadius.z*((Number)rand()/RAND_MAX));	
 //	}
 	
 	particle->Reset(emitterType != TRIGGERED_EMITTER);	
@@ -288,18 +262,18 @@ void ParticleEmitter::resetParticle(Particle *particle) {
 	particle->particleBody->Translate(startVector);
 	particle->particleBody->rebuildTransformMatrix();	
 	
-//	particle->particleBody->setPitch(emitRotationVector.y+(emitRotationDeviance.y*((Number)rand()/RAND_MAX)));
-//	particle->particleBody->setRoll(emitRotationVector.x+(emitRotationDeviance.x*((Number)rand()/RAND_MAX)));
-//	particle->particleBody->setYaw(emitRotationVector.z+(emitRotationDeviance.z*((Number)rand()/RAND_MAX)));	
-	
-	particle->particleBody->setScale(scaleCurve.getHeightAt(0),
+	if(useScaleCurves) {
+		particle->particleBody->setScale(scaleCurve.getHeightAt(0),
 									 scaleCurve.getHeightAt(0),
 									 scaleCurve.getHeightAt(0));
-
-	particle->particleBody->color.setColor(colorCurveR.getHeightAt(0),
+	}
+	
+	if(useColorCurves) {
+		particle->particleBody->color.setColor(colorCurveR.getHeightAt(0),
 										   colorCurveG.getHeightAt(0),
 										   colorCurveB.getHeightAt(0),
 										   colorCurveA.getHeightAt(0));
+	}
 	
 			
 }
@@ -322,7 +296,7 @@ void ParticleEmitter::updateEmitter() {
 	Particle *particle;
 	Number normLife;
 	
-	for(int i=0;i < numParticles; i++) {				
+	for(int i=0;i < numParticles; i++) {	
 		particle = particles[i];
 		
 		normLife = particle->life / particle->lifespan;
@@ -337,10 +311,19 @@ void ParticleEmitter::updateEmitter() {
 			translationVector.z += ((perlinModSize * motionPerlin->Get((particle->life/particle->lifespan), particle->perlinPosZ))*elapsed*particleSpeedMod);
 		}
 		
+		if(isScreenEmitter) {		
+			translationVector.z = 0;
+		}
+		
 		particle->particleBody->Translate(translationVector);
 		
+		
 		if(rotationFollowsPath)  {
-			particle->particleBody->lookAt(particle->particleBody->getPosition() + translationVector, Vector3(1,0,0));			
+			if(isScreenEmitter) {
+				particle->particleBody->lookAt(particle->particleBody->getPosition() + translationVector, Vector3(1,0,0));													
+			} else {
+				particle->particleBody->lookAt(particle->particleBody->getPosition() + translationVector, Vector3(1,0,0));			
+			}
 		} else {
 			if(isScreenEmitter) {
 				particle->particleBody->Roll(rotationSpeed*elapsed);
@@ -351,16 +334,22 @@ void ParticleEmitter::updateEmitter() {
 			}
 		}		
 		
-		particle->particleBody->color.setColor(colorCurveR.getHeightAt(normLife)*particle->brightnessDeviation,
+//		if(isScreenEmitter)
+//			particle->particleBody->setPositionZ(0);		
+		
+		if(useColorCurves) {
+			particle->particleBody->color.setColor(colorCurveR.getHeightAt(normLife)*particle->brightnessDeviation,
 											   colorCurveG.getHeightAt(normLife)*particle->brightnessDeviation,
 											   colorCurveB.getHeightAt(normLife)*particle->brightnessDeviation,
 											   colorCurveA.getHeightAt(normLife)*particle->brightnessDeviation);
-											   		
-
-		particle->particleBody->setScale(scaleCurve.getHeightAt(normLife),
+		}
+	
+		if(useScaleCurves) {
+			particle->particleBody->setScale(scaleCurve.getHeightAt(normLife),
 										 scaleCurve.getHeightAt(normLife),
 										 scaleCurve.getHeightAt(normLife));
 		
+		}
 		if(particle->life > particle->lifespan && isEmitterEnabled) {
 			if(emitterType == CONTINUOUS_EMITTER) {
 				resetParticle(particle);

+ 2 - 2
Core/Contents/Source/PolyScene.cpp

@@ -229,12 +229,12 @@ void Scene::Render(Camera *targetCamera) {
 void Scene::RenderDepthOnly(Camera *targetCamera) {
 	
 	CoreServices::getInstance()->getRenderer()->cullFrontFaces(true);
-	
+/*	
 	for(int i=0; i<entities.size();i++) {
 		entities[i]->doUpdates();		
 		entities[i]->updateEntityMatrix();
 	}
-	
+*/	
 	targetCamera->rebuildTransformMatrix();	
 	targetCamera->doCameraTransform();	
 	targetCamera->buildFrustrumPlanes();

Разница между файлами не показана из-за своего большого размера
+ 287 - 491
Player/Build/Mac OS X/Polycode Player.xcodeproj/project.xcworkspace/xcuserdata/ivansafrin.xcuserdatad/UserInterfaceState.xcuserstate


Некоторые файлы не были показаны из-за большого количества измененных файлов