X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogram.cpp;h=f6eaed1ee4eeb8bdb0853af07423ecbdbae5ef4d;hb=48fc090a59a5ff5c3f06ffe1acfe77b06dad2a86;hp=6fa1495387fb3280452b099dcc38dcb1ff561b38;hpb=2e7f19b895424c3a77940e648639f8df2b395d0f;p=libs%2Fgl.git diff --git a/source/program.cpp b/source/program.cpp index 6fa14953..f6eaed1e 100644 --- a/source/program.cpp +++ b/source/program.cpp @@ -20,11 +20,15 @@ const char *standard_vertex_src[] = "l!n", "varying vec3 v_normal;\n", "l", "varying vec3 v_light_dir;\n", "p", "varying vec3 v_eye_dir;\n", + "r", "vec4 transform_vertex(vec4);\n", + "lr", "vec3 transform_normal(vec3);\n", 0, "void main()\n", 0, "{\n", - 0, "\tvec4 eye_pos = gl_ModelViewMatrix*gl_Vertex;\n", + "r", "\tvec4 eye_pos = transform_vertex(gl_Vertex);\n", + "!r", "\tvec4 eye_pos = gl_ModelViewMatrix*gl_Vertex;\n", 0, "\tgl_Position = gl_ProjectionMatrix*eye_pos;\n", - "l", "\tvec3 eye_normal = gl_NormalMatrix*gl_Normal;\n", + "lr", "\tvec3 eye_normal = transform_normal(gl_Normal);\n", + "l!r", "\tvec3 eye_normal = gl_NormalMatrix*gl_Normal;\n", "l!n", "\tv_normal = eye_normal;\n", "n", "\tvec3 eye_tangent = gl_NormalMatrix*tangent;\n", "n", "\tvec3 eye_binormal = gl_NormalMatrix*binormal;\n", @@ -57,8 +61,8 @@ const char *standard_fragment_src[] = "n", "\tvec3 n_normal = texture2D(normalmap, v_texcoord).xyz*2.0-1.0;\n", "l!n", "\tvec3 n_normal = normalize(v_normal);\n", "l", "\tfloat l_diffuse = max(dot(n_normal, normalize(v_light_dir)), 0.0);\n", - "p", "\tvec3 half = normalize(v_eye_dir+v_light_dir);\n", - "p", "\tfloat l_specular = pow(max(dot(half, n_normal), 0.0), gl_FrontMaterial.shininess);\n", + "p", "\tvec3 half_dir = normalize(v_eye_dir+v_light_dir);\n", + "p", "\tfloat l_specular = pow(max(dot(half_dir, n_normal), 0.0), gl_FrontMaterial.shininess);\n", "s", "\tfloat l_shadow = shadow2D(shadow, v_shadowcoord).r;\n", 0, "\tgl_FragColor = ", "!t!l!m", "vec4(1.0, 1.0, 1.0, 1.0)", @@ -236,9 +240,11 @@ string Program::get_info_log() const { GLsizei len = 0; glGetObjectParameterivARB(id, GL_OBJECT_INFO_LOG_LENGTH_ARB, &len); - char log[len+1]; - glGetInfoLogARB(id, len+1, &len, log); - return string(log, len); + char *buf = new char[len+1]; + glGetInfoLogARB(id, len+1, &len, buf); + string log(buf, len); + delete[] buf; + return log; } void Program::bind() const @@ -276,7 +282,8 @@ Program::StandardFeatures::StandardFeatures(): lighting(false), specular(false), normalmap(false), - shadow(false) + shadow(false), + transform(false) { } string Program::StandardFeatures::create_flags() const @@ -296,6 +303,8 @@ string Program::StandardFeatures::create_flags() const } if(shadow) flags += 's'; + if(transform) + flags += 'r'; return flags; } @@ -349,6 +358,7 @@ Program::StandardFeatures::Loader::Loader(StandardFeatures &f): add("shadow", &StandardFeatures::shadow); add("specular", &StandardFeatures::specular); add("texture", &StandardFeatures::texture); + add("transform", &StandardFeatures::transform); } } // namespace GL