|
|
1 | #include <cstdlib> |
|
|
2 | #include <cstring> |
|
|
3 | |
|
|
4 | #include <algorithm> |
|
|
5 | |
1 | #include "opengl.h" |
6 | #include "opengl.h" |
2 | #include "material.h" |
7 | #include "material.h" |
3 | |
8 | #include "util.h" |
4 | #include <cstdlib> |
|
|
5 | #include <cstring> |
|
|
6 | |
|
|
7 | #include <algorithm> |
|
|
8 | |
9 | |
9 | namespace shader { |
10 | namespace shader { |
10 | |
11 | |
11 | refcounted::~refcounted () |
12 | refcounted::~refcounted () |
12 | { |
13 | { |
… | |
… | |
32 | const char str_sampler_2d_rect_shadow [] = "sampler2DRectShadow"; |
33 | const char str_sampler_2d_rect_shadow [] = "sampler2DRectShadow"; |
33 | const char str_sampler_3d [] = "sampler3D"; |
34 | const char str_sampler_3d [] = "sampler3D"; |
34 | const char str_sampler_3d_rect [] = "sampler3DRect"; |
35 | const char str_sampler_3d_rect [] = "sampler3DRect"; |
35 | const char str_sampler_cube [] = "samplerCube"; |
36 | const char str_sampler_cube [] = "samplerCube"; |
36 | |
37 | |
37 | static CGcontext cg_context = cgCreateContext (); |
|
|
38 | |
|
|
39 | int var_i::next_name = 0; |
38 | unsigned int var_i::next_id = 0; |
40 | |
39 | |
41 | var_i::var_i (CGtype cgtype, const char *typestr) |
40 | var_i::var_i (CGtype cgtype, const char *typestr) |
42 | : typestr (typestr) |
41 | : typestr (typestr) |
43 | { |
42 | { |
44 | name = ++next_name; |
|
|
45 | param = cgCreateParameter (cg_context, cgtype); |
43 | //param = cgCreateParameter (cg_context, cgtype); |
46 | } |
44 | } |
47 | |
45 | |
48 | var_i::~var_i () |
46 | var_i::~var_i () |
49 | { |
47 | { |
50 | cgDestroyParameter (param); |
48 | //cgDestroyParameter (param); |
51 | } |
49 | } |
|
|
50 | |
|
|
51 | temporary_i::temporary_i (CGtype cgtype, const char *strtype) |
|
|
52 | : var_i (cgtype, strtype) |
|
|
53 | { |
|
|
54 | sprintf (name, "T%lx_%d", ((long)this >> 4) & 0xfff, ++next_id); |
|
|
55 | } |
|
|
56 | |
|
|
57 | uniform_i::uniform_i (CGtype cgtype, const char *strtype) |
|
|
58 | : var_i (cgtype, strtype), dirty (true) |
|
|
59 | { |
|
|
60 | sprintf (name, "U%lx_%d", ((long)this >> 4) & 0xfff, ++next_id); |
|
|
61 | } |
|
|
62 | |
|
|
63 | //////////////////////////////////////////////////////////////////////////// |
52 | |
64 | |
53 | void var_i::build_decl (ostringstream &b) |
65 | void var_i::build_decl (ostringstream &b) |
54 | { |
66 | { |
55 | b << typestr << ' ' << "V" << name; |
67 | b << typestr << ' ' << name; |
56 | } |
68 | } |
57 | |
69 | |
58 | void uniform_i::build_decl (ostringstream &b) |
70 | void uniform_i::build_decl (ostringstream &b) |
59 | { |
71 | { |
60 | b << "uniform " << typestr << ' ' << "V" << name; |
72 | b << "uniform " << typestr << ' ' << name; |
61 | } |
73 | } |
62 | |
74 | |
63 | void stream_i::build_decl (ostringstream &b) |
75 | void stream_i::build_decl (ostringstream &b) |
64 | { |
76 | { |
65 | b << typestr << ' ' << binding; |
77 | b << typestr << ' ' << name; |
|
|
78 | } |
|
|
79 | |
|
|
80 | //////////////////////////////////////////////////////////////////////////// |
|
|
81 | |
|
|
82 | void glvar_i::build (shader_builder &b) |
|
|
83 | { |
|
|
84 | b << name; |
66 | } |
85 | } |
67 | |
86 | |
68 | void var_i::build (shader_builder &b) |
87 | void var_i::build (shader_builder &b) |
69 | { |
88 | { |
70 | b << "V" << name; |
89 | b << name; |
71 | } |
90 | } |
72 | |
91 | |
73 | void uniform_i::build (shader_builder &b) |
92 | void uniform_i::build (shader_builder &b) |
74 | { |
93 | { |
75 | var_i::build (b); |
94 | var_i::build (b); |
… | |
… | |
78 | b.refs.push_back (*this); |
97 | b.refs.push_back (*this); |
79 | } |
98 | } |
80 | |
99 | |
81 | void stream_i::build (shader_builder &b) |
100 | void stream_i::build (shader_builder &b) |
82 | { |
101 | { |
83 | b << binding; |
102 | var_i::build (b); |
84 | |
103 | |
85 | if (find (b.streams.begin (), b.streams.end (), var (*this)) == b.streams.end ()) |
104 | if (find (b.streams.begin (), b.streams.end (), var (*this)) == b.streams.end ()) |
86 | b.streams.push_back (*this); |
105 | b.streams.push_back (*this); |
87 | } |
106 | } |
88 | |
107 | |
… | |
… | |
92 | |
111 | |
93 | if (find (b.temps.begin (), b.temps.end (), var (*this)) == b.temps.end ()) |
112 | if (find (b.temps.begin (), b.temps.end (), var (*this)) == b.temps.end ()) |
94 | b.temps.push_back (*this); |
113 | b.temps.push_back (*this); |
95 | } |
114 | } |
96 | |
115 | |
|
|
116 | void fragment_vector_i::build (shader_builder &b) |
|
|
117 | { |
|
|
118 | for (vector<fragment>::iterator i = begin (); i != end (); i++) |
|
|
119 | (*i)->build (b); |
|
|
120 | } |
|
|
121 | |
97 | void fragment_const_string_i::build (shader_builder &b) |
122 | void fragment_const_string_i::build (shader_builder &b) |
98 | { |
123 | { |
99 | b << str; |
124 | b << str; |
100 | } |
125 | } |
101 | |
126 | |
|
|
127 | void statement_i::build (shader_builder &b) |
|
|
128 | { |
|
|
129 | b << " "; |
|
|
130 | fragment_vector_i::build (b); |
|
|
131 | b << ";\n"; |
|
|
132 | } |
|
|
133 | |
|
|
134 | //////////////////////////////////////////////////////////////////////////// |
|
|
135 | |
102 | struct vin vin; |
136 | struct vin vin; |
103 | |
137 | |
104 | // MUST update is-function below |
|
|
105 | varying_3f vin::position_3f ("gl_Vertex"); |
138 | varying_3f vin::position_3f ("gl_Vertex"); |
106 | varying_4f vin::position_4f ("gl_Vertex"); |
139 | varying_4f vin::position_4f ("gl_Vertex"); |
107 | varying_3f vin::normal_3f ("gl_Normal"); |
140 | varying_3f vin::normal_3f ("gl_Normal"); |
108 | varying_3f vin::color_3f ("gl_Color"); |
141 | varying_3f vin::color_3f ("gl_Color"); |
109 | varying_4f vin::color_4f ("gl_Color"); |
142 | varying_4f vin::color_4f ("gl_Color"); |
110 | varying_3f vin::color2_3f ("gl_SecondaryColor"); |
143 | varying_3f vin::color2_3f ("gl_SecondaryColor"); |
111 | varying_4f vin::color2_4f ("gl_SecondaryColor"); |
144 | varying_4f vin::color2_4f ("gl_SecondaryColor"); |
112 | varying_1f vin::texcoord_1f[8] = |
145 | varying_1f vin::texcoord_1f[8] = |
113 | { |
146 | { |
114 | varying_1f ("gl_TexCoord[0]"), varying_1f ("gl_TexCoord[1]"), varying_1f ("gl_TexCoord[2]"), varying_1f ("gl_TexCoord[3]"), |
147 | varying_1f ("gl_TexCoord[0]"), varying_1f ("gl_TexCoord[1]"), varying_1f ("gl_TexCoord[2]"), varying_1f ("gl_TexCoord[3]"), |
115 | varying_1f ("gl_TexCoord[4]"), varying_1f ("gl_TexCoord[5]"), varying_1f ("gl_TexCoord[6]"), varying_1f ("gl_TexCoord[7]"), |
148 | varying_1f ("gl_TexCoord[4]"), varying_1f ("gl_TexCoord[5]"), varying_1f ("gl_TexCoord[6]"), varying_1f ("gl_TexCoord[7]"), |
116 | }; |
149 | }; |
117 | varying_2f vin::texcoord_2f[8] = |
150 | varying_2f vin::texcoord_2f[8] = |
118 | { |
151 | { |
119 | varying_2f ("gl_TexCoord[0]"), varying_2f ("gl_TexCoord[1]"), varying_2f ("gl_TexCoord[2]"), varying_2f ("gl_TexCoord[3]"), |
152 | varying_2f ("gl_TexCoord[0]"), varying_2f ("gl_TexCoord[1]"), varying_2f ("gl_TexCoord[2]"), varying_2f ("gl_TexCoord[3]"), |
120 | varying_2f ("gl_TexCoord[4]"), varying_2f ("gl_TexCoord[5]"), varying_2f ("gl_TexCoord[6]"), varying_2f ("gl_TexCoord[7]"), |
153 | varying_2f ("gl_TexCoord[4]"), varying_2f ("gl_TexCoord[5]"), varying_2f ("gl_TexCoord[6]"), varying_2f ("gl_TexCoord[7]"), |
121 | }; |
154 | }; |
122 | varying_3f vin::texcoord_3f[8] = |
155 | varying_3f vin::texcoord_3f[8] = |
123 | { |
156 | { |
124 | varying_3f ("gl_TexCoord[0]"), varying_3f ("gl_TexCoord[1]"), varying_3f ("gl_TexCoord[2]"), varying_3f ("gl_TexCoord[3]"), |
157 | varying_3f ("gl_TexCoord[0]"), varying_3f ("gl_TexCoord[1]"), varying_3f ("gl_TexCoord[2]"), varying_3f ("gl_TexCoord[3]"), |
125 | varying_3f ("gl_TexCoord[4]"), varying_3f ("gl_TexCoord[5]"), varying_3f ("gl_TexCoord[6]"), varying_3f ("gl_TexCoord[7]"), |
158 | varying_3f ("gl_TexCoord[4]"), varying_3f ("gl_TexCoord[5]"), varying_3f ("gl_TexCoord[6]"), varying_3f ("gl_TexCoord[7]"), |
126 | }; |
159 | }; |
127 | varying_4f vin::texcoord_4f[8] = |
160 | varying_4f vin::texcoord_4f[8] = |
128 | { |
161 | { |
129 | varying_4f ("gl_TexCoord[0]"), varying_4f ("gl_TexCoord[1]"), varying_4f ("gl_TexCoord[2]"), varying_4f ("gl_TexCoord[3]"), |
162 | 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]"), |
163 | varying_4f ("gl_TexCoord[4]"), varying_4f ("gl_TexCoord[5]"), varying_4f ("gl_TexCoord[6]"), varying_4f ("gl_TexCoord[7]"), |
131 | }; |
164 | }; |
132 | varying_1f vin::psize_1f ("PSIZE"); |
165 | varying_1f vin::psize_1f ("PSIZE"); |
133 | |
166 | |
134 | bool vin::is (const var &r) |
167 | glvar vout::position ("gl_Position"); |
|
|
168 | glvar vout::point_size ("gl_PointSize"); |
|
|
169 | glvar vout::clip_vertex ("gl_ClipVertex"); |
|
|
170 | glvar vout::front_color ("gl_FontColor"); |
|
|
171 | glvar vout::back_color ("gl_BackColor"); |
|
|
172 | glvar vout::front_secondary_color ("gl_FrontSecondaryColor"); |
|
|
173 | glvar vout::back_secondary_color ("gl_BackSecondaryColor"); |
|
|
174 | glvar vout::texcoord[8] = |
135 | { |
175 | { |
136 | return r == vin::position_3f |
176 | glvar ("gl_TexCoord[0]"), glvar ("gl_TexCoord[1]"), glvar ("gl_TexCoord[2]"), glvar ("gl_TexCoord[3]"), |
137 | || r == vin::position_4f |
177 | glvar ("gl_TexCoord[4]"), glvar ("gl_TexCoord[5]"), glvar ("gl_TexCoord[6]"), glvar ("gl_TexCoord[7]"), |
138 | || r == vin::normal_3f |
178 | }; |
139 | || r == vin::color_3f |
179 | glvar vout::fog_frag_coord ("gl_FogFragCoord"); |
140 | || r == vin::color_4f |
|
|
141 | || r == vin::color2_3f |
|
|
142 | || r == vin::color2_4f |
|
|
143 | || r == vin::texcoord_1f[0] || r == vin::texcoord_1f[1] || r == vin::texcoord_1f[2] || r == vin::texcoord_1f[3] |
|
|
144 | || r == vin::texcoord_1f[4] || r == vin::texcoord_1f[5] || r == vin::texcoord_1f[6] || r == vin::texcoord_1f[7] |
|
|
145 | || r == vin::texcoord_2f[0] || r == vin::texcoord_2f[1] || r == vin::texcoord_2f[2] || r == vin::texcoord_2f[3] |
|
|
146 | || r == vin::texcoord_2f[4] || r == vin::texcoord_2f[5] || r == vin::texcoord_2f[6] || r == vin::texcoord_2f[7] |
|
|
147 | || r == vin::texcoord_3f[0] || r == vin::texcoord_3f[1] || r == vin::texcoord_3f[2] || r == vin::texcoord_3f[3] |
|
|
148 | || r == vin::texcoord_3f[4] || r == vin::texcoord_3f[5] || r == vin::texcoord_3f[6] || r == vin::texcoord_3f[7] |
|
|
149 | || r == vin::texcoord_4f[0] || r == vin::texcoord_4f[1] || r == vin::texcoord_4f[2] || r == vin::texcoord_4f[3] |
|
|
150 | || r == vin::texcoord_4f[4] || r == vin::texcoord_4f[5] || r == vin::texcoord_4f[6] || r == vin::texcoord_4f[7]; |
|
|
151 | } |
|
|
152 | |
180 | |
153 | struct fin fin; |
181 | glvar fin::frag_coord ("gl_FragCoord"); |
154 | struct fin &vout = fin; |
182 | glvar fin::color ("gl_Color"); |
|
|
183 | glvar fin::secondary_color ("gl_SecondaryColor"); |
|
|
184 | glvar fin::texcoord[8] = |
|
|
185 | { |
|
|
186 | glvar ("gl_TexCoord[0]"), glvar ("gl_TexCoord[1]"), glvar ("gl_TexCoord[2]"), glvar ("gl_TexCoord[3]"), |
|
|
187 | glvar ("gl_TexCoord[4]"), glvar ("gl_TexCoord[5]"), glvar ("gl_TexCoord[6]"), glvar ("gl_TexCoord[7]"), |
|
|
188 | }; |
|
|
189 | glvar fin::fog_frag_coord ("gl_FogFragCoord"); |
155 | |
190 | |
156 | // MUST update is-function below |
191 | glvar fout::frag_color ("gl_FragColor"); |
|
|
192 | glvar fout::frag_depth ("gl_FragDepth"); |
|
|
193 | glvar fout::frag_data[2] = { glvar ("gl_FragData[0]"), glvar ("gl_FragData[1]") }; |
|
|
194 | |
|
|
195 | #if 0 |
157 | varying_4f fin::position_4f ("gl_Position"); |
196 | varying_4f fin::position_4f ("gl_Position"); |
158 | varying_4f fin::color_4f ("gl_Color"); |
197 | varying_4f fin::color_4f ("gl_Color"); |
159 | varying_4f fin::color2_4f ("gl_SecondaryColor"); |
198 | varying_4f fin::color2_4f ("gl_SecondaryColor"); |
160 | varying_4f fin::texcoord_4f[8] = |
199 | varying_4f fin::texcoord_4f[8] = |
161 | { |
200 | { |
162 | varying_4f ("gl_TexCoord[0]"), varying_4f ("gl_TexCoord[1]"), varying_4f ("gl_TexCoord[2]"), varying_4f ("gl_TexCoord[3]"), |
201 | varying_4f ("gl_TexCoord[0]"), varying_4f ("gl_TexCoord[1]"), varying_4f ("gl_TexCoord[2]"), varying_4f ("gl_TexCoord[3]"), |
163 | varying_4f ("gl_TexCoord[4]"), varying_4f ("gl_TexCoord[5]"), varying_4f ("gl_TexCoord[6]"), varying_4f ("gl_TexCoord[7]"), |
202 | varying_4f ("gl_TexCoord[4]"), varying_4f ("gl_TexCoord[5]"), varying_4f ("gl_TexCoord[6]"), varying_4f ("gl_TexCoord[7]"), |
164 | }; |
203 | }; |
165 | |
204 | #endif |
166 | bool fin::is (const var &r) |
|
|
167 | { |
|
|
168 | return r == fin::position_4f |
|
|
169 | || r == fin::color_4f |
|
|
170 | || r == fin::color2_4f |
|
|
171 | || r == fin::texcoord_4f[0] |
|
|
172 | || r == fin::texcoord_4f[1] |
|
|
173 | || r == fin::texcoord_4f[2] |
|
|
174 | || r == fin::texcoord_4f[3] |
|
|
175 | || r == fin::texcoord_4f[4] |
|
|
176 | || r == fin::texcoord_4f[5] |
|
|
177 | || r == fin::texcoord_4f[6] |
|
|
178 | || r == fin::texcoord_4f[7]; |
|
|
179 | } |
|
|
180 | |
205 | |
181 | struct fout fout; |
206 | struct fout fout; |
182 | |
207 | |
183 | // MUST update is-function below |
208 | #if 0 |
184 | varying_4f fout::color_4f ("gl_FragColor"); |
209 | varying_4f fout::color_4f ("gl_FragColor"); |
185 | varying_1f fout::depth_1f ("gl_FragDepth"); |
210 | varying_1f fout::depth_1f ("gl_FragDepth"); |
|
|
211 | #endif |
186 | |
212 | |
187 | bool fout::is (const var &r) |
213 | //////////////////////////////////////////////////////////////////////////// |
188 | { |
|
|
189 | return r == fout::color_4f |
|
|
190 | || r == fout::depth_1f; |
|
|
191 | } |
|
|
192 | |
214 | |
193 | uniform_matrix_4f mvp, mv, proj; |
215 | shader_object_i::shader_object_i (GLenum type) |
194 | |
216 | : type (type) |
195 | void fragment_vector_i::build (shader_builder &b) |
|
|
196 | { |
217 | { |
197 | for (vector<fragment>::iterator i = begin (); i != end (); i++) |
218 | id = glCreateShaderObjectARB (type); |
198 | (*i)->build (b); |
|
|
199 | } |
219 | } |
200 | |
220 | |
201 | void shader_program::print () |
221 | shader_object_i::~shader_object_i () |
|
|
222 | { |
|
|
223 | glDeleteObjectARB (id); |
|
|
224 | } |
|
|
225 | |
|
|
226 | string shader_object_i::source () |
202 | { |
227 | { |
203 | shader_builder b; |
228 | shader_builder b; |
204 | build (b); |
229 | build (b); |
205 | ostringstream os; |
230 | ostringstream os; |
206 | |
231 | |
… | |
… | |
222 | (*i)->build_decl (os); |
247 | (*i)->build_decl (os); |
223 | os << ";\n"; |
248 | os << ";\n"; |
224 | } |
249 | } |
225 | #endif |
250 | #endif |
226 | |
251 | |
227 | os << "\nvoid main ()\n{\n"; |
252 | os << "\nvoid main (void)\n{\n"; |
228 | |
253 | |
229 | for (vector<var>::iterator i = b.temps.begin (); i != b.temps.end (); i++) |
254 | for (vector<var>::iterator i = b.temps.begin (); i != b.temps.end (); i++) |
230 | { |
255 | { |
|
|
256 | os << " "; |
231 | (*i)->build_decl (os); |
257 | (*i)->build_decl (os); |
232 | os << ";\n"; |
258 | os << ";\n"; |
233 | } |
259 | } |
234 | |
260 | |
235 | os << "\n"; |
261 | os << "\n"; |
236 | os << b.source.str (); |
262 | os << b.source.str (); |
237 | os << "\n}\n"; |
263 | os << "}\n"; |
238 | |
264 | |
|
|
265 | return os.str (); |
|
|
266 | } |
|
|
267 | |
|
|
268 | void shader_object_i::compile () |
|
|
269 | { |
|
|
270 | string src = source (); |
|
|
271 | const char *sptr = src.data (); |
|
|
272 | const int slen = src.size (); |
|
|
273 | |
239 | printf ("%s\n", os.str ().c_str ()); |
274 | printf ("SOURCE<%s>\n", src.c_str ()); |
240 | |
275 | |
|
|
276 | glShaderSourceARB (id, 1, &sptr, &slen); |
|
|
277 | glCompileShaderARB (id); |
|
|
278 | |
|
|
279 | GLint compiled; |
|
|
280 | glGetObjectParameterivARB (id, GL_OBJECT_COMPILE_STATUS_ARB, &compiled); |
|
|
281 | |
|
|
282 | if (!compiled) |
|
|
283 | { |
|
|
284 | char infolog[8192]; |
|
|
285 | glGetInfoLogARB (id, 8192, NULL, infolog); |
|
|
286 | printf ("INFOLOG<%s>\n", infolog); |
|
|
287 | abort (); |
|
|
288 | } |
241 | } |
289 | } |
242 | |
290 | |
243 | void debdebdebdebug ()//D |
291 | void debdebdebdebug ()//D |
244 | { |
292 | { |
245 | vertex_program p; |
293 | fragment_shader p; |
246 | temp_4f t1, t2; |
294 | temp_4f t1, t2; |
247 | sampler_2d s2d (1); |
295 | sampler_2d s2d (1); |
248 | |
296 | |
249 | p << t2 << " = tex2D (" << s2d << ", " << vin.position_4f << ".xy);\n"; |
297 | //p << t2 << " = texture2D (" << s2d << ", " << vin.position_4f << ".xy)"; |
250 | p << t1 << " = mul (" << vin.position_4f << "," << mvp << ");\n"; |
298 | //p << t1 << " = mul (" << vin.position_4f << "," << mvp << ")"; |
251 | p << vout.position_4f << " = " << t1 << ";\n"; |
299 | p << fout.frag_color << " = vec4(1,1,1,0)"; |
252 | |
300 | |
253 | p.print (); |
301 | p->compile (); |
254 | exit (0); |
|
|
255 | } |
302 | } |
256 | |
303 | |
257 | } |
304 | } |
258 | |
305 | |
259 | material::~material () |
306 | material::~material () |