Пример #1
0
void SceneManager::Apply()
{
	for (int n=0;n<mToApplyCount;n++)
	{
		Node * pRootNode = mToApply[n];

		//if (pRootNode->IsInFrustum())
		{
			pRootNode->Apply();
		}
	}
}
Пример #2
0
	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;
	}
Пример #3
0
	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;
	}
Пример #4
0
	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);
	}
Пример #5
0
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;
}