void GlfSimpleMaterial::Bind() { glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, GetAmbient().GetArray()); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, GetDiffuse().GetArray()); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, GetSpecular().GetArray()); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, GetEmission().GetArray()); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, GetShininess()); }
void Light::SetupLight(int lightIndex){ glEnable(GL_LIGHT0+lightIndex); // Setup and enable light 0 glLightfv(GL_LIGHT0+lightIndex,GL_AMBIENT, glm::value_ptr(GetAmbient())); glLightfv(GL_LIGHT0+lightIndex,GL_DIFFUSE, glm::value_ptr(GetDiffuse())); glLightfv(GL_LIGHT0+lightIndex,GL_SPECULAR, glm::value_ptr(GetSpecular())); glLighti(GL_LIGHT0+lightIndex, GL_SPOT_CUTOFF, spotCutoff); glLightfv(GL_LIGHT0+lightIndex,GL_SPOT_DIRECTION, glm::value_ptr(spotDirection)); float w = 0; if (GetLightType()==PointLight){ w = 1; } else if (GetLightType()==DirectionalLight){ w = 0; } SceneObject *sceneObject = GetOwner(); assert(sceneObject != NULL); glm::vec4 lightPos(sceneObject->GetTransform()->GetPosition(), w); glLightfv(GL_LIGHT0+lightIndex,GL_POSITION, glm::value_ptr(lightPos)); }
//???????????????????????????????????????????????????????????????????????? // The stdID parameter doesn't really have a meaning in this case. // bool Matte::EvalMonoStdChannel ( ShadeContext& sc, // describes context of evaluation int stdID, // must be ID_AM, ect float& outVal // output var ) { switch ( stdID ) { case ID_BU: // Bump (value 8) case ID_RR: // Refraction (value 10) case ID_DP: // Displacement (value 11) case ID_SI: // Self-illumination (value 5) case ID_FI: // Filter color (value 7) return false; break; case ID_RL: // Reflection (value 9) if ( sc.doMaps && reflmap && useReflMap && reflmap->IsOutputMeaningful(sc) ) { if ( reflmap->HandleOwnViewPerturb() ) { sc.TossCache(reflmap); outVal = reflmap->EvalMono(sc); } else { AColor rcol; rcol = sc.EvalEnvironMap( reflmap, sc.ReflectVector() ); Color rc; rc = Color(rcol.r,rcol.g,rcol.b)*reflAmt; outVal = Intens(rc); } } else return false; break; case ID_AM: // Ambient (value 0) outVal = Intens( GetAmbient() ); break; case ID_DI: // Diffuse (value 1) outVal = Intens( GetDiffuse() ); break; case ID_SP: // Specular (value 2) outVal = Intens( GetSpecular() ); break; case ID_SH: // Shininess (value 3). In R3 and later this is called Glossiness. outVal = GetShininess(); break; case ID_SS: // Shininess strength (value 4). In R3 and later this is called Specular Level. outVal = GetShinStr(); break; case ID_OP: // Opacity (value 6) outVal = GetXParency(); break; default: // Should never happen //DbgAssert( false ); return false; break; } return true; }
void MaterialHandler::ProcessData(FbxSurfaceMaterial* pMaterial, unsigned int materialCount, MaterialExport* outputMat, SceneMap* sceneMap) { MaterialHeader materialStruct; //diffuse property FbxProperty diffProp = pMaterial->FindProperty(FbxSurfaceMaterial::sDiffuse); unsigned int diffMapCount = diffProp.GetSrcObjectCount<FbxFileTexture>(); memcpy(materialStruct.matName, pMaterial->GetName(), sizeof(char) * 256); materialStruct.Id = sceneMap->materialHash[pMaterial->GetName()]; //check if there are texturemaps if (diffMapCount > 0) { memcpy(materialStruct.diffMap, GetTextureMap(diffProp), sizeof(char) * 256); materialStruct.diffuseVal[0] = 0.0f; materialStruct.diffuseVal[1] = 0.0f; materialStruct.diffuseVal[2] = 0.0f; } else { GetDiffuse(pMaterial, materialStruct.diffuseVal); memcpy(materialStruct.diffMap, "", sizeof(char) * 256); } //SpecularProperty FbxProperty specProp = pMaterial->FindProperty(FbxSurfaceMaterial::sSpecular); unsigned int specMapCount = specProp.GetSrcObjectCount<FbxFileTexture>(); FbxSurfacePhong* tmpCompare = (FbxSurfacePhong*)pMaterial; if (specMapCount > 0) { memcpy(materialStruct.specMap, GetSpecularMap(specProp), sizeof(char) * 256); materialStruct.specularVal[0] = 0.0f; materialStruct.specularVal[1] = 0.0f; materialStruct.specularVal[2] = 0.0f; } else { if (pMaterial->GetClassId().Is(FbxSurfacePhong::ClassId)) { GetSpecular(pMaterial, materialStruct.specularVal); memcpy(materialStruct.specMap, "", sizeof(char) * 256); } else { materialStruct.specularVal[0] = 0.0f; materialStruct.specularVal[1] = 0.0f; materialStruct.specularVal[2] = 0.0f; memcpy(materialStruct.specMap, "", sizeof(char) * 256); } } //NormalMap properties FbxProperty normMapProp = pMaterial->FindProperty(FbxSurfaceMaterial::sNormalMap); unsigned int normMapCount = normMapProp.GetSrcObjectCount<FbxFileTexture>(); if (normMapCount > 0) { memcpy(materialStruct.normalMap, GetNormalMap(normMapProp), sizeof(char) * 256); } else { memcpy(materialStruct.normalMap, "", sizeof(char) * 256); } //GlowMap proporties FbxProperty glowMapProp = pMaterial->FindProperty(FbxSurfaceMaterial::sEmissive); unsigned int glowMapCount = glowMapProp.GetSrcObjectCount<FbxFileTexture>(); if (glowMapCount > 0) { memcpy(materialStruct.glowMap, GetGlowMap(glowMapProp), sizeof(char) * 256); } else { memcpy(materialStruct.glowMap, "", sizeof(char) * 256); } outputMat->materials->push_back(materialStruct); std::cout << ""; }