Exemple #1
0
//=====================================================================================
//	geCamera_Create
//=====================================================================================
GENESISAPI geCamera *GENESISCC geCamera_Create(geFloat Fov, const geRect *Rect)
{
	geCamera *Camera;

	assert( Rect != NULL );

	Camera = GE_RAM_ALLOCATE_STRUCT(geCamera);
	if (Camera == NULL)
		{
			geErrorLog_Add(-1, NULL); //FIXME
			return NULL;
		}

	memset(Camera, 0, sizeof(geCamera));

	Camera->ZScale = 0.5f;

#if 0
	Camera->ZFar = 1000.0f;
	Camera->ZFarEnable = GE_TRUE;
#endif

	geCamera_SetAttributes(Camera,Fov,Rect);
	return Camera;
}
/* ------------------------------------------------------------------------------------ */
int CCameraManager::RenderView()
{
	geXForm3d theViewPoint;

// changed QD 12/15/05
	//geXForm3d_SetIdentity(&theViewPoint); // Clear the matrix
	//geXForm3d_RotateZ(&theViewPoint, Rotation.Z); // Rotate then translate
	geXForm3d_SetZRotation(&theViewPoint, Rotation.Z);
// end change
	geXForm3d_RotateX(&theViewPoint, Rotation.X);
	geXForm3d_RotateY(&theViewPoint, Rotation.Y);

	geXForm3d_Translate(&theViewPoint, Translation.X+shakex, Translation.Y+shakey, Translation.Z);

// changed RF063
	GE_Contents ZoneContents;
	geExtBox ExtBox;
	geVec3d Direction, Pos;
	GE_LVertex	Vertex;

	ExtBox.Min.X = ExtBox.Min.Z = -1.0f;
	ExtBox.Min.Y = 0.0f;
	ExtBox.Max.Y = 1.0f;
	ExtBox.Max.X = ExtBox.Max.Z = 1.0f;

	if(CCD->Collision()->GetContentsOf(Translation, &ExtBox, &ZoneContents) == RGF_SUCCESS)
	//if(geWorld_GetContents(CCD->World(), &Translation, &ExtBox.Min,
		//&ExtBox.Max, GE_COLLIDE_MODELS, 0, NULL, NULL, &ZoneContents) == GE_TRUE)
	{
		Liquid * LQ = CCD->Liquids()->IsLiquid(ZoneContents.Model);

		if(LQ)
		{
			geXForm3d_GetIn(&theViewPoint, &Direction);
			geVec3d_AddScaled(&Translation, &Direction, OverlayDist, &Pos);

			Vertex.r = LQ->TintColor.r;
			Vertex.g = LQ->TintColor.g;
			Vertex.b = LQ->TintColor.b;
			Vertex.a = LQ->Transparency;

			Vertex.u = 0.0f;
			Vertex.v = 0.0f;

			Vertex.X = Pos.X;
			Vertex.Y = Pos.Y;
			Vertex.Z = Pos.Z;

			geWorld_AddPolyOnce(CCD->World(), &Vertex, 1,
				LQ->Texture,
				GE_TEXTURED_POINT  , GE_RENDER_DO_NOT_OCCLUDE_SELF, 2.0f );
		}
// changed RF064
		else
		{
			Overlay * OL = CCD->Overlays()->IsOverlay(ZoneContents.Model);

			if(OL)
			{
				geXForm3d_GetIn(&theViewPoint, &Direction);
				geVec3d_AddScaled(&Translation, &Direction, OverlayDist, &Pos);

				Vertex.r = OL->TintColor.r;
				Vertex.g = OL->TintColor.g;
				Vertex.b = OL->TintColor.b;
				Vertex.a = OL->Transparency;

				Vertex.u = 0.0f;
				Vertex.v = 0.0f;

				Vertex.X = Pos.X;
				Vertex.Y = Pos.Y;
				Vertex.Z = Pos.Z;

				geWorld_AddPolyOnce(CCD->World(), &Vertex, 1, OL->Texture,
					GE_TEXTURED_POINT  , GE_RENDER_DO_NOT_OCCLUDE_SELF, 2.0f);
			}
		}
// end change RF064
	}

	if(jerk)
	{
		geVec3d Direction;
		geXForm3d_GetIn(&theViewPoint, &Direction);
		geVec3d_AddScaled(&theViewPoint.Translation, &Direction, -jerkamt, &theViewPoint.Translation);
	}

// end change RF063
	//	Set up camera attributes just prior to rendering the world.

	geRect Rect;
	geCamera_SetWorldSpaceXForm(EngineCamera, &theViewPoint);
	geCamera_GetClippingRect(EngineCamera, &Rect);
	geCamera_SetAttributes(EngineCamera, FOV, &Rect);
// changed RF064
	geVec3d_Subtract(&m_OldXForm.Translation, &theViewPoint.Translation, &m_vMoveDif );
	m_bPositionMoved = !geVec3d_IsZero(&m_vMoveDif);

	if( m_bPositionMoved  ||
		m_OldXForm.AX != theViewPoint.AX || m_OldXForm.AY != theViewPoint.AY || m_OldXForm.AZ != theViewPoint.AZ ||
		m_OldXForm.BX != theViewPoint.BX || m_OldXForm.BY != theViewPoint.BY || m_OldXForm.BZ != theViewPoint.BZ ||
		m_OldXForm.CX != theViewPoint.CX || m_OldXForm.CY != theViewPoint.CY || m_OldXForm.CZ != theViewPoint.CZ)
	{
		m_bViewChanged = true;
		m_OldXForm = theViewPoint;
	}
// end change RF064

	return RGF_SUCCESS;
}