diff --git a/script.py b/script.py index f334add..af36225 100644 --- a/script.py +++ b/script.py @@ -7,9 +7,9 @@ def exportData(ob): par = par.parent file.write('{\n' + ob.type + ": " + ob.name + '\n') - file.write('pos: ' + str(ob.location.x) + ' ' + str(ob.location.y) + ' ' + str(ob.location.z) + '\n') - file.write('rot: ' + str(ob.rotation_quaternion.w) + ' ' + str(ob.rotation_quaternion.x) + ' ' + str(ob.rotation_quaternion.y) + ' ' + str(-ob.rotation_quaternion.z) + '\n') - file.write('scale: ' + str(ob.scale.x) + ' ' + str(ob.scale.y) + ' ' + str(ob.scale.z) + '\n') + file.write('pos: ' + str(ob.location.x) + ' ' + str(ob.location.y) + ' ' + str(ob.location.z) + ' \n') + file.write('rot: ' + str(ob.rotation_quaternion.w) + ' ' + str(ob.rotation_quaternion.x) + ' ' + str(ob.rotation_quaternion.y) + ' ' + str(-ob.rotation_quaternion.z) + ' \n') + file.write('scale: ' + str(ob.scale.x) + ' ' + str(ob.scale.y) + ' ' + str(ob.scale.z) + ' \n') file.write('parent: ' + ('-' if par is None else par.name) + '\n') numAnims = 0 @@ -105,11 +105,26 @@ def exportData(ob): pos = vert.co file.write(str(pos.x) + ' ' + str(pos.y) + ' ' + str(pos.z) + ' \n') channels.extend(mesh.shape_keys.animation_data.drivers) + elif ob.type == 'LIGHT': + color = ob.data.color + outerAngle = 0 + innerAngle = 0 + type = ob.data.type + if type == 'SPOT': + outerAngle = ob.data.spot_size + innerAngle = outerAngle * ob.data.spot_blend + file.write('type: ' + type + '\n') + file.write('color: ' + str(color[0]) + ' ' + str(color[1]) + ' ' + str(color[2]) + ' \n') + file.write('outerAngle: ' + str(outerAngle) + ' \n') + file.write('innerAngle: ' + str(innerAngle) + ' \n') file.write('animations: ' + str(numAnims) + '\n') - if numAnims > 0: + if ob.type != 'LIGHT' and numAnims > 0: readAnimations(ob, numAnims) + elif ob.type == 'LIGHT': + readAnimations(ob, len(ob.animation_data.nla_tracks[0].strips)) + readAnimations(ob.data, len(ob.data.animation_data.nla_tracks[0].strips)) if ob.animation_data is not None: channels.extend(ob.animation_data.drivers) @@ -233,7 +248,7 @@ for s in selectedObjects: if inObjects == False: objects.append(sPar) -file=open(fl, 'w') +file = open(fl, 'w') for ob in selectedObjects: exportData(ob) file.write('}\n') diff --git a/vbModelReader.cpp b/vbModelReader.cpp index 250f0f2..0640baf 100644 --- a/vbModelReader.cpp +++ b/vbModelReader.cpp @@ -1,16 +1,17 @@ -#include"vbModelReader.h" -#include"util.h" -#include"vector.h" -#include"mesh.h" -#include"skeleton.h" -#include"bone.h" -#include"model.h" -#include"animation.h" -#include"animationController.h" +#include "vbModelReader.h" +#include "util.h" +#include "vector.h" +#include "light.h" +#include "mesh.h" +#include "skeleton.h" +#include "bone.h" +#include "model.h" +#include "animation.h" +#include "animationController.h" -#include -#include -#include +#include +#include +#include using namespace std; @@ -323,12 +324,7 @@ namespace vb01{ int boneStartLine = 6; int numBones = atoi(data[1].c_str()); int animationStartLine = boneStartLine + numBones; - int driverStartLine = animationStartLine; - for(int i = animationStartLine; i < skeletonData.size(); i++) - if(skeletonData[i].find_first_of(':') != -1 && skeletonData[i].substr(0, skeletonData[i].length() - 1) == "drivers: "){ - driverStartLine = i; - break; - } + int driverStartLine = findDriverStartLine(skeletonData, animationStartLine); AnimationController *controller = new AnimationController(); Skeleton *skeleton = new Skeleton(controller, name); @@ -498,12 +494,7 @@ namespace vb01{ int faceStartLine = vertexStartLine + numVertices + 1; int shapeKeyStartLine = faceStartLine + numFaces * numVertsPerFace + 1; int animationStartLine = shapeKeyStartLine + numShapes * (1 + numVertices); - int driverStartLine = animationStartLine; - for(int i = animationStartLine; i < meshData.size(); i++) - if(meshData[i].find_first_of(':') != -1 && meshData[i].substr(0, meshData[i].length() - 1) == "drivers: "){ - driverStartLine = i; - break; - } + int driverStartLine = findDriverStartLine(meshData, animationStartLine); vector vertPos, vertNorm; vector vertWeights; @@ -568,6 +559,58 @@ namespace vb01{ } void VbModelReader::readLights(vector &lightData){ + string name = lightData[0].substr(lightData[0].find_first_of(':') + 2); + string data[4]; + getLineData(lightData[1].substr(lightData[1].find_first_of(':') + 2), data, 3); + Vector3 pos = Vector3(atof(data[0].c_str()), atof(data[1].c_str()), atof(data[2].c_str())); + getLineData(lightData[2].substr(lightData[2].find_first_of(':') + 2), data, 4); + Quaternion rot = Quaternion(atof(data[0].c_str()), atof(data[1].c_str()), atof(data[2].c_str()), atof(data[3].c_str())); + getLineData(lightData[3].substr(lightData[3].find_first_of(':') + 2), data, 3); + Vector3 scale = Vector3(atof(data[0].c_str()), atof(data[1].c_str()) + 2, atof(data[2].c_str())); + string parent = lightData[4].substr(lightData[4].find_first_of(':') + 2); + string typeStr = lightData[5].substr(lightData[5].find_first_of(':') + 2); + Light::Type type; + if(typeStr == "POINT") + type = Light::POINT; + else if(typeStr == "SUN") + type = Light::DIRECTIONAL; + else if(typeStr == "SPOT") + type = Light::SPOT; + else if(typeStr == "AREA") + type = Light::AMBIENT; + getLineData(lightData[6].substr(lightData[6].find_first_of(':') + 2), data, 3); + Vector3 color = Vector3(atof(data[0].c_str()), atof(data[1].c_str()), atof(data[2].c_str())); + float outerAngle = atof(lightData[7].substr(lightData[7].find_first_of(':') + 2).c_str()); + float innerAngle = atof(lightData[8].substr(lightData[8].find_first_of(':') + 2).c_str()); + + Light *light = new Light(type); + light->setColor(color); + light->setOuterAngle(outerAngle); + light->setInnerAngle(innerAngle); + + AnimationController *controller = new AnimationController(); + Node *node = new Node(pos, rot, scale, name, controller); + nodes.push_back(node); + + int animationStartLine = 9; + int driverStartLine = findDriverStartLine(lightData, animationStartLine); + vector lightSubData = vector(lightData.begin() + animationStartLine, lightData.begin() + driverStartLine); + readAnimations(node, controller, lightSubData); + lightSubData.clear(); + + lightSubData = vector(lightData.begin() + driverStartLine, lightData.end()); + readDrivers(lightSubData, name); + lightSubData.clear(); + } + + int VbModelReader::findDriverStartLine(vector &data, int animationStartLine){ + int driverStartLine = animationStartLine; + for(int i = animationStartLine; i < data.size(); i++) + if(data[i].find_first_of(':') != -1 && data[i].substr(0, data[i].length() - 1) == "drivers: "){ + driverStartLine = i; + break; + } + return driverStartLine; } } diff --git a/vbModelReader.h b/vbModelReader.h index f34d140..86d9b8e 100644 --- a/vbModelReader.h +++ b/vbModelReader.h @@ -24,6 +24,7 @@ namespace vb01{ void getObjectBounds(std::map&, std::map&, std::map&); void connectNodes(); void setupDrivers(); + int findDriverStartLine(std::vector&, int); void createBones(Skeleton*, std::vector&); KeyframeChannel readKeyframeChannel(Animatable*, std::vector&, int&); void readAnimations(Animatable*, AnimationController*, std::vector&);