Color::Color( const Colorf& source ) { setRed( convertColorFloatToByte(source.red()) ); setGreen( convertColorFloatToByte(source.green()) ); setBlue( convertColorFloatToByte(source.blue()) ); setAlpha( convertColorFloatToByte(source.alpha()) ); }
void GameProjectile::setShaderParams( Primitive* /*prim*/, Shader* fx, Mesh* mesh, Camera* camera, Light* keylight ) { Vector3 cameraWPos = camera->worldTransform().translation(); Matrix4x4 worldTm = mesh->cachedWorldTransform(); Matrix4x4 worldTmInv = worldTm.inverse(); for ( int i = 0 ; i < fx->parameters() ; ++i ) { Shader::ParameterDesc desc; fx->getParameterDesc( i, &desc ); if ( desc.name == "GROUND_COLOR" ) { Vector4 groundColorMin4, groundColorMax4; fx->getVector4( "GROUND_COLOR_MIN", &groundColorMin4 ); fx->getVector4( "GROUND_COLOR_MAX", &groundColorMax4 ); Colorf groundColorMin( groundColorMin4.x, groundColorMin4.y, groundColorMin4.z, 1.f ); Colorf groundColorMax( groundColorMax4.x, groundColorMax4.y, groundColorMax4.z, 1.f ); Colorf c = ( (groundColorMax-groundColorMin) * m_groundLightmapColor + groundColorMin ).saturate(); fx->setVector4( desc.name, Vector4(c.red(),c.green(),c.blue(),1.f) ); } else if ( desc.name == "SKY_COLOR" ) { Vector4 skyColorMin4, skyColorMax4; fx->getVector4( "SKY_COLOR_MIN", &skyColorMin4 ); fx->getVector4( "SKY_COLOR_MAX", &skyColorMax4 ); Colorf skyColorMin( skyColorMin4.x, skyColorMin4.y, skyColorMin4.z, 1.f ); Colorf skyColorMax( skyColorMax4.x, skyColorMax4.y, skyColorMax4.z, 1.f ); Colorf c = ( (skyColorMax-skyColorMin) * m_groundLightmapColor + skyColorMin ).saturate(); fx->setVector4( desc.name, Vector4(c.red(),c.green(),c.blue(),1.f) ); } else if ( desc.name == "SPECULAR_COLOR" ) { Vector4 specularColorMin4, specularColorMax4; fx->getVector4( "SPECULAR_COLOR_MIN", &specularColorMin4 ); fx->getVector4( "SPECULAR_COLOR_MAX", &specularColorMax4 ); Colorf specularColorMin( specularColorMin4.x, specularColorMin4.y, specularColorMin4.z, 1.f ); Colorf specularColorMax( specularColorMax4.x, specularColorMax4.y, specularColorMax4.z, 1.f ); Colorf c = ( (specularColorMax-specularColorMin) * m_groundLightmapColor + specularColorMin ).saturate(); fx->setVector4( desc.name, Vector4(c.red(),c.green(),c.blue(),1.f) ); } else if ( desc.dataType == Shader::PT_FLOAT && desc.dataClass == Shader::PC_VECTOR4 && desc.name.length() > 0 && Character::isLowerCase(desc.name.charAt(0)) && desc.name.indexOf("Camera") == -1 ) { bool paramResolved = false; bool objSpace = ( desc.name.length() > 2 && desc.name.charAt(1) == 'o' ); int baseNameOffset = objSpace ? 2 : 1; Node* node = 0; String name = desc.name.substring( baseNameOffset ); if ( keylight && name == "Light1" ) node = keylight; if ( node ) { Char ch = desc.name.charAt(0); if ( ch == 'd' ) { Vector3 v = node->worldTransform().rotation().getColumn(2); if ( objSpace ) v = worldTmInv.rotate(v); fx->setVector4( desc.name, Vector4(v.x, v.y, v.z, 0.f) ); paramResolved = true; } if ( ch == 'p' ) { Vector3 v = node->worldTransform().translation(); if ( objSpace ) v = worldTmInv.transform(v); fx->setVector4( desc.name, Vector4(v.x, v.y, v.z, 1.f) ); paramResolved = true; } } if ( !paramResolved ) { Debug::printlnError( "Mesh {2} shader {0} parameter {1} could not be resolved", fx->name(), desc.name, mesh->name() ); } } } }