⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shirescene.h

📁 Ion Team Lord Of The Rings Demo 模拟指环王的3D游戏 VS.NET编译 里面提供高级渲染算法
💻 H
字号:

#define NUMBER_OF_SHIRE_WAKING_HOBBIT_MOVEMENTS 35
#define SCENDED_FADE 0


POINT Mouse;	//mouse handling, remove in the final release
CCamera fpvCam;
Md2Model scHobbitResting, scChicken[4], scFarmerJohn, scWalkingHobbit;
BezCam scCam(0.01f,0.75f);
CSkyBox scSkyBox;
CMap scMap;
int scBGMusic,scWater, scChicks, scWind, scBirds, scHmmm;
int scParticleSystem;
CharMovement scWalkingHobbitMovement[NUMBER_OF_SHIRE_WAKING_HOBBIT_MOVEMENTS];
float scWalkingHobbitAnimationFraction=0.0f;
int scWalkingHobbitMovementIndex=0;

float scFlags[10];



void ShireSceneInit()
{

  scMap.Init("Data/Shire.cmf");
  scSkyBox.Init("Data/CSkyBox/Day","jpg");
  scHobbitResting.Load("Data/ModelsAndSkins/Hobbit/Hobbit.md2","Data/ModelsAndSkins/Hobbit/Hob.jpg");
  scHobbitResting.SetAnimation("RestFLR");
  scFarmerJohn.Load("Data/ModelsAndSkins/Hobbit/Hobbit.md2","Data/ModelsAndSkins/Hobbit/Hob.jpg");
  scFarmerJohn.SetAnimation("Mess");
  for (int i=0;i<4;i++) // load the chicken!
    {
      scChicken[i].Load("Data/ModelsAndSkins/Chicken/Chicken.md2","Data/ModelsAndSkins/Chicken/Chicken.jpg");
      scChicken[i].SetAnimation("stand");
    }
  scCam.LoadFromFile("Data/Paths/ShireScene.path");
  scWalkingHobbit.Load("Data/ModelsAndSkins/Hobbit/Hobbit.md2","Data/ModelsAndSkins/Hobbit/Hob.jpg");
  scWalkingHobbit.SetAnimation("Walk");

	for (int i=0;i<NUMBER_OF_FLAGS;i++)
    scFlags[i]=false;
#include "ShireSceneWalkingHobbitMovement.h"
}


