void Shader::SetUniformDirectionalLight(const char* name, const DirectionalLight& light) { string baseName = name; SetUniform3f((baseName + ".color").c_str(), light.color.ToVector3()); SetUniform1f((baseName + ".ambientIntensity").c_str(), light.ambientIntensity); SetUniform3f((baseName + ".direction").c_str(), light.direction); SetUniform1f((baseName + ".diffuseIntensity").c_str(), light.diffuseIntensity); }
GLvoid glFogf(GLenum pname, GLfloat param) { wes_vertbuffer_flush(); switch(pname) { case GL_FOG_DENSITY: SetUniform1f(uFogDensity, param); break; case GL_FOG_START: SetUniform1f(uFogStart, param); break; case GL_FOG_END: SetUniform1f(uFogEnd, param); break; } }
void Shader::ResolveAndSetUniform(ShaderUniformDeclaration* uniform, byte* data, int offset) { switch (uniform->GetType()) { case ShaderUniformDeclaration::Type::FLOAT32: SetUniform1f(uniform->GetLocation(), *(float*)&data[offset]); break; case ShaderUniformDeclaration::Type::SAMPLER2D: case ShaderUniformDeclaration::Type::INT32: SetUniform1i(uniform->GetLocation(), *(int*)&data[offset]); break; case ShaderUniformDeclaration::Type::VEC2: SetUniform2f(uniform->GetLocation(), *(maths::vec2*)&data[offset]); break; case ShaderUniformDeclaration::Type::VEC3: SetUniform3f(uniform->GetLocation(), *(maths::vec3*)&data[offset]); break; case ShaderUniformDeclaration::Type::VEC4: SetUniform4f(uniform->GetLocation(), *(maths::vec4*)&data[offset]); break; case ShaderUniformDeclaration::Type::MAT3: // TODO: SetUniformMat3(uniform->GetLocation(), *(maths::mat3*)&data[offset]); break; case ShaderUniformDeclaration::Type::MAT4: SetUniformMat4(uniform->GetLocation(), *(maths::mat4*)&data[offset]); break; default: SP_ASSERT(false, "Unknown type!"); } }
void Shader::Bind() { glUseProgram(shader_program); for(auto i : const_uniform1f) { SetUniform1f(i.first, i.second); } for(auto i : const_uniform1i) { SetUniform1i(i.first, i.second); } }
GLvoid glMaterialf(GLenum face, GLenum pname, GLfloat params) { wes_vertbuffer_flush(); switch(pname) { case GL_SHININESS: if (face == GL_FRONT){ SetUniform1f(uMaterial[0].SpecExponent, params); } else if (face == GL_BACK){ SetUniform1f(uMaterial[1].SpecExponent, params); } else if (face == GL_FRONT_AND_BACK){ SetUniform1f(uMaterial[0].SpecExponent, params); SetUniform1f(uMaterial[1].SpecExponent, params); } break; default: PRINT_ERROR("Invalid glMaterialf parameter name\n"); } }
GLvoid glAlphaFunc(GLenum func, GLclampf ref) { wes_vertbuffer_flush(); if (func == GL_NEVER){ u_progstate.uAlphaFunc = WES_ALPHA_NEVER; } else if (func == GL_LESS){ u_progstate.uAlphaFunc = WES_ALPHA_LESS; } else if (func == GL_EQUAL){ u_progstate.uAlphaFunc = WES_ALPHA_EQUAL; } else if (func == GL_LEQUAL){ u_progstate.uAlphaFunc = WES_ALPHA_LEQUAL; } else if (func == GL_GREATER){ u_progstate.uAlphaFunc = WES_ALPHA_GREATER; } else if (func == GL_NOTEQUAL){ u_progstate.uAlphaFunc = WES_ALPHA_NOTEQUAL; } else if (func == GL_GEQUAL){ u_progstate.uAlphaFunc = WES_ALPHA_GEQUAL; } else if (func == GL_ALWAYS){ u_progstate.uAlphaFunc = WES_ALPHA_ALWAYS; } SetUniform1f(uAlphaRef, ref); }
GLvoid glMaterialfv(GLenum face, GLenum pname, GLfloat *params) { wes_vertbuffer_flush(); switch(pname) { case GL_AMBIENT: if (face == GL_FRONT){ SetUniform4fv(uMaterial[0].ColorAmbient, params); } else if (face == GL_BACK){ SetUniform4fv(uMaterial[1].ColorAmbient, params); } else if (face == GL_FRONT_AND_BACK){ SetUniform4fv(uMaterial[0].ColorAmbient, params); SetUniform4fv(uMaterial[1].ColorAmbient, params); } break; case GL_DIFFUSE: if (face == GL_FRONT){ SetUniform4fv(uMaterial[0].ColorDiffuse, params); } else if (face == GL_BACK){ SetUniform4fv(uMaterial[1].ColorDiffuse, params); } else if (face == GL_FRONT_AND_BACK){ SetUniform4fv(uMaterial[0].ColorDiffuse, params); SetUniform4fv(uMaterial[1].ColorDiffuse, params); } break; case GL_AMBIENT_AND_DIFFUSE: if (face == GL_FRONT){ SetUniform4fv(uMaterial[0].ColorAmbient, params); SetUniform4fv(uMaterial[0].ColorDiffuse, params); } else if (face == GL_BACK){ SetUniform4fv(uMaterial[1].ColorAmbient, params); SetUniform4fv(uMaterial[1].ColorDiffuse, params); } else if (face == GL_FRONT_AND_BACK){ SetUniform4fv(uMaterial[0].ColorAmbient, params); SetUniform4fv(uMaterial[0].ColorDiffuse, params); SetUniform4fv(uMaterial[1].ColorAmbient, params); SetUniform4fv(uMaterial[1].ColorDiffuse, params); } break; case GL_SPECULAR: if (face == GL_FRONT){ SetUniform4fv(uMaterial[0].ColorSpec, params); } else if (face == GL_BACK){ SetUniform4fv(uMaterial[1].ColorSpec, params); } else if (face == GL_FRONT_AND_BACK){ SetUniform4fv(uMaterial[0].ColorSpec, params); SetUniform4fv(uMaterial[1].ColorSpec, params); } break; case GL_EMISSION: if (face == GL_FRONT){ SetUniform4fv(uMaterial[0].ColorEmissive, params); } else if (face == GL_BACK){ SetUniform4fv(uMaterial[1].ColorEmissive, params); } else if (face == GL_FRONT_AND_BACK){ SetUniform4fv(uMaterial[0].ColorEmissive, params); SetUniform4fv(uMaterial[1].ColorEmissive, params); } break; case GL_SHININESS: if (face == GL_FRONT){ SetUniform1f(uMaterial[0].SpecExponent, *params); } else if (face == GL_BACK){ SetUniform1f(uMaterial[1].SpecExponent, *params); } else if (face == GL_FRONT_AND_BACK){ SetUniform1f(uMaterial[0].SpecExponent, *params); SetUniform1f(uMaterial[1].SpecExponent, *params); } break; default: PRINT_ERROR("Invalid glMaterialfv parameter name\n"); } }
GLvoid wes_state_init() { int i; u_activetex = 0; SetUniform1i(uEnableRescaleNormal, 0); SetUniform1i(uEnableNormalize, 0); for(i = 0; i != WES_CLIPPLANE_NUM; i++){ SetUniform4i(uEnableTextureGen[i], 0, 0, 0, 0); } for(i = 0; i != WES_CLIPPLANE_NUM; i++){ SetUniform1i(uEnableClipPlane[i], 0); } SetUniform1i(uEnableLighting, 0); SetUniform1i(uEnableColorMaterial, 0); SetUniform1i(uEnableFog, 0); SetUniform1i(uEnableFogCoord, 0); for(i = 0; i != WES_LIGHT_NUM; i++){ SetUniform1i(uEnableLight[i], 0); SetUniform4f(uLight[i].Position, 0.0, 0.0, 1.0, 0.0); SetUniform3f(uLight[i].Attenuation, 1.0, 0.0, 0.0); SetUniform4f(uLight[i].ColorAmbient, 0.0, 0.0, 0.0, 1.0); SetUniform4f(uLight[i].ColorDiffuse, 0.0, 0.0, 0.0, 1.0); SetUniform4f(uLight[i].ColorSpec, 0.0, 0.0, 0.0, 1.0); SetUniform3f(uLight[i].SpotDir, 0.0, 0.0, -1.0); SetUniform2f(uLight[i].SpotVar, 0.0, 180.0); } /* GL_LIGHT0's default parameters differ in these cases: */ SetUniform4f(uLight[0].ColorDiffuse, 1.0, 1.0, 1.0, 1.0); SetUniform4f(uLight[0].ColorSpec, 1.0, 1.0, 1.0, 1.0); SetUniform1f(uRescaleFactor, 1.0); for(i = 0; i != WES_FACE_NUM; i++){ SetUniform4f(uMaterial[i].ColorAmbient, 0.2, 0.2, 0.2, 1.0); SetUniform4f(uMaterial[i].ColorDiffuse, 0.8, 0.8, 0.8, 1.0); SetUniform4f(uMaterial[i].ColorSpec, 0.0, 0.0, 0.0, 1.0); SetUniform4f(uMaterial[i].ColorEmissive, 0.0, 0.0, 0.0, 1.0); SetUniform1f(uMaterial[i].SpecExponent, 0.0); SetUniform1i(uMaterial[i].ColorMaterial, 0); } SetUniform4f(uLightModel.ColorAmbient, 0.0, 0.0, 0.0, 1.0); SetUniform1i(uLightModel.TwoSided, GL_FALSE); SetUniform1i(uLightModel.LocalViewer, GL_FALSE); SetUniform1i(uLightModel.ColorControl, 0); SetUniform1i(uFogMode, 1); SetUniform1f(uFogDensity, 1.0); SetUniform1f(uFogStart, 0.0); SetUniform1f(uFogEnd, 1.0); SetUniform4f(uFogColor, 0.0, 0.0, 0.0, 0.0); for(i = 0; i < WES_MULTITEX_NUM; i++){ SetUniform1i(uTexUnit[i], i); SetUniform4f(uTexEnvColor[i], 0.0f, 0.0f, 0.0f, 0.0f); } SetUniform1f(uAlphaRef, 0.0); u_progstate.uEnableAlphaTest = 0; u_progstate.uEnableFog = 0; u_progstate.uEnableClipPlane = 0; u_progstate.uAlphaFunc = 8; for(i = 0; i < WES_MULTITEX_NUM; i++){ u_progstate.uTexture[i].Enable = 0; u_progstate.uTexture[i].Mode = WES_FUNC_MODULATE; u_progstate.uTexture[i].RGBCombine = WES_FUNC_MODULATE; u_progstate.uTexture[i].AlphaCombine = WES_FUNC_MODULATE; u_progstate.uTexture[i].Arg[0].RGBSrc = WES_SRC_TEXTURE; u_progstate.uTexture[i].Arg[1].RGBSrc = WES_SRC_PREVIOUS; u_progstate.uTexture[i].Arg[2].RGBSrc = WES_SRC_CONSTANT; u_progstate.uTexture[i].Arg[0].AlphaSrc = WES_SRC_TEXTURE; u_progstate.uTexture[i].Arg[1].AlphaSrc = WES_SRC_PREVIOUS; u_progstate.uTexture[i].Arg[2].AlphaSrc = WES_SRC_CONSTANT; u_progstate.uTexture[i].Arg[0].RGBOp = WES_OP_COLOR; u_progstate.uTexture[i].Arg[1].RGBOp = WES_OP_COLOR; u_progstate.uTexture[i].Arg[2].RGBOp = WES_OP_ALPHA; u_progstate.uTexture[i].Arg[0].AlphaOp = WES_OP_ALPHA; u_progstate.uTexture[i].Arg[1].AlphaOp = WES_OP_ALPHA; u_progstate.uTexture[i].Arg[2].AlphaOp = WES_OP_ALPHA; } u_progstate.uTexture[0].Enable = 1; //wes_state_update(); }
void Shader::SetUniform1f(const String& name, float value) { SetUniform1f(GetUniformLocation(name), value); }