--- cvsroot/libgender/material.C 2004/10/23 02:27:51 1.13 +++ cvsroot/libgender/material.C 2004/10/23 21:43:27 1.14 @@ -7,302 +7,6 @@ #include "material.h" #include "util.h" -namespace shader { - - refcounted::~refcounted () - { -#if 0 - if (refcnt) - abort (); -#endif - } - - const char str_float [] = "float"; - const char str_vec2 [] = "vec2"; - const char str_vec3 [] = "vec3"; - const char str_vec4 [] = "vec4"; - const char str_mat2 [] = "mat2"; - const char str_mat3 [] = "mat3"; - const char str_mat4 [] = "mat4"; - - const char str_sampler_1d [] = "sampler1D"; - const char str_sampler_1d_shadow [] = "sampler1DShadow"; - const char str_sampler_2d [] = "sampler2D"; - const char str_sampler_2d_shadow [] = "sampler2DShadow"; - const char str_sampler_2d_rect [] = "sampler2DRect"; - const char str_sampler_2d_rect_shadow [] = "sampler2DRectShadow"; - const char str_sampler_3d [] = "sampler3D"; - const char str_sampler_3d_rect [] = "sampler3DRect"; - const char str_sampler_cube [] = "samplerCube"; - - unsigned int var_i::next_id = 0; - - var_i::var_i (CGtype cgtype, const char *typestr) - : typestr (typestr) - { - //param = cgCreateParameter (cg_context, cgtype); - } - - var_i::~var_i () - { - //cgDestroyParameter (param); - } - - temporary_i::temporary_i (CGtype cgtype, const char *strtype) - : var_i (cgtype, strtype) - { - sprintf (name, "T%lx_%d", ((long)this >> 4) & 0xfff, ++next_id); - } - - uniform_i::uniform_i (CGtype cgtype, const char *strtype) - : var_i (cgtype, strtype), dirty (true) - { - sprintf (name, "U%lx_%d", ((long)this >> 4) & 0xfff, ++next_id); - } - - //////////////////////////////////////////////////////////////////////////// - - void var_i::build_decl (ostringstream &b) - { - b << typestr << ' ' << name; - } - - void uniform_i::build_decl (ostringstream &b) - { - b << "uniform " << typestr << ' ' << name; - } - - void stream_i::build_decl (ostringstream &b) - { - b << typestr << ' ' << name; - } - - //////////////////////////////////////////////////////////////////////////// - - void glvar_i::build (shader_builder &b) - { - b << name; - } - - void var_i::build (shader_builder &b) - { - b << name; - } - - void uniform_i::build (shader_builder &b) - { - var_i::build (b); - - if (find (b.refs.begin (), b.refs.end (), uniform (*this)) == b.refs.end ()) - b.refs.push_back (*this); - } - - void stream_i::build (shader_builder &b) - { - var_i::build (b); - - if (find (b.streams.begin (), b.streams.end (), var (*this)) == b.streams.end ()) - b.streams.push_back (*this); - } - - void temporary_i::build (shader_builder &b) - { - var_i::build (b); - - if (find (b.temps.begin (), b.temps.end (), var (*this)) == b.temps.end ()) - b.temps.push_back (*this); - } - - void fragment_vector_i::build (shader_builder &b) - { - for (vector::iterator i = begin (); i != end (); i++) - (*i)->build (b); - } - - void fragment_const_string_i::build (shader_builder &b) - { - b << str; - } - - void statement_i::build (shader_builder &b) - { - b << " "; - fragment_vector_i::build (b); - b << ";\n"; - } - - //////////////////////////////////////////////////////////////////////////// - - struct vin vin; - - varying_3f vin::position_3f ("gl_Vertex"); - varying_4f vin::position_4f ("gl_Vertex"); - varying_3f vin::normal_3f ("gl_Normal"); - varying_3f vin::color_3f ("gl_Color"); - varying_4f vin::color_4f ("gl_Color"); - varying_3f vin::color2_3f ("gl_SecondaryColor"); - varying_4f vin::color2_4f ("gl_SecondaryColor"); - varying_1f vin::texcoord_1f[8] = - { - varying_1f ("gl_TexCoord[0]"), varying_1f ("gl_TexCoord[1]"), varying_1f ("gl_TexCoord[2]"), varying_1f ("gl_TexCoord[3]"), - varying_1f ("gl_TexCoord[4]"), varying_1f ("gl_TexCoord[5]"), varying_1f ("gl_TexCoord[6]"), varying_1f ("gl_TexCoord[7]"), - }; - varying_2f vin::texcoord_2f[8] = - { - varying_2f ("gl_TexCoord[0]"), varying_2f ("gl_TexCoord[1]"), varying_2f ("gl_TexCoord[2]"), varying_2f ("gl_TexCoord[3]"), - varying_2f ("gl_TexCoord[4]"), varying_2f ("gl_TexCoord[5]"), varying_2f ("gl_TexCoord[6]"), varying_2f ("gl_TexCoord[7]"), - }; - varying_3f vin::texcoord_3f[8] = - { - varying_3f ("gl_TexCoord[0]"), varying_3f ("gl_TexCoord[1]"), varying_3f ("gl_TexCoord[2]"), varying_3f ("gl_TexCoord[3]"), - varying_3f ("gl_TexCoord[4]"), varying_3f ("gl_TexCoord[5]"), varying_3f ("gl_TexCoord[6]"), varying_3f ("gl_TexCoord[7]"), - }; - varying_4f vin::texcoord_4f[8] = - { - varying_4f ("gl_TexCoord[0]"), varying_4f ("gl_TexCoord[1]"), varying_4f ("gl_TexCoord[2]"), varying_4f ("gl_TexCoord[3]"), - varying_4f ("gl_TexCoord[4]"), varying_4f ("gl_TexCoord[5]"), varying_4f ("gl_TexCoord[6]"), varying_4f ("gl_TexCoord[7]"), - }; - varying_1f vin::psize_1f ("PSIZE"); - - glvar vout::position ("gl_Position"); - glvar vout::point_size ("gl_PointSize"); - glvar vout::clip_vertex ("gl_ClipVertex"); - glvar vout::front_color ("gl_FontColor"); - glvar vout::back_color ("gl_BackColor"); - glvar vout::front_secondary_color ("gl_FrontSecondaryColor"); - glvar vout::back_secondary_color ("gl_BackSecondaryColor"); - glvar vout::texcoord[8] = - { - glvar ("gl_TexCoord[0]"), glvar ("gl_TexCoord[1]"), glvar ("gl_TexCoord[2]"), glvar ("gl_TexCoord[3]"), - glvar ("gl_TexCoord[4]"), glvar ("gl_TexCoord[5]"), glvar ("gl_TexCoord[6]"), glvar ("gl_TexCoord[7]"), - }; - glvar vout::fog_frag_coord ("gl_FogFragCoord"); - - glvar fin::frag_coord ("gl_FragCoord"); - glvar fin::color ("gl_Color"); - glvar fin::secondary_color ("gl_SecondaryColor"); - glvar fin::texcoord[8] = - { - glvar ("gl_TexCoord[0]"), glvar ("gl_TexCoord[1]"), glvar ("gl_TexCoord[2]"), glvar ("gl_TexCoord[3]"), - glvar ("gl_TexCoord[4]"), glvar ("gl_TexCoord[5]"), glvar ("gl_TexCoord[6]"), glvar ("gl_TexCoord[7]"), - }; - glvar fin::fog_frag_coord ("gl_FogFragCoord"); - - glvar fout::frag_color ("gl_FragColor"); - glvar fout::frag_depth ("gl_FragDepth"); - glvar fout::frag_data[2] = { glvar ("gl_FragData[0]"), glvar ("gl_FragData[1]") }; - -#if 0 - varying_4f fin::position_4f ("gl_Position"); - varying_4f fin::color_4f ("gl_Color"); - varying_4f fin::color2_4f ("gl_SecondaryColor"); - varying_4f fin::texcoord_4f[8] = - { - varying_4f ("gl_TexCoord[0]"), varying_4f ("gl_TexCoord[1]"), varying_4f ("gl_TexCoord[2]"), varying_4f ("gl_TexCoord[3]"), - varying_4f ("gl_TexCoord[4]"), varying_4f ("gl_TexCoord[5]"), varying_4f ("gl_TexCoord[6]"), varying_4f ("gl_TexCoord[7]"), - }; -#endif - - struct fout fout; - -#if 0 - varying_4f fout::color_4f ("gl_FragColor"); - varying_1f fout::depth_1f ("gl_FragDepth"); -#endif - - //////////////////////////////////////////////////////////////////////////// - - shader_object_i::shader_object_i (GLenum type) - : type (type) - { - id = glCreateShaderObjectARB (type); - } - - shader_object_i::~shader_object_i () - { - glDeleteObjectARB (id); - } - - string shader_object_i::source () - { - shader_builder b; - build (b); - ostringstream os; - - for (vector::iterator i = b.refs.begin (); i != b.refs.end (); i++) - { - (*i)->build_decl (os); - os << ";\n"; - } - -#if 0 - // not neccessary right now, as GLSL is rich on predefinitions - for (vector::iterator i = b.streams.begin (); i != b.streams.end (); i++) - { - if (vout.is (*i) || fout.is (*i)) - os << "varying "; - else if (vin.is (*i)) - os << "attribute "; - - (*i)->build_decl (os); - os << ";\n"; - } -#endif - - os << "\nvoid main (void)\n{\n"; - - for (vector::iterator i = b.temps.begin (); i != b.temps.end (); i++) - { - os << " "; - (*i)->build_decl (os); - os << ";\n"; - } - - os << "\n"; - os << b.source.str (); - os << "}\n"; - - return os.str (); - } - - void shader_object_i::compile () - { - string src = source (); - const char *sptr = src.data (); - const int slen = src.size (); - - printf ("SOURCE<%s>\n", src.c_str ()); - - glShaderSourceARB (id, 1, &sptr, &slen); - glCompileShaderARB (id); - - GLint compiled; - glGetObjectParameterivARB (id, GL_OBJECT_COMPILE_STATUS_ARB, &compiled); - - if (!compiled) - { - char infolog[8192]; - glGetInfoLogARB (id, 8192, NULL, infolog); - printf ("INFOLOG<%s>\n", infolog); - abort (); - } - } - -void debdebdebdebug ()//D -{ - fragment_shader p; - temp_4f t1, t2; - sampler_2d s2d (1); - - //p << t2 << " = texture2D (" << s2d << ", " << vin.position_4f << ".xy)"; - //p << t1 << " = mul (" << vin.position_4f << "," << mvp << ")"; - p << fout.frag_color << " = vec4(1,1,1,0)"; - - p->compile (); -} - -} - material::~material () { }