void SceneManager::Apply() { for (int n=0;n<mToApplyCount;n++) { Node * pRootNode = mToApply[n]; //if (pRootNode->IsInFrustum()) { pRootNode->Apply(); } } }
bool DefaultVisitor::Visit(CameraNode* node) { std::cout << std::string(m_level, ' ') << "CameraNode " << std::endl; m_level++; for (auto o : *node) { Node* child = As<Node*>(o); if (child) child->Apply(this); } m_level--; return true; }
bool DefaultVisitor::Visit(ArmatureNode* node) { std::cout << std::string(m_level, ' ') << "ArmatureNode" << std::endl; Virtual::Armature* armature = Virtual::Armature::find(node->GetStorageName()); for (int i = 0; i < armature->GetBonesCount(); ++i) { Virtual::Bone* bone = armature->GetBoneByIndex(i); // out_message() << bone->GetName() << ": " << std::endl << bone->GetAnimatedGlobalMatrix().ToString() << std::endl; } m_level++; for (auto o : *node) { Node* child = As<Node*>(o); if (child) child->Apply(this); } m_level--; return true; }
double NodeSegmentDistance(Segment* s, Node* p) { Vector* v = new Vector(s->B(), s->A()); Vector* w = new Vector(p, s->A()); double c1 = DotProduct(w, v); if (c1 <= 0) { return Distance(p, s->A()); } double c2 = DotProduct(v, v); if (c2 <= c1) { return Distance(p, s->B()); } double b = c1 / c2; v->Multiply(b); Node* pb = new Node(p->X(), p->Y()); pb->Apply(v); return Distance(p, pb); }
bool PlayerAI::Tick(double time){ //Vector p = Vector(GetPosition()); //printf("Player (%f,%f,%f)\n",p.X,p.Y,p.Z); switch(state){ case ST_EXPLODE_INIT: //printf("ST_EXPLODE_INIT\n"); ExplodeTime = time; // ((RedStrobeAI*)(RedStrobe->GetIntelligence()))->Deactivate(); // ((BlueStrobeAI*)(BlueStrobe->GetIntelligence()))->Deactivate(); // ((BoostAI*)(LeftBoost->GetIntelligence()))->Deactivate(); // ((BoostAI*)(RightBoost->GetIntelligence()))->Deactivate(); // ((ShieldAI*)(Shield->GetIntelligence()))->Deactivate(); pol1->Apply(expm); if(pol2) delete pol2; if(BoostPoly1) delete BoostPoly1; #ifdef DOUBLE_BOOST if(BoostPoly2) delete BoostPoly2; #endif if(redpol) delete redpol; if(bluepol) delete bluepol; if(shieldpol) delete shieldpol; pol2 = 0; BoostPoly1 = 0; BoostPoly2 = 0; redpol = 0; bluepol = 0; shieldpol = 0; state = ST_EXPLODE; ShieldStart = time-8.0f; break; case ST_EXPLODE:{ //printf("ST_EXPLODE\n"); if(time-ExplodeTime<1){ // Animate explotion // SetPosition(Vector(GetPosition())+Velocity*pulse); int framecount = expm->GetTexture()->GetFrameCount(); if(framecount) expm->GetTexture()->SetFrame(int((time-ExplodeTime)*framecount/1.0f)%framecount); }else if(time-ExplodeTime<3){ // Delay // SetPosition(Vector(GetPosition())+Velocity*pulse); expm->GetTexture()->SetFrame(0); }else{ // Respawn Vector pos = Vector(camera->GetPosition())+Vector(float(rand()%0xfff)*.8f,float(rand()%0xfff)*.8f,-8000); pos.Z = -8000; SetPosition(pos); // Node *n = GetNode(String("Camera")); // fixme: Optimize! // SetPosition(Vector(n->GetPosition())+Vector(float(rand()%0xfff)*.8f,float(rand()%0xfff)*.8f,-8000)); // ((RedStrobeAI*)(RedStrobe->GetIntelligence()))->Activate(); // ((BlueStrobeAI*)(BlueStrobe->GetIntelligence()))->Activate(); // ((BoostAI*)(LeftBoost->GetIntelligence()))->Activate(); // ((BoostAI*)(RightBoost->GetIntelligence()))->Activate(); // ((ShieldAI*)(Shield->GetIntelligence()))->Activate(); state = ST_PLAYING; pol2 = new IndexedPolygon(geo); pol2->Apply(LightMaterial); pol2->Add(3); pol2->Add(2); pol2->Add(1); pol2->Add(0); pol1->Apply(ShipMaterial); BoostPoly1 = new IndexedPolygon(geo); BoostPoly1->Apply(Boost); BoostPoly1->Add(4+4); BoostPoly1->Add(5+4); BoostPoly1->Add(6+4); BoostPoly1->Add(7+4); #ifdef DUBLE_BOOST BoostPoly2 = new IndexedPolygon(geo); BoostPoly2->Apply(Boost); BoostPoly2->Add(8+4); BoostPoly2->Add(9+4); BoostPoly2->Add(10+4); BoostPoly2->Add(11+4); #endif redpol = new IndexedPolygon(geo); redpol->Apply(BlueStrobe); redpol->Add(3); redpol->Add(2); redpol->Add(1); redpol->Add(0); bluepol = new IndexedPolygon(geo); bluepol->Apply(BlueStrobe); bluepol->Add(3); bluepol->Add(2); bluepol->Add(1); bluepol->Add(0); shieldpol = new IndexedPolygon(geo); shieldpol->Apply(Shield1); shieldpol->Add(7); shieldpol->Add(6); shieldpol->Add(5); shieldpol->Add(4); Shield1->SetTransparency(0); activate_shield = false; shield = true; ShieldStart = time-6.0f; } }break; case ST_PLAYING: //printf("ST_PLAYING\n"); int framecount = RedStrobe->GetTexture()->GetFrameCount(); int frame = int(time*framecount/redpulse)%(framecount*4); if(frame>=framecount) frame=0; if(framecount) RedStrobe->GetTexture()->SetFrame(frame); framecount = BlueStrobe->GetTexture()->GetFrameCount(); frame = int(time*framecount/bluepulse)%(framecount*4); if(frame>=framecount) frame=0; if(framecount) BlueStrobe->GetTexture()->SetFrame(frame); framecount = Boost->GetTexture()->GetFrameCount(); frame = rand()%(framecount-1); if(framecount) Boost->GetTexture()->SetFrame(frame); Vector vel = Vector(GetVelocity()); vel-=OldVelocity; float val = vel.Lenght()*5.0f; OldVelocity = Vector(GetVelocity()); if(val<500){ #ifdef DOUBLE_BOOST SetVector(0+4+4,Vector(-5*4-50, val-20+200,0)); SetVector(1+4+4,Vector( 5*4-50, val-20+200,0)); SetVector(0+8+4,Vector(-5*4+50, val-20+200,0)); SetVector(1+8+4,Vector( 5*4+50, val-20+200,0)); #else SetVector(0+4+4,Vector(-12*4, val+50+200,0)); SetVector(1+4+4,Vector( 12*4, val+50+200,0)); #endif } // if(activate_shield) shieldAI->Activate(); if(activate_shield){ ShieldStart = time; if(!shieldpol){ shieldpol = new IndexedPolygon(geo); shieldpol->Apply(Shield1); shieldpol->Add(7); shieldpol->Add(6); shieldpol->Add(5); shieldpol->Add(4); } } activate_shield = false; if(time-ShieldStart<8.0f){ float t = time-ShieldStart-7.0f; Shield1->SetTransparency(t>0?t:0); shield_active = true; }else{ Shield1->SetTransparency(1); shield_active = false; } /* if(bounce){ // new Shock(this,BounceDirection*-Quaternion(GetOrientation())); SetVelocity(-Vector(GetVelocity())); bounce = false; } */ if(StartTime<0.0f) OldTime = StartTime = time; if((time-StartTime)>5.0f) shield=false; pulse=float(time-OldTime); // if(pulse>0){ charge += pulse; if(charge>=10.0f) charge = 10.0f; #if 1 // AI stuff // if(hook){ if(!num) num = new Number(camera,this,playernum); /* //printf("%d\n",hook); //#ifndef PHONE_EMULATION if(!wrotename){ //score = 0; //AddScore(0); if(avslutt){ name[strlen(name)-1]='\0'; if(!strcmp(name,"")) sprintf(name,"ano"); wrotename = true; AddScore(0); //Scores->Activate(player); } #ifdef NORSK if(charsub){ name[strlen(name)-1]--; if(name[strlen(name)-1])=='a'-1) name[strlen(name)-1] = 'å'; if(name[strlen(name)-1])=='å'-1) name[strlen(name)-1] = 'ø'; if(name[strlen(name)-1])=='ø'-1) name[strlen(name)-1] = 'æ'; if(name[strlen(name)-1])=='æ'-1) name[strlen(name)-1] = 'z'; } if(charadd){ name[strlen(name)-1]++; if(name[strlen(name)-1])=='z'+1) name[strlen(name)-1] = 'æ'; if(name[strlen(name)-1])=='æ'+1) name[strlen(name)-1] = 'ø'; if(name[strlen(name)-1])=='ø'+1) name[strlen(name)-1] = 'å'; if(name[strlen(name)-1])=='å'+1) name[strlen(name)-1] = 'a'; } #elif defined(SVENSK) if(charsub){ name[strlen(name)-1]--; if(name[strlen(name)-1])=='a'-1) name[strlen(name)-1] = 'å'; if(name[strlen(name)-1])=='å'-1) name[strlen(name)-1] = 'ö'; if(name[strlen(name)-1])=='ö'-1) name[strlen(name)-1] = 'ä'; if(name[strlen(name)-1])=='ä'-1) name[strlen(name)-1] = 'z'; } if(charadd){ name[strlen(name)-1]++; if(name[strlen(name)-1])=='z'+1) name[strlen(name)-1] = 'ä'; if(name[strlen(name)-1])=='ä'+1) name[strlen(name)-1] = 'ö'; if(name[strlen(name)-1])=='ö'+1) name[strlen(name)-1] = 'å'; if(name[strlen(name)-1])=='å'+1) name[strlen(name)-1] = 'a'; } #else if(subchar) name[strlen(name)-1]--; if(addchar) name[strlen(name)-1]++; name[strlen(name)-1] = ((name[strlen(name)-1]-'a')%('z'-'a'))+'a'; #endif if(nextchar) sprintf(name,"%s%c",name,name[strlen(name)-1]); addchar = subchar = nextchar = 0; AddScore(0); if(strlen(name)==4){ wrotename = true; name[3]='\0'; //Scores->Activate(player); } }else{ */ //printf("%d,%d\n",left,right); if(left) OrientationAx=Euler(0,0,1.0f); else if(right) OrientationAx=Euler(0,0,-1.0f); else OrientationAx=Euler(0,0,0); /* if(number){ NumberMaterial->SetTranslusency(1); }else{ NumberMaterial->SetTranslusency(0); } */ if(number) num->Activate(); //else num->Activate(false); // } /*}else{ wrotename = false; if((score!=0)||strcmp(name,"a")){ score = 0; sprintf(name,"a"); AddScore(0); } #ifdef USE_AI // Find safe directions Vector mypos = Vector(GetPosition()); float ul=0,ur=0,ll=0,lr=0; Node *node = GetFirstNode(); while(node){ Vector pos = Vector(node->GetPosition())-mypos; float dist = pos.SquareLenght(); if(pos.X<0){ if(pos.Y<0) ul+=1.0f/dist; else ll+=1.0f/dist; }else{ if(pos.Y<0) ur+=1.0f/dist; else lr+=1.0f/dist; } node = node->GetNext(node); } if(Velocity.X<0){ if(Velocity.Y<0){ // ul if(ur<ul){ OrientationAx=Euler(0,0,1.0f); }else if(ll<ul){ OrientationAx=Euler(0,0,-1.0f); }else{ OrientationAx=Euler(0,0,0); } if(ur<ul){ if(ll<ur){ if(lr<ll){ }else{ } }else{ if(lr<ur){ }else{ } } }else{ if(ll<ul){ if(lr<ul){ }else{ } }else{ if(lr<ul){ }else{ } } } }else{ // ll if(ul<ll){ OrientationAx=Euler(0,0,-1.0f); }else if(lr<ll){ OrientationAx=Euler(0,0,1.0f); }else{ OrientationAx=Euler(0,0,0); } } }else{ if(Velocity.Y<0){ // ur if(ul<ur){ OrientationAx=Euler(0,0,-1.0f); }else if(lr<ur){ OrientationAx=Euler(0,0,1.0f); }else{ OrientationAx=Euler(0,0,0); } }else{ // lr if(ur<lr){ OrientationAx=Euler(0,0,1.0f); }else if(ll<lr){ OrientationAx=Euler(0,0,-1.0f); }else{ OrientationAx=Euler(0,0,0); } } } // OrientationAx=Euler(0,0,1.0f); //Quaternion(Euler(0,0,-Yaw)); #endif // Acceleration = Vector(0,0.1f,0); }*/ #endif /* if(state){ SetPosition(Vector(GetPosition())+Velocity*pulse); int framecount = GetCreatorGeometry()->GetMaterial()->GetTexture()->GetFrameCount(); if(framecount) GetCreatorGeometry()->GetMaterial()->GetTexture()->SetFrame(int((time-ExpTime)*framecount/0.5f)%framecount); #ifndef CHEAT #if 0 }else if(health<=0.0f){ state=true; RedStrobe->Kill(); BlueStrobe->Kill(); LeftBoost->Kill(); RightBoost->Kill(); RedStrobe=0; BlueStrobe=0; LeftBoost=0; RightBoost=0; GetCreatorGeometry()->Apply(ExplotionMaterial); ExpTime = time; OldTime = time; return true; #endif #endif }else{ */ #define MaxVel 20000.0f #define RotScalar 5.0f // Acelerate rotation //OrientationStep=(OrientationAx*pulse*RotScalar)*OrientationStep; // Rotation per sec OrientationStep+=(OrientationAx*pulse*RotScalar); // Acelerate velocity SetVelocity(Vector(GetVelocity())-(Acceleration*pulse*MaxVel)*Quaternion(GetOrientation())); // Translation per sec // Dampening // fixme: This dampening shit doesnt work right //Quaternion RDamp=OrientationStep*-5.0f; //OrientationStep=OrientationStep*(RDamp*pulse); Euler RDamp = OrientationStep*-2.0f; OrientationStep+=RDamp*pulse; Vector VDamp=Vector(GetVelocity())*-1.0f; SetVelocity(Vector(GetVelocity())+VDamp*pulse); //SetOrientation((OrientationStep*pulse)*Quaternion(GetOrientation())); Orientation+=OrientationStep*pulse; SetOrientation(Quaternion(Orientation)); // SetPosition(Vector(GetPosition())+Velocity*pulse); // } // if(state){ // OldTime = time; // return true; // } // int framecount = GetCreatorGeometry()->GetMaterial()->GetTexture()->GetFrameCount(); if(Orientation.Roll>(3.14f*2)) Orientation.Roll-=3.14f*2; if(Orientation.Roll<0) Orientation.Roll+=3.14f*2; // int frame = abs((int)((Orientation.Roll/(3.14f*2))*-framecount)); //printf("%d\n",frame); // if(framecount) GetCreatorGeometry()->GetMaterial()->GetTexture()->SetFrame(frame%framecount); framecount = LightMaterial->GetTexture()->GetFrameCount(); frame = abs(int((Orientation.Roll/(3.14f*2))*-framecount)); if(framecount) LightMaterial->GetTexture()->SetFrame(frame%framecount); //#ifdef USE_AI #if 1 // if(hook){ if((time-LastFire)>rate){ //1.0f){ LastFire=time; Geometry *geo = new Geometry(); geo->Node::Apply(0,new Flare(geo,this,player,Scores)); Node *n = GetParent(); n->Apply(0,geo); } // } #endif //#endif //#if 0 //Node *n = GetNode("Camera"); //if(n){ Vector cpos = Vector(camera->GetPosition()); Vector pos = Vector(GetPosition()); cpos.Z+=10000; float orgZ = pos.Z; Vector dist = pos-cpos; dist.Z = 0; if(dist.SquareLenght()>6000.0f*6000.0f){ //printf("%f\n",10000.0f/dist.Lenght()); pos-=dist*(1.0f-(6000.0f/dist.Lenght())); pos.Z=orgZ; SetPosition(pos); } //} //} break; } //#endif OldTime=time; //lastpulse=pulse; return true; }