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; }
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 }
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 ); } } }