Browse Source

Fixed Lua bindings not returning NULL pointer members in C++ classes properly, added a Lua-accessible vector multiply method to Matrix4, added an option to disable animations in a specific skeleton bone, fixed SceneLabel saving in entity editor broken in previous commit, minor 3d physics bugfixes, fixed bounding box calculation bug in Mesh introduced by recent mesh changes

Ivan Safrin 11 năm trước cách đây
mục cha
commit
7d86739ff5

+ 8 - 5
Bindings/Scripts/create_lua_library/create_lua_library.py

@@ -16,7 +16,7 @@ def mkdir_p(path): # Same effect as mkdir -p, create dir and all necessary paren
 		else: raise
 
 def template_returnPtrLookupArray(prefix, className, ptr):
-	out = ""
+	out = "%sif %s == nil then return nil end\n" % (prefix, ptr)
 	out += "%sfor i=1,count(%s) do\n" % (prefix, ptr)
 	out += "%s\tlocal __c  = _G[%s](\"__skip_ptr__\")\n" % (prefix, className.replace("*", ""))
 	out += "%s\t__c.__ptr = %s[i]\n" % (prefix, ptr)
@@ -27,7 +27,7 @@ def template_returnPtrLookupArray(prefix, className, ptr):
 
 # Note we expect className to be a valid string
 def template_returnPtrLookup(prefix, className, ptr):
-	out = ""
+	out = "%sif %s == nil then return nil end\n" % (prefix, ptr)
 	out += "%slocal __c = _G[%s](\"__skip_ptr__\")\n" % (prefix, className.replace("*", ""))
 	out += "%s__c.__ptr = %s\n" % (prefix, ptr)
 	out += "%sreturn __c\n" % (prefix)
@@ -319,8 +319,12 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 								wrappersHeaderOut += "\t%s(L, inst->%s%s);\n" % (outfunc, pp["name"], retFunc)
 							else:
 								if pp["type"].find("*") != -1:
-									wrappersHeaderOut += "\tPolyBase **userdataPtr = (PolyBase**)lua_newuserdata(L, sizeof(PolyBase*));\n"
-									wrappersHeaderOut += "\t*userdataPtr = (PolyBase*)inst->%s%s;\n" % (pp["name"], retFunc)
+									wrappersHeaderOut += "\tif(!inst->%s%s) {\n" % (pp["name"], retFunc)
+									wrappersHeaderOut += "\t\tlua_pushnil(L);\n"
+									wrappersHeaderOut += "\t} else {\n"
+									wrappersHeaderOut += "\t\tPolyBase **userdataPtr = (PolyBase**)lua_newuserdata(L, sizeof(PolyBase*));\n"
+									wrappersHeaderOut += "\t\t*userdataPtr = (PolyBase*)inst->%s%s;\n" % (pp["name"], retFunc)
+									wrappersHeaderOut += "\t}\n"
 								else:
 									wrappersHeaderOut += "\tPolyBase **userdataPtr = (PolyBase**)lua_newuserdata(L, sizeof(PolyBase*));\n"
 									wrappersHeaderOut += "\t*userdataPtr = (PolyBase*)&inst->%s%s;\n" % (pp["name"], retFunc)
