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

LocalShaderParam data setters and getters will no longer crash if incorrect type is used

Ivan Safrin 11 лет назад
Родитель
Сommit
34e47016f3
2 измененных файлов с 81 добавлено и 11 удалено
  1. 11 11
      Core/Contents/Include/PolyShader.h
  2. 70 0
      Core/Contents/Source/PolyShader.cpp

+ 11 - 11
Core/Contents/Include/PolyShader.h

@@ -147,17 +147,17 @@ namespace Polycode {
             bool ownsPointer;
 		
             // Convenience getters/setters for Lua users
-            Number getNumber()         { return *((Number *)data); }
-            Vector2 getVector2()       { return *((Vector2 *)data); }
-            Vector3 getVector3()       { return *((Vector3 *)data); }
-            Matrix4 getMatrix4()       { return *((Matrix4 *)data); }
-            Color getColor()           { return *((Color *)data); }
-            void setNumber(Number x)   { memcpy(data, &x, sizeof(x)); }
-            void setVector2(Vector2 x) { memcpy(data, &x, sizeof(x)); }
-            void setVector3(Vector3 x) { memcpy(data, &x, sizeof(x)); }
-            void setMatrix4(Matrix4 x) { memcpy(data, &x, sizeof(x)); }
-            void setColor(Color x)     { static_cast<Color*>(data)->setColor(&x); }
-            
+            Number getNumber();
+            Vector2 getVector2();
+            Vector3 getVector3();
+            Matrix4 getMatrix4();
+            Color getColor();
+            void setNumber(Number x);
+            void setVector2(Vector2 x);
+            void setVector3(Vector3 x);
+            void setMatrix4(Matrix4 x);
+            void setColor(Color x);
+        
             void setParamValueFromString(int type, String pvalue);
 	};	
 	

+ 70 - 0
Core/Contents/Source/PolyShader.cpp

@@ -275,6 +275,76 @@ void Shader::setName(const String& name) {
 	this->name = name;
 }
 
+Number LocalShaderParam::getNumber() {
+    if(type != ProgramParam::PARAM_NUMBER) {
+        return 0.0;
+    }
+    return *((Number *)data);
+}
+
+Vector2 LocalShaderParam::getVector2() {
+    if(type != ProgramParam::PARAM_VECTOR2) {
+        return Vector2();
+    }
+    return *((Vector2 *)data);
+}
+
+Vector3 LocalShaderParam::getVector3() {
+    if(type != ProgramParam::PARAM_VECTOR3) {
+        return Vector3();
+    }
+    return *((Vector3 *)data);
+}
+
+Matrix4 LocalShaderParam::getMatrix4() {
+    if(type != ProgramParam::PARAM_MATRIX) {
+        return Matrix4();
+    }
+    return *((Matrix4 *)data);
+}
+
+Color LocalShaderParam::getColor() {
+    if(type != ProgramParam::PARAM_COLOR) {
+        return Color(0.0, 0.0, 0.0, 0.0);
+    }
+    return *((Color *)data);
+}
+
+void LocalShaderParam::setNumber(Number x) {
+    if(type != ProgramParam::PARAM_NUMBER) {
+        return;
+    }
+    memcpy(data, &x, sizeof(x));
+}
+
+void LocalShaderParam::setVector2(Vector2 x) {
+    if(type != ProgramParam::PARAM_VECTOR2) {
+        return;
+    }
+    memcpy(data, &x, sizeof(x));
+}
+
+void LocalShaderParam::setVector3(Vector3 x) {
+    if(type != ProgramParam::PARAM_VECTOR3) {
+        return;
+    }
+    memcpy(data, &x, sizeof(x));
+}
+
+void LocalShaderParam::setMatrix4(Matrix4 x) {
+    if(type != ProgramParam::PARAM_MATRIX) {
+        return;
+    }
+    memcpy(data, &x, sizeof(x));
+}
+
+void LocalShaderParam::setColor(Color x) {
+    if(type != ProgramParam::PARAM_COLOR) {
+        return;
+    }
+    static_cast<Color*>(data)->setColor(&x);
+}
+
 const String& Shader::getName() const {
 	return name;
 }