ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/libgender/material.C
(Generate patch)

Comparing cvsroot/libgender/material.C (file contents):
Revision 1.9 by root, Thu Oct 21 21:20:09 2004 UTC vs.
Revision 1.12 by root, Fri Oct 22 00:16:08 2004 UTC

14 if (refcnt) 14 if (refcnt)
15 abort (); 15 abort ();
16#endif 16#endif
17 } 17 }
18 18
19 const char str_float [] = "float"; 19 const char str_float [] = "float";
20 const char str_vec2 [] = "vec2";
21 const char str_vec3 [] = "vec3";
22 const char str_vec4 [] = "vec4";
20 const char str_float2 [] = "float2"; 23 const char str_mat2 [] = "mat2";
21 const char str_float3 [] = "float3"; 24 const char str_mat3 [] = "mat3";
22 const char str_float4 [] = "float4"; 25 const char str_mat4 [] = "mat4";
23 const char str_float4x4 [] = "float4x4"; 26
27 const char str_sampler_1d [] = "sampler1D";
28 const char str_sampler_1d_shadow [] = "sampler1DShadow";
29 const char str_sampler_2d [] = "sampler2D";
30 const char str_sampler_2d_shadow [] = "sampler2DShadow";
31 const char str_sampler_2d_rect [] = "sampler2DRect";
32 const char str_sampler_2d_rect_shadow [] = "sampler2DRectShadow";
33 const char str_sampler_3d [] = "sampler3D";
34 const char str_sampler_3d_rect [] = "sampler3DRect";
35 const char str_sampler_cube [] = "samplerCube";
24 36
25 static CGcontext cg_context = cgCreateContext (); 37 static CGcontext cg_context = cgCreateContext ();
26 38
27 int var_i::next_name = 0; 39 int var_i::next_name = 0;
28 40
48 b << "uniform " << typestr << ' ' << "V" << name; 60 b << "uniform " << typestr << ' ' << "V" << name;
49 } 61 }
50 62
51 void stream_i::build_decl (ostringstream &b) 63 void stream_i::build_decl (ostringstream &b)
52 { 64 {
53 b << typestr << ' ' << "V" << name; 65 b << typestr << ' ' << binding;
54 b << " : " << binding;
55 } 66 }
56 67
57 void var_i::build (shader_builder &b) 68 void var_i::build (shader_builder &b)
58 { 69 {
59 b << "V" << name; 70 b << "V" << name;
67 b.refs.push_back (*this); 78 b.refs.push_back (*this);
68 } 79 }
69 80
70 void stream_i::build (shader_builder &b) 81 void stream_i::build (shader_builder &b)
71 { 82 {
72 var_i::build (b); 83 b << binding;
73 84
74 if (find (b.streams.begin (), b.streams.end (), var (*this)) == b.streams.end ()) 85 if (find (b.streams.begin (), b.streams.end (), var (*this)) == b.streams.end ())
75 b.streams.push_back (*this); 86 b.streams.push_back (*this);
76 } 87 }
77 88
89 } 100 }
90 101
91 struct vin vin; 102 struct vin vin;
92 103
93 // MUST update is-function below 104 // MUST update is-function below
94 varying_3f vin::position_3f ("POSITION"); 105 varying_3f vin::position_3f ("gl_Vertex");
95 varying_4f vin::position_4f ("POSITION"); 106 varying_4f vin::position_4f ("gl_Vertex");
96 varying_3f vin::normal_3f ("NORMAL"); 107 varying_3f vin::normal_3f ("gl_Normal");
97 varying_4f vin::normal_4f ("NORMAL");
98 varying_3f vin::color0_3f ("COLOR0"); 108 varying_3f vin::color_3f ("gl_Color");
99 varying_4f vin::color0_4f ("COLOR0"); 109 varying_4f vin::color_4f ("gl_Color");
100 varying_3f vin::color1_3f ("COLOR1"); 110 varying_3f vin::color2_3f ("gl_SecondaryColor");
101 varying_4f vin::color1_4f ("COLOR1"); 111 varying_4f vin::color2_4f ("gl_SecondaryColor");
102 varying_2f vin::texcoord0_2f ("TEXCOORD0"); 112 varying_1f vin::texcoord_1f[8] =
103 varying_4f vin::texcoord0_4f ("TEXCOORD0"); 113 {
104 varying_2f vin::texcoord1_2f ("TEXCOORD1"); 114 varying_1f ("gl_TexCoord[0]"), varying_1f ("gl_TexCoord[1]"), varying_1f ("gl_TexCoord[2]"), varying_1f ("gl_TexCoord[3]"),
105 varying_4f vin::texcoord1_4f ("TEXCOORD1"); 115 varying_1f ("gl_TexCoord[4]"), varying_1f ("gl_TexCoord[5]"), varying_1f ("gl_TexCoord[6]"), varying_1f ("gl_TexCoord[7]"),
106 varying_2f vin::texcoord2_2f ("TEXCOORD2"); 116 };
107 varying_4f vin::texcoord2_4f ("TEXCOORD2"); 117 varying_2f vin::texcoord_2f[8] =
108 varying_2f vin::texcoord3_2f ("TEXCOORD3"); 118 {
109 varying_4f vin::texcoord3_4f ("TEXCOORD3"); 119 varying_2f ("gl_TexCoord[0]"), varying_2f ("gl_TexCoord[1]"), varying_2f ("gl_TexCoord[2]"), varying_2f ("gl_TexCoord[3]"),
110 varying_2f vin::texcoord4_2f ("TEXCOORD4"); 120 varying_2f ("gl_TexCoord[4]"), varying_2f ("gl_TexCoord[5]"), varying_2f ("gl_TexCoord[6]"), varying_2f ("gl_TexCoord[7]"),
111 varying_4f vin::texcoord4_4f ("TEXCOORD4"); 121 };
112 varying_2f vin::texcoord5_2f ("TEXCOORD5"); 122 varying_3f vin::texcoord_3f[8] =
113 varying_4f vin::texcoord5_4f ("TEXCOORD5"); 123 {
114 varying_2f vin::texcoord6_2f ("TEXCOORD6"); 124 varying_3f ("gl_TexCoord[0]"), varying_3f ("gl_TexCoord[1]"), varying_3f ("gl_TexCoord[2]"), varying_3f ("gl_TexCoord[3]"),
115 varying_4f vin::texcoord6_4f ("TEXCOORD6"); 125 varying_3f ("gl_TexCoord[4]"), varying_3f ("gl_TexCoord[5]"), varying_3f ("gl_TexCoord[6]"), varying_3f ("gl_TexCoord[7]"),
116 varying_2f vin::texcoord7_2f ("TEXCOORD7"); 126 };
117 varying_4f vin::texcoord7_4f ("TEXCOORD7"); 127 varying_4f vin::texcoord_4f[8] =
128 {
129 varying_4f ("gl_TexCoord[0]"), varying_4f ("gl_TexCoord[1]"), varying_4f ("gl_TexCoord[2]"), varying_4f ("gl_TexCoord[3]"),
130 varying_4f ("gl_TexCoord[4]"), varying_4f ("gl_TexCoord[5]"), varying_4f ("gl_TexCoord[6]"), varying_4f ("gl_TexCoord[7]"),
131 };
118 varying_1f vin::psize_1f ("PSIZE"); 132 varying_1f vin::psize_1f ("PSIZE");
119 varying_1f vin::attr6_1f ("ATTR6");
120 varying_1f vin::attr7_1f ("ATTR7");
121 varying_2f vin::attr6_2f ("ATTR6");
122 varying_2f vin::attr7_2f ("ATTR7");
123 varying_3f vin::attr6_3f ("ATTR6");
124 varying_3f vin::attr7_3f ("ATTR7");
125 varying_4f vin::attr6_4f ("ATTR6");
126 varying_4f vin::attr7_4f ("ATTR7");
127 133
128 bool vin::is (const var &r) 134 bool vin::is (const var &r)
129 { 135 {
130 return r == vin::position_3f 136 return r == vin::position_3f
131 || r == vin::position_4f 137 || r == vin::position_4f
132 || r == vin::normal_3f 138 || r == vin::normal_3f
133 || r == vin::normal_4f
134 || r == vin::color0_3f 139 || r == vin::color_3f
135 || r == vin::color0_4f 140 || r == vin::color_4f
136 || r == vin::color1_3f 141 || r == vin::color2_3f
137 || r == vin::color1_4f 142 || r == vin::color2_4f
138 || r == vin::texcoord0_2f 143 || r == vin::texcoord_1f[0] || r == vin::texcoord_1f[1] || r == vin::texcoord_1f[2] || r == vin::texcoord_1f[3]
139 || r == vin::texcoord0_4f 144 || r == vin::texcoord_1f[4] || r == vin::texcoord_1f[5] || r == vin::texcoord_1f[6] || r == vin::texcoord_1f[7]
140 || r == vin::texcoord1_2f 145 || r == vin::texcoord_2f[0] || r == vin::texcoord_2f[1] || r == vin::texcoord_2f[2] || r == vin::texcoord_2f[3]
141 || r == vin::texcoord1_4f 146 || r == vin::texcoord_2f[4] || r == vin::texcoord_2f[5] || r == vin::texcoord_2f[6] || r == vin::texcoord_2f[7]
142 || r == vin::texcoord2_2f 147 || r == vin::texcoord_3f[0] || r == vin::texcoord_3f[1] || r == vin::texcoord_3f[2] || r == vin::texcoord_3f[3]
143 || r == vin::texcoord2_4f 148 || r == vin::texcoord_3f[4] || r == vin::texcoord_3f[5] || r == vin::texcoord_3f[6] || r == vin::texcoord_3f[7]
144 || r == vin::texcoord3_2f 149 || r == vin::texcoord_4f[0] || r == vin::texcoord_4f[1] || r == vin::texcoord_4f[2] || r == vin::texcoord_4f[3]
145 || r == vin::texcoord3_4f 150 || r == vin::texcoord_4f[4] || r == vin::texcoord_4f[5] || r == vin::texcoord_4f[6] || r == vin::texcoord_4f[7];
146 || r == vin::texcoord4_2f
147 || r == vin::texcoord4_4f
148 || r == vin::texcoord5_2f
149 || r == vin::texcoord5_4f
150 || r == vin::texcoord6_2f
151 || r == vin::texcoord6_4f
152 || r == vin::texcoord7_2f
153 || r == vin::texcoord7_4f
154 || r == vin::psize_1f
155 || r == vin::attr6_1f
156 || r == vin::attr7_1f
157 || r == vin::attr6_2f
158 || r == vin::attr7_2f
159 || r == vin::attr6_3f
160 || r == vin::attr7_3f
161 || r == vin::attr6_4f
162 || r == vin::attr7_4f;
163 } 151 }
164 152
165 struct fin fin; 153 struct fin fin;
166 struct fin &vout = fin; 154 struct fin &vout = fin;
167 155
168 // MUST update is-function below 156 // MUST update is-function below
169 varying_4f fin::position_4f ("HPOS"); 157 varying_4f fin::position_4f ("gl_Position");
170 varying_4f fin::color0_4f ("COLOR0"); 158 varying_4f fin::color_4f ("gl_Color");
171 varying_4f fin::color1_4f ("COLOR1"); 159 varying_4f fin::color2_4f ("gl_SecondaryColor");
172 varying_4f fin::texcoord0_4f ("TEXCOORD0"); 160 varying_4f fin::texcoord_4f[8] =
173 varying_4f fin::texcoord1_4f ("TEXCOORD1"); 161 {
174 varying_4f fin::texcoord2_4f ("TEXCOORD2"); 162 varying_4f ("gl_TexCoord[0]"), varying_4f ("gl_TexCoord[1]"), varying_4f ("gl_TexCoord[2]"), varying_4f ("gl_TexCoord[3]"),
175 varying_4f fin::texcoord3_4f ("TEXCOORD3"); 163 varying_4f ("gl_TexCoord[4]"), varying_4f ("gl_TexCoord[5]"), varying_4f ("gl_TexCoord[6]"), varying_4f ("gl_TexCoord[7]"),
176 varying_4f fin::texcoord4_4f ("TEXCOORD4"); 164 };
177 varying_4f fin::texcoord5_4f ("TEXCOORD5");
178 varying_4f fin::texcoord6_4f ("TEXCOORD6");
179 varying_4f fin::texcoord7_4f ("TEXCOORD7");
180 165
181 bool fin::is (const var &r) 166 bool fin::is (const var &r)
182 { 167 {
183 return r == fin::position_4f 168 return r == fin::position_4f
184 || r == fin::color0_4f 169 || r == fin::color_4f
185 || r == fin::color1_4f 170 || r == fin::color2_4f
186 || r == fin::texcoord0_4f 171 || r == fin::texcoord_4f[0]
187 || r == fin::texcoord1_4f 172 || r == fin::texcoord_4f[1]
188 || r == fin::texcoord2_4f 173 || r == fin::texcoord_4f[2]
189 || r == fin::texcoord3_4f 174 || r == fin::texcoord_4f[3]
190 || r == fin::texcoord4_4f 175 || r == fin::texcoord_4f[4]
191 || r == fin::texcoord5_4f 176 || r == fin::texcoord_4f[5]
192 || r == fin::texcoord6_4f 177 || r == fin::texcoord_4f[6]
193 || r == fin::texcoord7_4f; 178 || r == fin::texcoord_4f[7];
194 } 179 }
195 180
196 struct fout fout; 181 struct fout fout;
197 182
198 // MUST update is-function below 183 // MUST update is-function below
199 varying_4f fout::color0_4f ("COLOR0"); 184 varying_4f fout::color_4f ("gl_FragColor");
200 varying_3f fout::color0_3f ("COLOR0");
201 varying_4f fout::color1_4f ("COLOR1");
202 varying_3f fout::color1_3f ("COLOR1");
203 varying_1f fout::depth_1f ("DEPTH"); 185 varying_1f fout::depth_1f ("gl_FragDepth");
204 186
205 bool fout::is (const var &r) 187 bool fout::is (const var &r)
206 { 188 {
207 return r == fout::color0_4f 189 return r == fout::color_4f
208 || r == fout::color0_3f
209 || r == fout::color1_4f
210 || r == fout::color1_3f
211 || r == fout::depth_1f; 190 || r == fout::depth_1f;
212 } 191 }
213 192
214 uniform_matrix_f_i mvp, mv, proj; 193 uniform_matrix_4f mvp, mv, proj;
215 194
216 void fragment_vector_i::build (shader_builder &b) 195 void fragment_vector_i::build (shader_builder &b)
217 { 196 {
218 for (vector<fragment>::iterator i = begin (); i != end (); i++) 197 for (vector<fragment>::iterator i = begin (); i != end (); i++)
219 (*i)->build (b); 198 (*i)->build (b);
223 { 202 {
224 shader_builder b; 203 shader_builder b;
225 build (b); 204 build (b);
226 ostringstream os; 205 ostringstream os;
227 206
228 os << "void main (\n"; 207 for (vector<uniform>::iterator i = b.refs.begin (); i != b.refs.end (); i++)
208 {
209 (*i)->build_decl (os);
210 os << ";\n";
211 }
212
213#if 0
214 // not neccessary right now, as GLSL is rich on predefinitions
229 for (vector<var>::iterator i = b.streams.begin (); i != b.streams.end (); i++) 215 for (vector<var>::iterator i = b.streams.begin (); i != b.streams.end (); i++)
230 { 216 {
217 if (vout.is (*i) || fout.is (*i))
231 os << " "; 218 os << "varying ";
232 219 else if (vin.is (*i))
233 if (is_vertex) 220 os << "attribute ";
234 {
235 if (vin.is (*i)) os << "in ";
236 if (vout.is (*i)) os << "out ";
237 }
238 else
239 {
240 if (fin.is (*i)) os << "in ";
241 if (fout.is (*i)) os << "out ";
242 }
243 221
244 (*i)->build_decl (os); 222 (*i)->build_decl (os);
245 os << ",\n"; 223 os << ";\n";
246 } 224 }
225#endif
247 226
248 for (vector<uniform>::iterator i = b.refs.begin (); i != b.refs.end (); i++) 227 os << "\nvoid main ()\n{\n";
249 {
250 os << " ";
251 (*i)->build_decl (os);
252 os << ",\n";
253 }
254
255 os << " uniform float unused_cg_broken_syntax\n";
256 os << ")\n{\n";
257 228
258 for (vector<var>::iterator i = b.temps.begin (); i != b.temps.end (); i++) 229 for (vector<var>::iterator i = b.temps.begin (); i != b.temps.end (); i++)
259 { 230 {
260 (*i)->build_decl (os); 231 (*i)->build_decl (os);
261 os << ";\n"; 232 os << ";\n";
270 } 241 }
271 242
272void debdebdebdebug ()//D 243void debdebdebdebug ()//D
273{ 244{
274 vertex_program p; 245 vertex_program p;
246 temp_4f t1, t2;
247 sampler_2d s2d (1);
275 248
249 p << t2 << " = tex2D (" << s2d << ", " << vin.position_4f << ".xy);\n";
276 p << vout.position_4f << " = mul(" << vin.position_4f << "," << mvp << ");"; 250 p << t1 << " = mul (" << vin.position_4f << "," << mvp << ");\n";
251 p << vout.position_4f << " = " << t1 << ";\n";
277 252
278 p.print (); 253 p.print ();
279 exit (0); 254 exit (0);
280} 255}
281 256

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines