//===========================================================================// // Copyright (C) Microsoft Corporation. All rights reserved. // //===========================================================================// //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void CLASSNAME::Lighting ( MLRLight* const* lights, int nrLights ) { Check_Object(this); // //---------------------------------------------------------------------- // If no lights or normals are specified, use the original vertex colors //---------------------------------------------------------------------- // actualColors = &colors; int state_mask = GetCurrentState().GetLightingMode(); if (nrLights == 0 || normals.GetLength() == 0 || state_mask == MLRState::LightingOffMode) return; Check_Pointer(lights); // //------------------------------- // See if we need vertex lighting //------------------------------- // if (state_mask & MLRState::VertexLightingMode) { Verify(colors.GetLength() == litColors.GetLength()); Verify(normals.GetLength() == colors.GetLength()); Verify(coords.GetLength() == colors.GetLength()); int i, k, len = colors.GetLength(); MLRVertexData vertexData; #if COLOR_AS_DWORD TO_DO; #else RGBAColor *color = &colors[0]; #endif // //-------------------------------- // Now light the array of vertices //-------------------------------- // vertexData.point = &coords[0]; vertexData.color = &litColors[0]; vertexData.normal = &normals[0]; for(k=0;k<len;k++) { if(visibleIndexedVertices[k] != 0) { vertexData.color->red = 0.0f; vertexData.color->green = 0.0f; vertexData.color->blue = 0.0f; vertexData.color->alpha = color->alpha; for (i=0;i<nrLights;i++) { MLRLight *light = lights[i]; Check_Object(light); int mask = state_mask & light->GetLightMask(); if (!mask) continue; if (mask&MLRState::VertexLightingMode) { if ( GetCurrentState().GetBackFaceMode() != MLRState::BackFaceOffMode || light->GetLightType() == MLRLight::AmbientLight ) { light->LightVertex(vertexData); Set_Statistic(LitVertices, LitVertices+1); } } } } vertexData.point++; vertexData.color++; vertexData.normal++; color++; } actualColors = &litColors; } }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLRIndexedPolyMesh::Lighting ( MLRLight **lights, int nrLights ) { Check_Object(this); // set the to use colors to the original colors ... // only lighting could overwrite this; actualColors = &colors; if(nrLights == 0) { return; } if(normals.GetLength() == 0) { return; } if(lights == NULL) { return; } switch (GetCurrentState().GetLightingMode()) { case MLRState::LightingOffMode: return; case MLRState::LightingClassicOnlyMode: { Verify(colors.GetLength() == litColors.GetLength()); Verify(normals.GetLength() == colors.GetLength()); Verify(coords.GetLength() == colors.GetLength()); int i, k, len = colors.GetLength(); MLRVertexData vertexData; #if COLOR_AS_DWORD TO_DO; #else RGBAColor *color = &colors[0]; RGBAColor *litColor = &litColors[0]; #if USE_ASSEMBLER_CODE _asm { push esi push edi mov esi, color mov edi, litColor mov ecx, len _loop1: mov eax, dword ptr [esi] mov ebx, dword ptr [esi+4] mov dword ptr [edi], eax mov dword ptr [edi+ 4], ebx mov eax, dword ptr [esi + 8] mov ebx, dword ptr [esi + 12] mov dword ptr [edi + 8], eax mov dword ptr [edi + 12], ebx add esi,16 add edi,16 dec ecx jnz _loop1 pop edi pop esi } #else // it doesnt know that ... memcpy(litColor, color, (len<<2)*sizeof(Scalar)); #endif #endif // //----------------------------------- // Test each light against the vertex //----------------------------------- // for (i=0;i<nrLights;i++) { MLRLight *light = lights[i]; Check_Object(light); vertexData.point = &coords[0]; vertexData.color = &litColors[0]; vertexData.normal = &normals[0]; for(k=0;k<len;k++) { if(visibleIndexedVertices[k] != 0) { light->LightVertex(vertexData); } vertexData.point++; vertexData.color++; vertexData.normal++; } } #ifdef LAB_ONLY Statistics::MLR_LitVertices += len*nrLights; #endif // set the to use colors to the original colors ... // only lighting could overwrite this; actualColors = &litColors; } break; case MLRState::LightingLightMapOnlyMode: { Verify(state.GetAlphaMode() == MLRState::OneZeroMode); int i; for (i=0;i<nrLights;i++) { LightMapLighting(lights[i]); } } break; case MLRState::LightingClassicAndLightMapMode: { Verify(state.GetAlphaMode() == MLRState::OneZeroMode); Verify(colors.GetLength() == litColors.GetLength()); Verify(normals.GetLength() == colors.GetLength()); Verify(coords.GetLength() == colors.GetLength()); int i, k, len = colors.GetLength(); MLRVertexData vertexData; #if COLOR_AS_DWORD TO_DO; #else RGBAColor *color = &colors[0]; RGBAColor *litColor = &litColors[0]; #if USE_ASSEMBLER_CODE _asm { push esi push edi mov esi, color mov edi, litColor mov ecx, len _loop2: mov eax, dword ptr [esi] mov ebx, dword ptr [esi+4] mov dword ptr [edi], eax mov dword ptr [edi+ 4], ebx mov eax, dword ptr [esi + 8] mov ebx, dword ptr [esi + 12] mov dword ptr [edi + 8], eax mov dword ptr [edi + 12], ebx add esi,16 add edi,16 dec ecx jnz _loop2 pop edi pop esi } #else // it doesnt know that ... memcpy(litColor, color, (len<<2)*sizeof(Scalar)); #endif #endif // //----------------------------------- // Test each light against the vertex //----------------------------------- // for (i=0;i<nrLights;i++) { MLRLight *light = lights[i]; Check_Object(light); vertexData.point = &coords[0]; vertexData.color = &litColors[0]; vertexData.normal = &normals[0]; for(k=0;k<len;k++) { light->LightVertex(vertexData); vertexData.point++; vertexData.color++; vertexData.normal++; } } #ifdef LAB_ONLY Statistics::MLR_LitVertices += len*nrLights; #endif // set the to use colors to the original colors ... // only lighting could overwrite this; actualColors = &litColors; STOP(("Lightmaps not implemented yet.")); } break; } }