@@ -731,7 +735,6 @@ def createLUABindings(inputPath, prefix, mainInclude, libSmallName, libName, api
 							if basicType == True: # Yes, a primitive
 								luaClassBindingOut += "\treturn retVal\n"
 							else: # Yes, a pointer was returned
-								luaClassBindingOut += "\tif retVal == nil then return nil end\n"
 								if vectorReturn == True:
 									className = vectorReturnClass.replace("*", "")
 									luaClassBindingOut += template_returnPtrLookupArray("\t",template_quote(className),"retVal")

+ 2 - 0
Core/Contents/Include/PolyBone.h

@@ -156,6 +156,8 @@ namespace Polycode {
             Vector3 baseScale;
             Vector3 basePosition;
         
+            bool disableAnimation;
+        
 		protected:
 			Bone* parentBone;
 			std::vector<Bone*> childBones;

+ 8 - 3
Core/Contents/Include/PolyMatrix4.h

@@ -129,11 +129,16 @@ namespace Polycode {
                            n*m[3][0], n*m[3][1], n*m[3][2], n*m[3][3]);
             }
         
+            inline Vector3 multVector( const Vector3 &v2 ) const
+            {
+                return Vector3(v2.x*m[0][0] + v2.y*m[1][0] + v2.z*m[2][0] + m[3][0],
+                               v2.x*m[0][1] + v2.y*m[1][1] + v2.z*m[2][1] + m[3][1],
+                               v2.x*m[0][2] + v2.y*m[1][2] + v2.z*m[2][2] + m[3][2]);
+            }
+        
 			inline Vector3 operator * ( const Vector3 &v2 ) const
 			{
-				return Vector3(v2.x*m[0][0] + v2.y*m[1][0] + v2.z*m[2][0] + m[3][0],
-								v2.x*m[0][1] + v2.y*m[1][1] + v2.z*m[2][1] + m[3][1],
-								v2.x*m[0][2] + v2.y*m[1][2] + v2.z*m[2][2] + m[3][2]);
+				return multVector(v2);
 			}			
 			
 			inline Number* operator [] ( int row ) { return m[row];}

+ 1 - 0
Core/Contents/Source/PolyBone.cpp

@@ -33,6 +33,7 @@ Bone::Bone(const String& boneName) : Entity() {
 	this->boneName = boneName;
 	parentBone = NULL;
 	boneMatrix.identity();
+    disableAnimation = false;
 }
 
 Bone::~Bone() {

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

@@ -657,8 +657,8 @@ Vector3 Mesh::calculateBBox() {
     
     for(int i=0; i < vertexPositionArray.data.size()-2; i += 3) {
 		retVec.x = max(retVec.x,(Number)fabs(vertexPositionArray.data[i]));
-		retVec.y = max(retVec.y,(Number)fabs(vertexPositionArray.data[i]+1));
-		retVec.z = max(retVec.z,(Number)fabs(vertexPositionArray.data[i]+2));
+		retVec.y = max(retVec.y,(Number)fabs(vertexPositionArray.data[i+1]));
+		retVec.z = max(retVec.z,(Number)fabs(vertexPositionArray.data[i+2]));
     }
     
     if(retVec.x == 0.0) {

+ 8 - 3
Core/Contents/Source/PolySkeleton.cpp

@@ -118,9 +118,11 @@ SkeletonAnimation *Skeleton::getAnimation(const String& name) const {
 void Skeleton::Update() {
     
     for(int i=0; i < bones.size(); i++) {
-        bones[i]->setRotationByQuaternion(bones[i]->baseRotation);
-        bones[i]->setPosition(bones[i]->basePosition);
-        bones[i]->setScale(bones[i]->baseScale);
+        if(!bones[i]->disableAnimation) {
+            bones[i]->setRotationByQuaternion(bones[i]->baseRotation);
+            bones[i]->setPosition(bones[i]->basePosition);
+            bones[i]->setScale(bones[i]->baseScale);
+        }
     }
     
     if(baseAnimation) {
@@ -440,6 +442,9 @@ void BoneTrack::Update(Number elapsed) {
         boneQuat = quatCurve->interpolate(time/length, true);
     }
 
+    if(targetBone->disableAnimation) {
+        return;
+    }
     
     Quaternion rotationQuat = targetBone->getRotationQuat();
     rotationQuat = Quaternion::Slerp(weight, rotationQuat, boneQuat, true);

+ 13 - 0
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -2254,6 +2254,19 @@ void PolycodeEntityEditor::saveEntityToObjectEntry(Entity *entity, ObjectEntry *
         
     }
     
+    if(dynamic_cast<SceneLabel*>(entity)) {
+        SceneLabel *label = (SceneLabel*) entity;
+        
+        if(!(*(entry))["type"])
+            entry->addChild("type", "SceneLabel");
+        ObjectEntry *labelEntry = entry->addChild("SceneLabel");
+        labelEntry->addChild("text", label->getText());
+        labelEntry->addChild("font", label->getLabel()->getFont()->getFontName());
+        labelEntry->addChild("size", (Number)label->getLabel()->getSize());
+        labelEntry->addChild("actualHeight", label->getLabelActualHeight());
+        labelEntry->addChild("aaMode", (int)label->getLabel()->getAntialiasMode());
+    }
+    
     if(dynamic_cast<SceneLight*>(entity)) {
         SceneLight *light = (SceneLight*) entity;
         if(!(*(entry))["type"]) {

+ 4 - 0
Modules/Contents/3DPhysics/Source/PolyPhysicsScene.cpp

@@ -35,6 +35,10 @@ using namespace Polycode;
 
 PhysicsSceneEvent::PhysicsSceneEvent() : Event () {
 	eventType = "PhysicsSceneEvent";
+    collisionEntityA = NULL;
+    collisionEntityB = NULL;
+    entityA = NULL;
+    entityB = NULL;
 }
 
 PhysicsSceneEvent::~PhysicsSceneEvent() {