--- cvsroot/libgender/material.C 2004/10/21 15:46:38 1.8 +++ cvsroot/libgender/material.C 2004/10/21 21:20:09 1.9 @@ -4,13 +4,30 @@ #include #include +#include + namespace shader { + refcounted::~refcounted () + { +#if 0 + if (refcnt) + abort (); +#endif + } + + const char str_float [] = "float"; + const char str_float2 [] = "float2"; + const char str_float3 [] = "float3"; + const char str_float4 [] = "float4"; + const char str_float4x4 [] = "float4x4"; + static CGcontext cg_context = cgCreateContext (); int var_i::next_name = 0; - var_i::var_i (CGtype cgtype) + var_i::var_i (CGtype cgtype, const char *typestr) + : typestr (typestr) { name = ++next_name; param = cgCreateParameter (cg_context, cgtype); @@ -21,39 +38,247 @@ cgDestroyParameter (param); } + void var_i::build_decl (ostringstream &b) + { + b << typestr << ' ' << "V" << name; + } + + void uniform_i::build_decl (ostringstream &b) + { + b << "uniform " << typestr << ' ' << "V" << name; + } + + void stream_i::build_decl (ostringstream &b) + { + b << typestr << ' ' << "V" << name; + b << " : " << binding; + } + void var_i::build (shader_builder &b) { - abort (); + b << "V" << 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_const_string_i::build (shader_builder &b) + { + b << str; } - void var_i::build_decl (shader_builder &b) + struct vin vin; + + // MUST update is-function below + varying_3f vin::position_3f ("POSITION"); + varying_4f vin::position_4f ("POSITION"); + varying_3f vin::normal_3f ("NORMAL"); + varying_4f vin::normal_4f ("NORMAL"); + varying_3f vin::color0_3f ("COLOR0"); + varying_4f vin::color0_4f ("COLOR0"); + varying_3f vin::color1_3f ("COLOR1"); + varying_4f vin::color1_4f ("COLOR1"); + varying_2f vin::texcoord0_2f ("TEXCOORD0"); + varying_4f vin::texcoord0_4f ("TEXCOORD0"); + varying_2f vin::texcoord1_2f ("TEXCOORD1"); + varying_4f vin::texcoord1_4f ("TEXCOORD1"); + varying_2f vin::texcoord2_2f ("TEXCOORD2"); + varying_4f vin::texcoord2_4f ("TEXCOORD2"); + varying_2f vin::texcoord3_2f ("TEXCOORD3"); + varying_4f vin::texcoord3_4f ("TEXCOORD3"); + varying_2f vin::texcoord4_2f ("TEXCOORD4"); + varying_4f vin::texcoord4_4f ("TEXCOORD4"); + varying_2f vin::texcoord5_2f ("TEXCOORD5"); + varying_4f vin::texcoord5_4f ("TEXCOORD5"); + varying_2f vin::texcoord6_2f ("TEXCOORD6"); + varying_4f vin::texcoord6_4f ("TEXCOORD6"); + varying_2f vin::texcoord7_2f ("TEXCOORD7"); + varying_4f vin::texcoord7_4f ("TEXCOORD7"); + varying_1f vin::psize_1f ("PSIZE"); + varying_1f vin::attr6_1f ("ATTR6"); + varying_1f vin::attr7_1f ("ATTR7"); + varying_2f vin::attr6_2f ("ATTR6"); + varying_2f vin::attr7_2f ("ATTR7"); + varying_3f vin::attr6_3f ("ATTR6"); + varying_3f vin::attr7_3f ("ATTR7"); + varying_4f vin::attr6_4f ("ATTR6"); + varying_4f vin::attr7_4f ("ATTR7"); + + bool vin::is (const var &r) { - abort (); + return r == vin::position_3f + || r == vin::position_4f + || r == vin::normal_3f + || r == vin::normal_4f + || r == vin::color0_3f + || r == vin::color0_4f + || r == vin::color1_3f + || r == vin::color1_4f + || r == vin::texcoord0_2f + || r == vin::texcoord0_4f + || r == vin::texcoord1_2f + || r == vin::texcoord1_4f + || r == vin::texcoord2_2f + || r == vin::texcoord2_4f + || r == vin::texcoord3_2f + || r == vin::texcoord3_4f + || r == vin::texcoord4_2f + || r == vin::texcoord4_4f + || r == vin::texcoord5_2f + || r == vin::texcoord5_4f + || r == vin::texcoord6_2f + || r == vin::texcoord6_4f + || r == vin::texcoord7_2f + || r == vin::texcoord7_4f + || r == vin::psize_1f + || r == vin::attr6_1f + || r == vin::attr7_1f + || r == vin::attr6_2f + || r == vin::attr7_2f + || r == vin::attr6_3f + || r == vin::attr7_3f + || r == vin::attr6_4f + || r == vin::attr7_4f; } - template - varying_i::varying_i (const char *binding) - : var_i (cgtype) + struct fin fin; + struct fin &vout = fin; + + // MUST update is-function below + varying_4f fin::position_4f ("HPOS"); + varying_4f fin::color0_4f ("COLOR0"); + varying_4f fin::color1_4f ("COLOR1"); + varying_4f fin::texcoord0_4f ("TEXCOORD0"); + varying_4f fin::texcoord1_4f ("TEXCOORD1"); + varying_4f fin::texcoord2_4f ("TEXCOORD2"); + varying_4f fin::texcoord3_4f ("TEXCOORD3"); + varying_4f fin::texcoord4_4f ("TEXCOORD4"); + varying_4f fin::texcoord5_4f ("TEXCOORD5"); + varying_4f fin::texcoord6_4f ("TEXCOORD6"); + varying_4f fin::texcoord7_4f ("TEXCOORD7"); + + bool fin::is (const var &r) { - strcpy (this->binding, binding); + return r == fin::position_4f + || r == fin::color0_4f + || r == fin::color1_4f + || r == fin::texcoord0_4f + || r == fin::texcoord1_4f + || r == fin::texcoord2_4f + || r == fin::texcoord3_4f + || r == fin::texcoord4_4f + || r == fin::texcoord5_4f + || r == fin::texcoord6_4f + || r == fin::texcoord7_4f; } - varying_3f_i position_3f_i ("POSITION"); - varying_3f_i normal_3f_i ("NORMAL"); - varying_3f_i color0_3f_i ("COLOR0"); - varying_3f_i color1_3f_i ("COLOR1"); - varying_2f_i texcoord0_2f_i ("TEXCOORD0"); - varying_2f_i texcoord1_2f_i ("TEXCOORD1"); - varying_2f_i texcoord2_2f_i ("TEXCOORD2"); - varying_2f_i texcoord3_2f_i ("TEXCOORD3"); - varying_2f_i texcoord4_2f_i ("TEXCOORD4"); - varying_2f_i texcoord5_2f_i ("TEXCOORD5"); - varying_2f_i texcoord6_2f_i ("TEXCOORD6"); - varying_2f_i texcoord7_2f_i ("TEXCOORD7"); - varying_1f_i psize_1f_i ("PSIZE"); - varying_1f_i attr6_1f_i ("ATTR6"), attr7_1f_i ("ATTR7"); - varying_2f_i attr6_2f_i ("ATTR6"), attr7_2f_i ("ATTR7"); - varying_3f_i attr6_3f_i ("ATTR6"), attr7_3f_i ("ATTR7"); + struct fout fout; + + // MUST update is-function below + varying_4f fout::color0_4f ("COLOR0"); + varying_3f fout::color0_3f ("COLOR0"); + varying_4f fout::color1_4f ("COLOR1"); + varying_3f fout::color1_3f ("COLOR1"); + varying_1f fout::depth_1f ("DEPTH"); + + bool fout::is (const var &r) + { + return r == fout::color0_4f + || r == fout::color0_3f + || r == fout::color1_4f + || r == fout::color1_3f + || r == fout::depth_1f; + } + + uniform_matrix_f_i mvp, mv, proj; + + void fragment_vector_i::build (shader_builder &b) + { + for (vector::iterator i = begin (); i != end (); i++) + (*i)->build (b); + } + + void shader_program::print () + { + shader_builder b; + build (b); + ostringstream os; + + os << "void main (\n"; + for (vector::iterator i = b.streams.begin (); i != b.streams.end (); i++) + { + os << " "; + + if (is_vertex) + { + if (vin.is (*i)) os << "in "; + if (vout.is (*i)) os << "out "; + } + else + { + if (fin.is (*i)) os << "in "; + if (fout.is (*i)) os << "out "; + } + + (*i)->build_decl (os); + os << ",\n"; + } + + for (vector::iterator i = b.refs.begin (); i != b.refs.end (); i++) + { + os << " "; + (*i)->build_decl (os); + os << ",\n"; + } + + os << " uniform float unused_cg_broken_syntax\n"; + os << ")\n{\n"; + + for (vector::iterator i = b.temps.begin (); i != b.temps.end (); i++) + { + (*i)->build_decl (os); + os << ";\n"; + } + + os << "\n"; + os << b.source.str (); + os << "\n}\n"; + + printf ("%s\n", os.str ().c_str ()); + + } + +void debdebdebdebug ()//D +{ + vertex_program p; + + p << vout.position_4f << " = mul(" << vin.position_4f << "," << mvp << ");"; + + p.print (); + exit (0); +} + } material::~material ()