BOOL obj_DroppedItem::Update()
{
	parent::Update();
	
	r3dPoint3D pos = GetBBoxWorld().Center();

	const ClientGameLogic& CGL = gClientLogic();
	if(CGL.localPlayer_ && (CGL.localPlayer_->GetPosition() - pos).Length() < 10.0f)
		SetHighlight(true);
	else
		SetHighlight(false);

	return TRUE;
}
Beispiel #2
0
void obj_Building::SetPosition(const r3dPoint3D& pos)
{
	parent::SetPosition( pos );
	r3dPoint3D v = pos;

	if (!MeshLOD[0]) 
		return;

#ifndef FINAL_BUILD
	if (__RepositionObjectsOnTerrain)
	{
		float h = GetTerrainFollowPosition(GetBBoxWorld());
		float fRes = h;
		parent::SetPosition( r3dPoint3D( GetPosition().X, fRes,GetPosition().Z) );	
	}
#endif
}
Beispiel #3
0
void
GameObject::AppendSlicedShadowRenderables( RenderArray ( & render_arrays )[ rsCount ], int inMainFrustum, const r3dCamera& Cam )
{
	// find in which slice out object is
	// squared distances are not working in some edge cases, so using normal distances

	extern float gShadowSunMultiplier;

	r3dPoint3D pos = GetBBoxWorld().Center();

	D3DXVECTOR4 viewPos;

	D3DXVec3Transform( &viewPos, (D3DXVECTOR3*)&pos, &r3dRenderer->ViewMatrix );

	uint8_t shadow_slice = 0;
	float dist = (gCam - pos).Length();

	float objRadius =  this->GetObjectsRadius() + this->GetBBoxWorld().Size.y*gShadowSunMultiplier;

	float shadowSlice0 = ShadowSplitDistancesOpaque[0];
	float shadowSlice1 = ShadowSplitDistancesOpaque[1];
	float shadowSlice2 = ShadowSplitDistancesOpaque[2];
	float shadowSlice3 = ShadowSplitDistancesOpaque[3];

	extern float SunVectorXZProj ;
	float shadowDim = objRadius + LastShadowExtrusion * SunVectorXZProj ;

	float shadowsq_max = dist + shadowDim;
	float shadowsq_min = R3D_MAX(dist - shadowDim, shadowSlice0);
	
	const float sC1 = 0.9f; // some overlapping required
	const float sC2 = 1.0f;

	float maX = viewPos.x + objRadius ;
	float miX = viewPos.x - objRadius ;
	float maY = viewPos.y + objRadius ;
	float miY = viewPos.y - objRadius ;

	r3d_assert( r_active_shadow_slices->GetInt() <= 3 ) ;

	int num_slices = r_active_shadow_slices->GetInt() ;
	int cache_last = r_lfsm_wrap_mode->GetInt() ;

	if( (shadowsq_min >= shadowSlice0*sC1 && shadowsq_min < shadowSlice1*sC2) || (shadowsq_max > shadowSlice0*sC1 && shadowsq_max < shadowSlice1*sC2) )
	{
		if( inMainFrustum || ( num_slices == 1 && cache_last ) )
		{
			AppendShadowRenderables( render_arrays[ rsCreateSM + 0 ], Cam );
			AppendShadowOptimizations( &gShadowMapOptimizationDataOpaque[ 0 ], miX, maX, miY, maY );
		}
	}
	
	if( ( ( shadowsq_min >= shadowSlice1*sC1 || num_slices == 2 ) && shadowsq_min < shadowSlice2*sC2) || (shadowsq_max > shadowSlice1*sC1 && shadowsq_max < shadowSlice2*sC2) || (shadowsq_min <= shadowSlice1*sC1 && shadowsq_max > shadowSlice2*sC2) )
	{
		if( inMainFrustum || ( num_slices == 2 && cache_last ) )
		{
			AppendShadowRenderables( render_arrays[ rsCreateSM + 1 ], Cam );
			AppendShadowOptimizations( &gShadowMapOptimizationDataOpaque[ 1 ], miX, maX, miY, maY );
		}
	}

	if( ( ( shadowsq_min >= shadowSlice2*sC1 || num_slices == 3 ) && shadowsq_min < shadowSlice3*sC2) || (shadowsq_max > shadowSlice2*sC1 && shadowsq_max < shadowSlice3*sC2) || (shadowsq_min <= shadowSlice2*sC1 && shadowsq_max > shadowSlice3*sC2)  )
	{
		if( inMainFrustum || ( num_slices == 3 && cache_last ) )
		{
			AppendShadowRenderables( render_arrays[ rsCreateSM + 2 ], Cam );
			AppendShadowOptimizations( &gShadowMapOptimizationDataOpaque[ 2 ], miX, maX, miY, maY );
		}
	}

}