… | |
… | |
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"; |
|
|
24 | |
26 | |
25 | const char str_sampler1d [] = "sampler1d"; |
27 | const char str_sampler_1d [] = "sampler1D"; |
|
|
28 | const char str_sampler_1d_shadow [] = "sampler1DShadow"; |
26 | const char str_sampler2d [] = "sampler2d"; |
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"; |
27 | const char str_sampler3d [] = "sampler3d"; |
33 | const char str_sampler_3d [] = "sampler3D"; |
|
|
34 | const char str_sampler_3d_rect [] = "sampler3DRect"; |
28 | const char str_samplerCUBE [] = "samplerCUBE"; |
35 | const char str_sampler_cube [] = "samplerCube"; |
29 | const char str_samplerRECT [] = "samplerRECT"; |
|
|
30 | |
36 | |
31 | static CGcontext cg_context = cgCreateContext (); |
37 | static CGcontext cg_context = cgCreateContext (); |
32 | |
38 | |
33 | int var_i::next_name = 0; |
39 | int var_i::next_name = 0; |
34 | |
40 | |
… | |
… | |
54 | b << "uniform " << typestr << ' ' << "V" << name; |
60 | b << "uniform " << typestr << ' ' << "V" << name; |
55 | } |
61 | } |
56 | |
62 | |
57 | void stream_i::build_decl (ostringstream &b) |
63 | void stream_i::build_decl (ostringstream &b) |
58 | { |
64 | { |
59 | b << typestr << ' ' << "V" << name; |
65 | b << typestr << ' ' << binding; |
60 | b << " : " << binding; |
|
|
61 | } |
66 | } |
62 | |
67 | |
63 | void var_i::build (shader_builder &b) |
68 | void var_i::build (shader_builder &b) |
64 | { |
69 | { |
65 | b << "V" << name; |
70 | b << "V" << name; |
… | |
… | |
73 | b.refs.push_back (*this); |
78 | b.refs.push_back (*this); |
74 | } |
79 | } |
75 | |
80 | |
76 | void stream_i::build (shader_builder &b) |
81 | void stream_i::build (shader_builder &b) |
77 | { |
82 | { |
78 | var_i::build (b); |
83 | b << binding; |
79 | |
84 | |
80 | 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 ()) |
81 | b.streams.push_back (*this); |
86 | b.streams.push_back (*this); |
82 | } |
87 | } |
83 | |
88 | |
… | |
… | |
95 | } |
100 | } |
96 | |
101 | |
97 | struct vin vin; |
102 | struct vin vin; |
98 | |
103 | |
99 | // MUST update is-function below |
104 | // MUST update is-function below |
100 | varying_3f vin::position_3f ("POSITION"); |
105 | varying_3f vin::position_3f ("gl_Vertex"); |
101 | varying_4f vin::position_4f ("POSITION"); |
106 | varying_4f vin::position_4f ("gl_Vertex"); |
102 | varying_3f vin::normal_3f ("NORMAL"); |
107 | varying_3f vin::normal_3f ("gl_Normal"); |
103 | varying_4f vin::normal_4f ("NORMAL"); |
|
|
104 | varying_3f vin::color0_3f ("COLOR0"); |
108 | varying_3f vin::color_3f ("gl_Color"); |
105 | varying_4f vin::color0_4f ("COLOR0"); |
109 | varying_4f vin::color_4f ("gl_Color"); |
106 | varying_3f vin::color1_3f ("COLOR1"); |
110 | varying_3f vin::color2_3f ("gl_SecondaryColor"); |
107 | varying_4f vin::color1_4f ("COLOR1"); |
111 | varying_4f vin::color2_4f ("gl_SecondaryColor"); |
108 | varying_1f vin::texcoord_1f[8] = |
112 | varying_1f vin::texcoord_1f[8] = |
109 | { |
113 | { |
110 | varying_1f ("TEXCOORD0"), varying_1f ("TEXCOORD1"), varying_1f ("TEXCOORD2"), varying_1f ("TEXCOORD3"), |
114 | varying_1f ("gl_TexCoord[0]"), varying_1f ("gl_TexCoord[1]"), varying_1f ("gl_TexCoord[2]"), varying_1f ("gl_TexCoord[3]"), |
111 | varying_1f ("TEXCOORD4"), varying_1f ("TEXCOORD5"), varying_1f ("TEXCOORD6"), varying_1f ("TEXCOORD7"), |
115 | varying_1f ("gl_TexCoord[4]"), varying_1f ("gl_TexCoord[5]"), varying_1f ("gl_TexCoord[6]"), varying_1f ("gl_TexCoord[7]"), |
112 | }; |
116 | }; |
113 | varying_2f vin::texcoord_2f[8] = |
117 | varying_2f vin::texcoord_2f[8] = |
114 | { |
118 | { |
115 | varying_2f ("TEXCOORD0"), varying_2f ("TEXCOORD1"), varying_2f ("TEXCOORD2"), varying_2f ("TEXCOORD3"), |
119 | varying_2f ("gl_TexCoord[0]"), varying_2f ("gl_TexCoord[1]"), varying_2f ("gl_TexCoord[2]"), varying_2f ("gl_TexCoord[3]"), |
116 | varying_2f ("TEXCOORD4"), varying_2f ("TEXCOORD5"), varying_2f ("TEXCOORD6"), varying_2f ("TEXCOORD7"), |
120 | varying_2f ("gl_TexCoord[4]"), varying_2f ("gl_TexCoord[5]"), varying_2f ("gl_TexCoord[6]"), varying_2f ("gl_TexCoord[7]"), |
117 | }; |
121 | }; |
118 | varying_3f vin::texcoord_3f[8] = |
122 | varying_3f vin::texcoord_3f[8] = |
119 | { |
123 | { |
120 | varying_3f ("TEXCOORD0"), varying_3f ("TEXCOORD1"), varying_3f ("TEXCOORD2"), varying_3f ("TEXCOORD3"), |
124 | varying_3f ("gl_TexCoord[0]"), varying_3f ("gl_TexCoord[1]"), varying_3f ("gl_TexCoord[2]"), varying_3f ("gl_TexCoord[3]"), |
121 | varying_3f ("TEXCOORD4"), varying_3f ("TEXCOORD5"), varying_3f ("TEXCOORD6"), varying_3f ("TEXCOORD7"), |
125 | varying_3f ("gl_TexCoord[4]"), varying_3f ("gl_TexCoord[5]"), varying_3f ("gl_TexCoord[6]"), varying_3f ("gl_TexCoord[7]"), |
122 | }; |
126 | }; |
123 | varying_4f vin::texcoord_4f[8] = |
127 | varying_4f vin::texcoord_4f[8] = |
124 | { |
128 | { |
125 | varying_4f ("TEXCOORD0"), varying_4f ("TEXCOORD1"), varying_4f ("TEXCOORD2"), varying_4f ("TEXCOORD3"), |
129 | varying_4f ("gl_TexCoord[0]"), varying_4f ("gl_TexCoord[1]"), varying_4f ("gl_TexCoord[2]"), varying_4f ("gl_TexCoord[3]"), |
126 | varying_4f ("TEXCOORD4"), varying_4f ("TEXCOORD5"), varying_4f ("TEXCOORD6"), varying_4f ("TEXCOORD7"), |
130 | varying_4f ("gl_TexCoord[4]"), varying_4f ("gl_TexCoord[5]"), varying_4f ("gl_TexCoord[6]"), varying_4f ("gl_TexCoord[7]"), |
127 | }; |
131 | }; |
128 | varying_1f vin::psize_1f ("PSIZE"); |
132 | varying_1f vin::psize_1f ("PSIZE"); |
129 | varying_1f vin::attr6_1f ("ATTR6"); |
|
|
130 | varying_1f vin::attr7_1f ("ATTR7"); |
|
|
131 | varying_2f vin::attr6_2f ("ATTR6"); |
|
|
132 | varying_2f vin::attr7_2f ("ATTR7"); |
|
|
133 | varying_3f vin::attr6_3f ("ATTR6"); |
|
|
134 | varying_3f vin::attr7_3f ("ATTR7"); |
|
|
135 | varying_4f vin::attr6_4f ("ATTR6"); |
|
|
136 | varying_4f vin::attr7_4f ("ATTR7"); |
|
|
137 | |
133 | |
138 | bool vin::is (const var &r) |
134 | bool vin::is (const var &r) |
139 | { |
135 | { |
140 | return r == vin::position_3f |
136 | return r == vin::position_3f |
141 | || r == vin::position_4f |
137 | || r == vin::position_4f |
142 | || r == vin::normal_3f |
138 | || r == vin::normal_3f |
143 | || r == vin::normal_4f |
|
|
144 | || r == vin::color0_3f |
139 | || r == vin::color_3f |
145 | || r == vin::color0_4f |
140 | || r == vin::color_4f |
146 | || r == vin::color1_3f |
141 | || r == vin::color2_3f |
147 | || r == vin::color1_4f |
142 | || r == vin::color2_4f |
148 | || r == vin::texcoord_1f[0] || r == vin::texcoord_1f[1] || r == vin::texcoord_1f[2] || r == vin::texcoord_1f[3] |
143 | || r == vin::texcoord_1f[0] || r == vin::texcoord_1f[1] || r == vin::texcoord_1f[2] || r == vin::texcoord_1f[3] |
149 | || r == vin::texcoord_1f[4] || r == vin::texcoord_1f[5] || r == vin::texcoord_1f[6] || r == vin::texcoord_1f[7] |
144 | || r == vin::texcoord_1f[4] || r == vin::texcoord_1f[5] || r == vin::texcoord_1f[6] || r == vin::texcoord_1f[7] |
150 | || r == vin::texcoord_2f[0] || r == vin::texcoord_2f[1] || r == vin::texcoord_2f[2] || r == vin::texcoord_2f[3] |
145 | || r == vin::texcoord_2f[0] || r == vin::texcoord_2f[1] || r == vin::texcoord_2f[2] || r == vin::texcoord_2f[3] |
151 | || r == vin::texcoord_2f[4] || r == vin::texcoord_2f[5] || r == vin::texcoord_2f[6] || r == vin::texcoord_2f[7] |
146 | || r == vin::texcoord_2f[4] || r == vin::texcoord_2f[5] || r == vin::texcoord_2f[6] || r == vin::texcoord_2f[7] |
152 | || r == vin::texcoord_3f[0] || r == vin::texcoord_3f[1] || r == vin::texcoord_3f[2] || r == vin::texcoord_3f[3] |
147 | || r == vin::texcoord_3f[0] || r == vin::texcoord_3f[1] || r == vin::texcoord_3f[2] || r == vin::texcoord_3f[3] |
153 | || r == vin::texcoord_3f[4] || r == vin::texcoord_3f[5] || r == vin::texcoord_3f[6] || r == vin::texcoord_3f[7] |
148 | || r == vin::texcoord_3f[4] || r == vin::texcoord_3f[5] || r == vin::texcoord_3f[6] || r == vin::texcoord_3f[7] |
154 | || r == vin::texcoord_4f[0] || r == vin::texcoord_4f[1] || r == vin::texcoord_4f[2] || r == vin::texcoord_4f[3] |
149 | || r == vin::texcoord_4f[0] || r == vin::texcoord_4f[1] || r == vin::texcoord_4f[2] || r == vin::texcoord_4f[3] |
155 | || r == vin::texcoord_4f[4] || r == vin::texcoord_4f[5] || r == vin::texcoord_4f[6] || r == vin::texcoord_4f[7] |
150 | || r == vin::texcoord_4f[4] || r == vin::texcoord_4f[5] || r == vin::texcoord_4f[6] || r == vin::texcoord_4f[7]; |
156 | || r == vin::psize_1f |
|
|
157 | || r == vin::attr6_1f |
|
|
158 | || r == vin::attr7_1f |
|
|
159 | || r == vin::attr6_2f |
|
|
160 | || r == vin::attr7_2f |
|
|
161 | || r == vin::attr6_3f |
|
|
162 | || r == vin::attr7_3f |
|
|
163 | || r == vin::attr6_4f |
|
|
164 | || r == vin::attr7_4f; |
|
|
165 | } |
151 | } |
166 | |
152 | |
167 | struct fin fin; |
153 | struct fin fin; |
168 | struct fin &vout = fin; |
154 | struct fin &vout = fin; |
169 | |
155 | |
170 | // MUST update is-function below |
156 | // MUST update is-function below |
171 | varying_4f fin::position_4f ("HPOS"); |
157 | varying_4f fin::position_4f ("gl_Position"); |
172 | varying_4f fin::color0_4f ("COLOR0"); |
158 | varying_4f fin::color_4f ("gl_Color"); |
173 | varying_4f fin::color1_4f ("COLOR1"); |
159 | varying_4f fin::color2_4f ("gl_SecondaryColor"); |
174 | varying_4f fin::texcoord_4f[8] = |
160 | varying_4f fin::texcoord_4f[8] = |
175 | { |
161 | { |
176 | varying_4f ("TEXCOORD0"), varying_4f ("TEXCOORD1"), varying_4f ("TEXCOORD2"), varying_4f ("TEXCOORD3"), |
162 | varying_4f ("gl_TexCoord[0]"), varying_4f ("gl_TexCoord[1]"), varying_4f ("gl_TexCoord[2]"), varying_4f ("gl_TexCoord[3]"), |
177 | varying_4f ("TEXCOORD4"), varying_4f ("TEXCOORD5"), varying_4f ("TEXCOORD6"), varying_4f ("TEXCOORD7"), |
163 | varying_4f ("gl_TexCoord[4]"), varying_4f ("gl_TexCoord[5]"), varying_4f ("gl_TexCoord[6]"), varying_4f ("gl_TexCoord[7]"), |
178 | }; |
164 | }; |
179 | |
165 | |
180 | bool fin::is (const var &r) |
166 | bool fin::is (const var &r) |
181 | { |
167 | { |
182 | return r == fin::position_4f |
168 | return r == fin::position_4f |
183 | || r == fin::color0_4f |
169 | || r == fin::color_4f |
184 | || r == fin::color1_4f |
170 | || r == fin::color2_4f |
185 | || r == fin::texcoord_4f[0] |
171 | || r == fin::texcoord_4f[0] |
186 | || r == fin::texcoord_4f[1] |
172 | || r == fin::texcoord_4f[1] |
187 | || r == fin::texcoord_4f[2] |
173 | || r == fin::texcoord_4f[2] |
188 | || r == fin::texcoord_4f[3] |
174 | || r == fin::texcoord_4f[3] |
189 | || r == fin::texcoord_4f[4] |
175 | || r == fin::texcoord_4f[4] |
… | |
… | |
193 | } |
179 | } |
194 | |
180 | |
195 | struct fout fout; |
181 | struct fout fout; |
196 | |
182 | |
197 | // MUST update is-function below |
183 | // MUST update is-function below |
198 | varying_4f fout::color0_4f ("COLOR0"); |
184 | varying_4f fout::color_4f ("gl_FragColor"); |
199 | varying_3f fout::color0_3f ("COLOR0"); |
|
|
200 | varying_4f fout::color1_4f ("COLOR1"); |
|
|
201 | varying_3f fout::color1_3f ("COLOR1"); |
|
|
202 | varying_1f fout::depth_1f ("DEPTH"); |
185 | varying_1f fout::depth_1f ("gl_FragDepth"); |
203 | |
186 | |
204 | bool fout::is (const var &r) |
187 | bool fout::is (const var &r) |
205 | { |
188 | { |
206 | return r == fout::color0_4f |
189 | return r == fout::color_4f |
207 | || r == fout::color0_3f |
|
|
208 | || r == fout::color1_4f |
|
|
209 | || r == fout::color1_3f |
|
|
210 | || r == fout::depth_1f; |
190 | || r == fout::depth_1f; |
211 | } |
191 | } |
212 | |
192 | |
213 | uniform_matrix_f mvp, mv, proj; |
193 | uniform_matrix_4f mvp, mv, proj; |
214 | |
194 | |
215 | void fragment_vector_i::build (shader_builder &b) |
195 | void fragment_vector_i::build (shader_builder &b) |
216 | { |
196 | { |
217 | for (vector<fragment>::iterator i = begin (); i != end (); i++) |
197 | for (vector<fragment>::iterator i = begin (); i != end (); i++) |
218 | (*i)->build (b); |
198 | (*i)->build (b); |
… | |
… | |
222 | { |
202 | { |
223 | shader_builder b; |
203 | shader_builder b; |
224 | build (b); |
204 | build (b); |
225 | ostringstream os; |
205 | ostringstream os; |
226 | |
206 | |
227 | 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 |
228 | 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++) |
229 | { |
216 | { |
|
|
217 | if (vout.is (*i) || fout.is (*i)) |
230 | os << " "; |
218 | os << "varying "; |
231 | |
219 | else if (vin.is (*i)) |
232 | if (is_vertex) |
220 | os << "attribute "; |
233 | { |
|
|
234 | if (vin.is (*i)) os << "in "; |
|
|
235 | if (vout.is (*i)) os << "out "; |
|
|
236 | } |
|
|
237 | else |
|
|
238 | { |
|
|
239 | if (fin.is (*i)) os << "in "; |
|
|
240 | if (fout.is (*i)) os << "out "; |
|
|
241 | } |
|
|
242 | |
221 | |
243 | (*i)->build_decl (os); |
222 | (*i)->build_decl (os); |
244 | os << ",\n"; |
223 | os << ";\n"; |
245 | } |
224 | } |
|
|
225 | #endif |
246 | |
226 | |
247 | for (vector<uniform>::iterator i = b.refs.begin (); i != b.refs.end (); i++) |
227 | os << "\nvoid main ()\n{\n"; |
248 | { |
|
|
249 | os << " "; |
|
|
250 | (*i)->build_decl (os); |
|
|
251 | os << ",\n"; |
|
|
252 | } |
|
|
253 | |
|
|
254 | os << " uniform float unused_cg_broken_syntax\n"; |
|
|
255 | os << ")\n{\n"; |
|
|
256 | |
228 | |
257 | 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++) |
258 | { |
230 | { |
259 | (*i)->build_decl (os); |
231 | (*i)->build_decl (os); |
260 | os << ";\n"; |
232 | os << ";\n"; |
… | |
… | |
270 | |
242 | |
271 | void debdebdebdebug ()//D |
243 | void debdebdebdebug ()//D |
272 | { |
244 | { |
273 | vertex_program p; |
245 | vertex_program p; |
274 | temp_4f t1, t2; |
246 | temp_4f t1, t2; |
275 | sampler2d s2d (1); |
247 | sampler_2d s2d (1); |
276 | |
248 | |
277 | p << t2 << " = tex2D (" << s2d << ", " << vin.position_4f << ".xy);\n"; |
249 | p << t2 << " = tex2D (" << s2d << ", " << vin.position_4f << ".xy);\n"; |
278 | p << t1 << " = mul (" << vin.position_4f << "," << mvp << ");\n"; |
250 | p << t1 << " = mul (" << vin.position_4f << "," << mvp << ");\n"; |
279 | p << vout.position_4f << " = " << t1 << ";\n"; |
251 | p << vout.position_4f << " = " << t1 << ";\n"; |
280 | |
252 | |
281 | p.print (); |
253 | p.print (); |
282 | //exit (0); |
254 | exit (0); |
283 | } |
255 | } |
284 | |
256 | |
285 | } |
257 | } |
286 | |
258 | |
287 | material::~material () |
259 | material::~material () |