HelloPolycodeApp::HelloPolycodeApp(PolycodeView *view) { core = new POLYCODE_CORE(view, 640,480,false,true,0,0,90, 0, true); PhysicsScene2D *scene = new PhysicsScene2D(0.1, 50); ScenePrimitive *ceiling = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 2.0, 0.1); ceiling->setColor(0.0, 0.0, 0.0, 1.0); ceiling->setPosition(0, 0.5); scene->addPhysicsChild(ceiling, PhysicsScene2DEntity::ENTITY_RECT, true); // Revolute Joint ScenePrimitive *shape = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 0.03, 0.2); shape->setAnchorPoint(0.0, 1.0, 0.0); shape->setPosition(-0.3, 0.48); scene->addPhysicsChild(shape, PhysicsScene2DEntity::ENTITY_RECT, false); scene->createRevoluteJoint(shape, ceiling, 0.0, 0.01); scene->applyImpulse(shape, 10, 0); // Distance Joint shape = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 0.1, 0.02); shape->setPosition(0.0, 0.2); scene->addPhysicsChild(shape, PhysicsScene2DEntity::ENTITY_RECT, false); scene->createDistanceJoint(shape, ceiling, false); scene->applyImpulse(shape, 2, 0); SceneLine *line = new SceneLine(shape, ceiling); line->setColor(1.0, 0.0, 0.0, 1.0); scene->addChild(line); // Prismatic Joint shape = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 0.05, 0.1); shape->setPosition(0.3, 0.3); scene->addPhysicsChild(shape, PhysicsScene2DEntity::ENTITY_RECT, false); scene->createPrismaticJoint(ceiling, shape, Vector2(0,1), 0,0, false, -0.3, 0, true); SceneEntity *lineAnchor = new SceneEntity(); lineAnchor->setPosition(0.3,0.5); line = new SceneLine(shape, lineAnchor); line->setColor(0.0, 1.0, 0.0, 1.0); scene->addChild(line); }
void Skeleton::loadSkeleton(const String& fileName) { OSFILE *inFile = OSBasics::open(fileName.c_str(), "rb"); if(!inFile) { return; } bonesEntity = new SceneEntity(); bonesEntity->visible = false; addChild(bonesEntity); unsigned int numBones; float t[3],rq[4],s[3]; OSBasics::read(&numBones, sizeof(unsigned int), 1, inFile); unsigned int namelen; char buffer[1024]; Matrix4 mat; unsigned int hasParent, boneID; for(int i=0; i < numBones; i++) { OSBasics::read(&namelen, sizeof(unsigned int), 1, inFile); memset(buffer, 0, 1024); OSBasics::read(buffer, 1, namelen, inFile); Bone *newBone = new Bone(String(buffer)); OSBasics::read(&hasParent, sizeof(unsigned int), 1, inFile); if(hasParent == 1) { OSBasics::read(&boneID, sizeof(unsigned int), 1, inFile); newBone->parentBoneId = boneID; } else { newBone->parentBoneId = -1; } OSBasics::read(t, sizeof(float), 3, inFile); OSBasics::read(s, sizeof(float), 3, inFile); OSBasics::read(rq, sizeof(float), 4, inFile); bones.push_back(newBone); newBone->setPosition(t[0], t[1], t[2]); newBone->setRotationQuat(rq[0], rq[1], rq[2], rq[3]); newBone->setScale(s[0], s[1], s[2]); newBone->rebuildTransformMatrix(); newBone->setBaseMatrix(newBone->getTransformMatrix()); newBone->setBoneMatrix(newBone->getTransformMatrix()); OSBasics::read(t, sizeof(float), 3, inFile); OSBasics::read(s, sizeof(float), 3, inFile); OSBasics::read(rq, sizeof(float), 4, inFile); Quaternion q; q.set(rq[0], rq[1], rq[2], rq[3]); Matrix4 m = q.createMatrix(); m.setPosition(t[0], t[1], t[2]); newBone->setRestMatrix(m); } Bone *parentBone; // SceneEntity *bProxy; for(int i=0; i < bones.size(); i++) { if(bones[i]->parentBoneId != -1) { parentBone = bones[bones[i]->parentBoneId]; parentBone->addChildBone(bones[i]); bones[i]->setParentBone(parentBone); parentBone->addEntity(bones[i]); // addEntity(bones[i]); SceneLine *connector = new SceneLine(bones[i], parentBone); connector->depthTest = false; bonesEntity->addEntity(connector); connector->setColor(((Number)(rand() % RAND_MAX)/(Number)RAND_MAX),((Number)(rand() % RAND_MAX)/(Number)RAND_MAX),((Number)(rand() % RAND_MAX)/(Number)RAND_MAX),1.0f); } else { // bProxy = new SceneEntity(); // addEntity(bProxy); // bProxy->addEntity(bones[i]); bonesEntity->addChild(bones[i]); } // bones[i]->visible = false; } OSBasics::close(inFile); }
void Skeleton::loadSkeleton(const String& fileName) { OSFILE *inFile = OSBasics::open(fileName.c_str(), "rb"); if(!inFile) { return; } bonesEntity = new SceneEntity(); bonesEntity->visible = false; addChild(bonesEntity); unsigned int numBones; float t[3],rq[4],s[3]; OSBasics::read(&numBones, sizeof(unsigned int), 1, inFile); unsigned int namelen; char buffer[1024]; Matrix4 mat; unsigned int hasParent, boneID; for(int i=0; i < numBones; i++) { OSBasics::read(&namelen, sizeof(unsigned int), 1, inFile); memset(buffer, 0, 1024); OSBasics::read(buffer, 1, namelen, inFile); Bone *newBone = new Bone(String(buffer)); OSBasics::read(&hasParent, sizeof(unsigned int), 1, inFile); if(hasParent == 1) { OSBasics::read(&boneID, sizeof(unsigned int), 1, inFile); newBone->parentBoneId = boneID; } else { newBone->parentBoneId = -1; } OSBasics::read(t, sizeof(float), 3, inFile); OSBasics::read(s, sizeof(float), 3, inFile); OSBasics::read(rq, sizeof(float), 4, inFile); bones.push_back(newBone); newBone->setPosition(t[0], t[1], t[2]); newBone->setRotationQuat(rq[0], rq[1], rq[2], rq[3]); newBone->setScale(s[0], s[1], s[2]); newBone->rebuildTransformMatrix(); newBone->setBaseMatrix(newBone->getTransformMatrix()); newBone->setBoneMatrix(newBone->getTransformMatrix()); OSBasics::read(t, sizeof(float), 3, inFile); OSBasics::read(s, sizeof(float), 3, inFile); OSBasics::read(rq, sizeof(float), 4, inFile); Quaternion q; q.set(rq[0], rq[1], rq[2], rq[3]); Matrix4 m = q.createMatrix(); m.setPosition(t[0], t[1], t[2]); newBone->setRestMatrix(m); } Bone *parentBone; // SceneEntity *bProxy; for(int i=0; i < bones.size(); i++) { if(bones[i]->parentBoneId != -1) { parentBone = bones[bones[i]->parentBoneId]; parentBone->addChildBone(bones[i]); bones[i]->setParentBone(parentBone); parentBone->addEntity(bones[i]); // addEntity(bones[i]); SceneLine *connector = new SceneLine(bones[i], parentBone); connector->depthTest = false; bonesEntity->addEntity(connector); connector->setColor(((Number)(rand() % RAND_MAX)/(Number)RAND_MAX),((Number)(rand() % RAND_MAX)/(Number)RAND_MAX),((Number)(rand() % RAND_MAX)/(Number)RAND_MAX),1.0f); } else { // bProxy = new SceneEntity(); // addEntity(bProxy); // bProxy->addEntity(bones[i]); bonesEntity->addChild(bones[i]); } // bones[i]->visible = false; } /* unsigned int numAnimations, activeBones,boneIndex,numPoints,numCurves, curveType; OSBasics::read(&numAnimations, sizeof(unsigned int), 1, inFile); //Logger::log("numAnimations: %d\n", numAnimations); for(int i=0; i < numAnimations; i++) { OSBasics::read(&namelen, sizeof(unsigned int), 1, inFile); memset(buffer, 0, 1024); OSBasics::read(buffer, 1, namelen, inFile); float length; OSBasics::read(&length, 1, sizeof(float), inFile); SkeletonAnimation *newAnimation = new SkeletonAnimation(buffer, length); OSBasics::read(&activeBones, sizeof(unsigned int), 1, inFile); // Logger::log("activeBones: %d\n", activeBones); for(int j=0; j < activeBones; j++) { OSBasics::read(&boneIndex, sizeof(unsigned int), 1, inFile); BoneTrack *newTrack = new BoneTrack(bones[boneIndex], length); BezierCurve *curve; float vec1[2]; //,vec2[2],vec3[2]; OSBasics::read(&numCurves, sizeof(unsigned int), 1, inFile); // Logger::log("numCurves: %d\n", numCurves); for(int l=0; l < numCurves; l++) { curve = new BezierCurve(); OSBasics::read(&curveType, sizeof(unsigned int), 1, inFile); OSBasics::read(&numPoints, sizeof(unsigned int), 1, inFile); for(int k=0; k < numPoints; k++) { OSBasics::read(vec1, sizeof(float), 2, inFile); curve->addControlPoint2d(vec1[1], vec1[0]); // curve->addControlPoint(vec1[1]-10, vec1[0], 0, vec1[1], vec1[0], 0, vec1[1]+10, vec1[0], 0); } switch(curveType) { case 0: newTrack->scaleX = curve; break; case 1: newTrack->scaleY = curve; break; case 2: newTrack->scaleZ = curve; break; case 3: newTrack->QuatW = curve; break; case 4: newTrack->QuatX = curve; break; case 5: newTrack->QuatY = curve; break; case 6: newTrack->QuatZ = curve; break; case 7:; newTrack->LocX = curve; break; case 8: newTrack->LocY = curve; break; case 9: newTrack->LocZ = curve; break; } } newAnimation->addBoneTrack(newTrack); } animations.push_back(newAnimation); } */ OSBasics::close(inFile); }