… | |
… | |
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 | |
272 | void debdebdebdebug ()//D |
243 | void debdebdebdebug ()//D |
273 | { |
244 | { |
274 | vertex_program p; |
245 | vertex_program p; |
275 | temp_4f t1; |
246 | temp_4f t1, t2; |
|
|
247 | sampler_2d s2d (1); |
276 | |
248 | |
|
|
249 | p << t2 << " = tex2D (" << s2d << ", " << vin.position_4f << ".xy);\n"; |
277 | p << t1 << " = mul(" << vin.position_4f << "," << mvp << ");\n"; |
250 | p << t1 << " = mul (" << vin.position_4f << "," << mvp << ");\n"; |
278 | p << vout.position_4f << " = " << t1 << ";\n"; |
251 | p << vout.position_4f << " = " << t1 << ";\n"; |
279 | |
252 | |
280 | p.print (); |
253 | p.print (); |
281 | exit (0); |
254 | exit (0); |
282 | } |
255 | } |