void ShireSceneRenderNextFrame(float Milliseconds)
{
  static bool Record=false, DrawPath=true;
  static float scHobbitRestingFraction, scChickenFraction[4]={0.2f,0.4f,0.1f,0.7f}, scFarmerJohnFraction;
  static bool started=false;
  if (!started)
    {
      started=true;
      scParticleSystem=PGod.NewSystem(2,"Data/Particles/fish.bmp", 1, true); // The Fish particle system :D
      PGod[scParticleSystem]->InitialParticle.Pos=Vector3d(5.0f,-1.0f,20.0f);
      PGod[scParticleSystem]->InitialParticle.Speed=Vector3d(0.0f,0.007f,-0.01f);
      PGod[scParticleSystem]->InitialParticle.fLifetime=2000.0f;
      PGod[scParticleSystem]->InitialParticle.fInitialAlpha=1.0f;
      PGod[scParticleSystem]->InitialParticle.fFinalAlpha=1.0f;
      PGod[scParticleSystem]->InitialParticle.fInitialSize=0.5f;
      PGod[scParticleSystem]->InitialParticle.fFinalSize=0.5f;
      PGod[scParticleSystem]->InitialParticle.InitialColor.r=1.0f;
      PGod[scParticleSystem]->InitialParticle.InitialColor.g=1.0f;
      PGod[scParticleSystem]->InitialParticle.InitialColor.b=1.0f;
      PGod[scParticleSystem]->InitialParticle.FinalColor.r=1.0f;
      PGod[scParticleSystem]->InitialParticle.FinalColor.g=1.0f;
      PGod[scParticleSystem]->InitialParticle.FinalColor.b=1.0f;

      PGod[scParticleSystem]->Chaos.Pos=Vector3d(0.6f,0.0f,7.5f);
      PGod[scParticleSystem]->Chaos.Speed=Vector3d(0.0f,0.001f,0.0f);
      PGod[scParticleSystem]->Chaos.fLifetime=400.0f;
      PGod[scParticleSystem]->Chaos.fInitialAlpha=0.0f;
      PGod[scParticleSystem]->Chaos.fFinalAlpha=0.0f;
      PGod[scParticleSystem]->Chaos.fInitialSize=0.0f;
      PGod[scParticleSystem]->Chaos.fFinalSize=0.0f;
      PGod[scParticleSystem]->Chaos.InitialColor.r=0.0f;
      PGod[scParticleSystem]->Chaos.InitialColor.g=0.0f;
      PGod[scParticleSystem]->Chaos.InitialColor.b=0.0f;
      PGod[scParticleSystem]->Chaos.FinalColor.r=0.0f;
      PGod[scParticleSystem]->Chaos.FinalColor.g=0.0f;
      PGod[scParticleSystem]->Chaos.FinalColor.b=0.0f;

      PGod[scParticleSystem]->InitialAccel=Vector3d(0.0f,-0.00005f,0.0f);
      PGod[scParticleSystem]->FinalAccel=Vector3d(0.0f,-0.00005f,0.0f);
      LightManager.SetAmbientColor(GL_LIGHT1,0.7f,0.7f,0.7f,1.0f);
      LightManager.SetDiffuseColor(GL_LIGHT1,1,1,1,1);
    }

  PGod.Update(Milliseconds);
  // UPDATE!
  static float temptime, TotalTime;
  temptime+=Milliseconds;
  TotalTime+=Milliseconds;

      scCam.LookAtNextPoint(Milliseconds*0.05);
      scCam.PositionSkybox();
      scSkyBox.Render();
      glLoadIdentity();
      scCam.Position();

  LightManager.SetPosition(GL_LIGHT1,-3.0f,54.0f,-16.0f); // set light position

	if (TotalTime<10000.0f)
	{
		float t=TotalTime*0.0001f;
		LightManager.SetAmbientColor(GL_LIGHT1,0.7f*t,0.7f*t,0.7f*t,1.0f);
		LightManager.SetDiffuseColor(GL_LIGHT1,1.0f*t,1.0f*t,1.0f*t,1.0f);
	}
	else if (!scFlags[SCENDED_FADE])
	{
		scFlags[SCENDED_FADE]=true;
    LightManager.SetAmbientColor(GL_LIGHT1,0.7f,0.7f,0.7f,1.0f);
    LightManager.SetDiffuseColor(GL_LIGHT1,1.0f,1.0f,1.0f,1.0f);
	}
  //DRAW THE MAP
  scMap.Draw();

  //DRAW THE RESTING HOBBIT
  glPushMatrix();
  glTranslatef(20.0f,0.3f,1.1f);
  glScalef(0.02f,0.02f,0.02f);
  glRotatef(-90.0f,0,1,0);
  glRotatef(20.0f,1,0,0);
  scHobbitRestingFraction+=Milliseconds*0.001;
  if (scHobbitRestingFraction>=1.0f)
    scHobbitRestingFraction=0.0f;
  scHobbitResting.Animate(scHobbitRestingFraction);
  glPopMatrix();

  for (int i=0;i<4;i++)
    {
      scChickenFraction[i]+=Milliseconds*0.0001;
      if (scChickenFraction[i]>=1.0f)
        scChickenFraction[i]=0.0f;
    }

  // DRAW CHICKEN
  glPushMatrix();
  glTranslatef(11.0f,-0.5f,15.0f);
  glScalef(0.015f,0.015f,0.015f);
  scChicken[0].Animate(scChickenFraction[0]);
  glPopMatrix();
  glPushMatrix();
  glTranslatef(10.0f,-0.5f,15.4f);
  glScalef(0.015f,0.015f,0.015f);
  glRotatef(-134.0f,0,1,0);
  scChicken[1].Animate(scChickenFraction[1]);
  glPopMatrix();
  glPushMatrix();
  glTranslatef(13.0f,-0.5f,10.4f);
  glScalef(0.015f,0.015f,0.015f);
  glRotatef(-273.0f,0,1,0);
  scChicken[2].Animate(scChickenFraction[2]);
  glPopMatrix();
  glPushMatrix();
  glTranslatef(10.0f,-0.5f,10.4f);
  glScalef(0.015f,0.015f,0.015f);
  glRotatef(-213.0f,0,1,0);
  scChicken[3].Animate(scChickenFraction[3]);
  glPopMatrix();

  // DRAW FARMER JOHN
  scFarmerJohnFraction+=Milliseconds*0.001;
  if (scFarmerJohnFraction>=1.0f)
    scFarmerJohnFraction=0.0f;
  glPushMatrix();
  glTranslatef(10.0f,-0.5f,1.4f);
  glScalef(0.015f,0.015f,0.015f);
  glRotatef(-17.0f,0,1,0);
  scFarmerJohn.Animate(scFarmerJohnFraction);
  glPopMatrix();
  if (TotalTime > 38000.0f)// if it's time ;=)
    {
			// for the walking hobbit
      glPushMatrix();
      scWalkingHobbitAnimationFraction+=Milliseconds*scWalkingHobbitMovement[scWalkingHobbitMovementIndex].TimeFactor;
      if (scWalkingHobbitAnimationFraction>=0.99f)
        {
          scWalkingHobbitMovementIndex++;
          scWalkingHobbitAnimationFraction=0.0f;
          if (scWalkingHobbitMovement[scWalkingHobbitMovementIndex].ChangeAnimation)
            scWalkingHobbit.SetAnimation(scWalkingHobbitMovement[scWalkingHobbitMovementIndex].NewAnimation);
        }
      glTranslatef(	scWalkingHobbitMovement[scWalkingHobbitMovementIndex].Position.Coords[0],
                    scWalkingHobbitMovement[scWalkingHobbitMovementIndex].Position.Coords[1],
                    scWalkingHobbitMovement[scWalkingHobbitMovementIndex].Position.Coords[2]);
      glScalef(0.015f,0.015f,0.015f);
      glRotatef(scWalkingHobbitMovement[scWalkingHobbitMovementIndex].Rotation.Coords[0],1,0,0);
      glRotatef(scWalkingHobbitMovement[scWalkingHobbitMovementIndex].Rotation.Coords[1],0,1,0);
      glRotatef(scWalkingHobbitMovement[scWalkingHobbitMovementIndex].Rotation.Coords[2],0,0,1);
      if (!scWalkingHobbitMovement[scWalkingHobbitMovementIndex].TwoFrameInterpolation)
        scWalkingHobbit.Animate(scWalkingHobbitAnimationFraction,false);
      else
        scWalkingHobbit.TwoFrameInterpolate(scWalkingHobbitAnimationFraction,
                                            scWalkingHobbitMovement[scWalkingHobbitMovementIndex].Frame1,
                                            scWalkingHobbitMovement[scWalkingHobbitMovementIndex].Frame2);
      glPopMatrix();

			if (TotalTime<48000.0f)
			{
				glEnable(GL_ALPHA_TEST);
				
				PGod.Draw(); // or for the fish :)
				glDisable(GL_ALPHA_TEST);
			}
    }
  if (TotalTime>99000 && scParticleSystem!=-1)
    {
      PGod[scParticleSystem]->Enabled=false;
      scParticleSystem=-1;
    }
	if (TotalTime>95000.0f)
	{
		float t=1.0f-((TotalTime-95000.0f)*0.002f);
		LightManager.SetAmbientColor(GL_LIGHT1,0.7f*t,0.7f*t,0.7f*t,1.0f);
		LightManager.SetDiffuseColor(GL_LIGHT1,1.0f*t,1.0f*t,1.0f*t,1.0f);
	}

	Standart.Display("The Shire", 2.0f, 100, 150,1);
}


void ShireSceneDeInit ()
{
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -