int CEngineTool::GetLightingConditions( const Vector &vecLightingOrigin, Vector *pColors, int nMaxLocalLights, LightDesc_t *pLocalLights ) { LightcacheGetDynamic_Stats stats; LightingState_t state; LightcacheGetDynamic( vecLightingOrigin, state, stats ); Assert( state.numlights >= 0 && state.numlights < MAXLOCALLIGHTS ); memcpy( pColors, state.r_boxcolor, sizeof(state.r_boxcolor) ); int nLightCount = 0; for ( int i = 0; i < state.numlights; ++i ) { LightDesc_t *pLightDesc = &pLocalLights[nLightCount]; if (!WorldLightToMaterialLight( state.locallight[i], *pLightDesc )) continue; // Apply lightstyle float bias = LightStyleValue( state.locallight[i]->style ); // Deal with overbrighting + bias pLightDesc->m_Color[0] *= bias; pLightDesc->m_Color[1] *= bias; pLightDesc->m_Color[2] *= bias; if ( ++nLightCount >= nMaxLocalLights ) break; } return nLightCount; }
void CModelInfoClient::GetModelMaterialColorAndLighting( const model_t *model, const Vector & origin, const QAngle & angles, trace_t* pTrace, Vector& lighting, Vector& matColor ) { switch( model->type ) { case mod_brush: { Vector origin_l, delta, delta_l; VectorSubtract( pTrace->endpos, pTrace->startpos, delta ); // subtract origin offset VectorSubtract (pTrace->startpos, origin, origin_l); // rotate start and end into the models frame of reference if (angles[0] || angles[1] || angles[2]) { Vector forward, right, up; AngleVectors (angles, &forward, &right, &up); // transform the direction into the local space of this entity delta_l[0] = DotProduct (delta, forward); delta_l[1] = -DotProduct (delta, right); delta_l[2] = DotProduct (delta, up); } else { VectorCopy( delta, delta_l ); } Vector end_l; VectorMA( origin_l, 1.1f, delta_l, end_l ); R_LightVecUseModel( ( model_t * )model ); BrushModel_GetLightingAndMaterial( origin_l, end_l, lighting, matColor ); R_LightVecUseModel(); return; } case mod_studio: { // FIXME: Need some way of getting the material! matColor.Init( 0.5f, 0.5f, 0.5f ); // Get the lighting at the point LightingState_t lightingState; LightcacheGet( pTrace->endpos, lightingState ); // Convert the light parameters into something studiorender can digest LightDesc_t desc[MAXLOCALLIGHTS]; int count = 0; for (int i = 0; i < lightingState.numlights; ++i) { if (WorldLightToMaterialLight( lightingState.locallight[i], desc[count] )) { ++count; } } // Ask studiorender to figure out the lighting g_pStudioRender->ComputeLighting( lightingState.r_boxcolor, count, desc, pTrace->endpos, pTrace->plane.normal, lighting ); return; } } }