source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/ShaderProgram.cpp @ 3036

Revision 3036, 8.9 KB checked in by mattausch, 16 years ago (diff)

shader system starting to work

Line 
1#include "ShaderProgram.h"
2#include "Matrix4x4.h"
3
4
5using namespace std;
6
7namespace CHCDemoEngine
8{
9
10
11GPUProgramParameters::GPUProgramParameters(ShaderProgram *p)
12: mProgram(p)
13{
14}
15
16
17void GPUProgramParameters::Reset()
18{
19        mFloats.clear();
20        mTextures.clear();
21        mMatrices.clear();
22        mArrays.clear();
23}
24
25
26void GPUProgramParameters::SetValue1f(int idx, float value)
27{
28        if (mFloats.size() < idx + 1)
29                mFloats.resize(idx + 1);
30
31        mFloats[idx] = FloatParam(&value, 1);
32}
33
34
35void GPUProgramParameters::SetValue2f(int idx, float val1, float val2)
36{
37        if (mFloats.size() < idx + 1)
38                mFloats.resize(idx + 1);
39
40        float vals[] = {val1, val2};
41
42        mFloats[idx] = FloatParam(vals, 2);
43}
44
45
46void GPUProgramParameters::SetValue3f(int idx, float val1, float val2, float val3)
47{
48        if (mFloats.size() < idx + 1)
49                mFloats.resize(idx + 1);
50
51        float vals[] = {val1, val2, val3};
52
53        mFloats[idx] = FloatParam(vals, 3);
54}
55
56
57void GPUProgramParameters::SetArray1f(int idx, float *vals, int numElements)
58{
59        if (mArrays.size() < idx + 1)
60                mArrays.resize(idx + 1);
61
62        mArrays[idx] = ArrayParam(vals, 1, numElements);
63}
64
65
66void GPUProgramParameters::SetArray2f(int idx, float *vals, int numElements)
67{
68        if (mArrays.size() < idx + 1)
69                mArrays.resize(idx + 1);
70
71        mArrays[idx] = ArrayParam(vals, 2, numElements);
72}
73
74
75void GPUProgramParameters::SetArray3f(int idx, float *vals, int numElements)
76{
77        if (mArrays.size() < idx + 1)
78                mArrays.resize(idx + 1);
79
80        mArrays[idx] = ArrayParam(vals, 3, numElements);
81}
82
83
84void GPUProgramParameters::SetTexture(int idx, unsigned int tex)
85{
86        if (mTextures.size() < idx + 1)
87                mTextures.resize(idx + 1);
88
89        mTextures[idx] = IntParam(tex);
90}
91
92
93void GPUProgramParameters::SetMatrix(int idx, Matrix4x4 *mat)
94{
95        if (mMatrices.size() < idx + 1)
96                mMatrices.resize(idx + 1);
97
98        mMatrices[idx] = MatrixParam(mat);
99}
100
101
102void GPUProgramParameters::SetValue1f(const string &name, float val)
103{
104        SetValue1f(mProgram->GetParamIdxByName(name), val);
105}
106
107
108void GPUProgramParameters::SetValue2f(const string &name, float val1, float val2)
109{
110        SetValue2f(mProgram->GetParamIdxByName(name), val1, val2);
111}
112
113
114void GPUProgramParameters::SetValue3f(const string &name, float val1, float val2, float val3)
115{
116        SetValue3f(mProgram->GetParamIdxByName(name), val1, val2, val3);
117}
118
119
120void GPUProgramParameters::SetArray1f(const string &name, float *vals, int numElements)
121{
122        SetArray1f(mProgram->GetParamIdxByName(name), vals, numElements);
123}
124
125
126void GPUProgramParameters::SetArray2f(const string &name, float *vals, int numElements)
127{
128        SetArray2f(mProgram->GetParamIdxByName(name), vals, numElements);
129}
130
131
132void GPUProgramParameters::SetArray3f(const string &name, float *vals, int numElements)
133{
134        SetArray3f(mProgram->GetParamIdxByName(name), vals, numElements);
135}
136
137
138void GPUProgramParameters::SetMatrix(const string &name, Matrix4x4 *mat)
139{
140        SetMatrix(mProgram->GetParamIdxByName(name), mat);
141}
142
143
144void GPUProgramParameters::SetTexture(const string &name, unsigned int tex)
145{
146        SetTexture(mProgram->GetParamIdxByName(name), tex);
147}
148
149
150void GPUProgramParameters::UpdateParameters()
151{
152        for (int i = 0; i < (int)mFloats.size(); ++ i)
153        {
154                const FloatParam &p = mFloats[i];
155
156                if (!p.mValid) continue;
157
158                switch (p.mNumComponents)
159                {
160                case 1:
161                        mProgram->SetValue1f(i, p.mValues[0]);
162                        break;
163                case 2:
164                        mProgram->SetValue2f(i, p.mValues[0], p.mValues[1]);
165                        break;
166                case 3:
167                        mProgram->SetValue3f(i, p.mValues[0], p.mValues[1], p.mValues[2]);
168                        break;
169                default:
170                        mProgram->SetValue1f(i, p.mValues[0]);
171                }
172        }
173
174        for (int i = 0; i < (int)mTextures.size(); ++ i)
175        {
176                const IntParam &p = mTextures[i];
177
178                if (p.mValid)
179                        mProgram->SetTexture(i, p.mValue);
180        }
181
182        for (int i = 0; i < (int)mMatrices.size(); ++ i)
183        {
184                const MatrixParam &p = mMatrices[i];
185
186                if (p.mValid)
187                        mProgram->SetMatrix(i, *p.mValue);
188        }
189       
190        for (int i = 0; i < (int)mArrays.size(); ++ i)
191        {
192                const ArrayParam &p = mArrays[i];
193
194                if (!p.mValid) continue;
195
196                switch (p.mNumComponents)
197                {
198                case 1:
199                        mProgram->SetArray1f(i, p.mValues, p.mNumEntries);
200                        break;
201                case 2:
202                        mProgram->SetArray2f(i, p.mValues, p.mNumEntries);
203                        break;
204                case 3:
205                        mProgram->SetArray3f(i, p.mValues, p.mNumEntries);
206                        break;
207                default:
208                        mProgram->SetArray1f(i, p.mValues, p.mNumEntries);
209                }
210        }
211}
212
213
214
215/********************************************************/
216/*             ShaderProgram implementation             */
217/********************************************************/
218
219
220ShaderProgram::ShaderProgram(CGcontext context,
221                                                         const std::string &filename,
222                                                         CGprofile profile,
223                                                         const std::string &functionName)
224{
225        mProgram = cgCreateProgramFromFile(context,
226                                               CG_SOURCE,
227                                                                           filename.c_str(),
228                                                                           profile,
229                                                                           functionName.c_str(),
230                                                                           NULL);
231
232        if (mProgram) cgGLLoadProgram(mProgram);
233
234        const int maxParams = 64;
235        mParameters.resize(maxParams);
236
237        for (int i = 0; i < maxParams; ++ i)
238        {
239                mParameters[i] = NULL;
240        }
241}
242
243
244void ShaderProgram::Bind()
245{
246        cgGLBindProgram(mProgram);
247
248        // enable all texture parameters
249        CGParameterArray::const_iterator it, it_end = mTextureParams.end();
250
251        for (it = mTextureParams.begin(); it != it_end; ++ it)
252                cgGLEnableTextureParameter(*it);
253}
254
255
256/*void ShaderProgram::Release()
257{
258        CGParameterArray::const_iterator it, it_end = mTextureParams.end();
259
260        // disable all texture parameters
261        for (it = mTextureParams.begin(); it != it_end; ++ it)
262                cgGLDisableTextureParameter(*it);
263}*/
264
265
266CGparameter ShaderProgram::AddParameter(const string &name, int idx)
267{
268        CGparameter p = GetOrCreateParameter(name);
269
270        mParamHash[name] = idx;
271        mParameters[idx] = p;
272
273        return p;
274}
275
276
277CGparameter ShaderProgram::GetOrCreateParameter(const string &name)
278{
279        CGparameter p;
280        CGParameterMap::const_iterator it = mParamHash.find(name);
281
282        if (it == mParamHash.end())
283        {
284                p = cgGetNamedParameter(mProgram, name.c_str());
285        }
286        else
287        {
288                p = mParameters[(*it).second];
289        }
290
291        //cout << "name: " << name << " " << p << " " << mProgram << endl;
292        return p;
293}
294
295
296CGparameter ShaderProgram::GetParameter(int idx) const
297{
298        return mParameters[idx];
299}
300
301
302void ShaderProgram::SetValue1f(int idx, float val)
303{
304        cgGLSetParameter1f(GetParameter(idx), val);
305}
306
307
308void ShaderProgram::SetValue2f(int idx, float val1, float val2)
309{
310        cgGLSetParameter2f(GetParameter(idx), val1, val2);
311}
312
313
314void ShaderProgram::SetValue3f(int idx, float val1, float val2, float val3)
315{
316        cgGLSetParameter3f(GetParameter(idx), val1, val2, val3);
317}
318
319
320void ShaderProgram::SetArray1f(int idx, float *vals, int numElements)
321{
322        cgGLSetParameterArray1f(GetParameter(idx), 0, numElements, (const float *)vals);
323}
324
325
326void ShaderProgram::SetArray2f(int idx, float *vals, int numElements)
327{
328        cgGLSetParameterArray2f(GetParameter(idx), 0, numElements, (const float *)vals);
329}
330
331
332void ShaderProgram::SetArray3f(int idx, float *vals, int numElements)
333{
334        cgGLSetParameterArray3f(GetParameter(idx), 0, numElements, (const float *)vals);
335}
336
337
338void ShaderProgram::SetMatrix(int idx, const Matrix4x4 &mat)
339{
340        cgGLSetMatrixParameterfc(GetParameter(idx), (const float *)mat.x);
341}
342
343
344void ShaderProgram::SetTexture(int idx, unsigned int tex)
345{
346        CGparameter p = GetParameter(idx);
347
348        cgGLSetTextureParameter(p, tex);
349        cgGLEnableTextureParameter(p);
350}
351
352
353void ShaderProgram::SetValue1f(const string &name, float val)
354{
355        cgGLSetParameter1f(GetOrCreateParameter(name), val);
356}
357
358
359void ShaderProgram::SetValue2f(const string &name, float val1, float val2)
360{
361        cgGLSetParameter2f(GetOrCreateParameter(name), val1, val2);
362}
363
364
365void ShaderProgram::SetValue3f(const string &name, float val1, float val2, float val3)
366{
367        cgGLSetParameter3f(GetOrCreateParameter(name), val1, val2, val3);
368}
369
370
371void ShaderProgram::SetArray1f(const string &name, float *vals, int numElements)
372{
373        cgGLSetParameterArray1f(GetOrCreateParameter(name), 0, numElements, (const float *)vals);
374}
375
376
377void ShaderProgram::SetArray2f(const string &name, float *vals, int numElements)
378{
379        cgGLSetParameterArray2f(GetOrCreateParameter(name), 0, numElements, (const float *)vals);
380}
381
382
383void ShaderProgram::SetArray3f(const string &name, float *vals, int numElements)
384{
385        cgGLSetParameterArray3f(GetOrCreateParameter(name), 0, numElements, (const float *)vals);
386}
387
388
389void ShaderProgram::SetMatrix(const string &name, const Matrix4x4 &mat)
390{
391        cgGLSetMatrixParameterfc(GetOrCreateParameter(name), (const float *)mat.x);
392}
393
394
395void ShaderProgram::SetTexture(const string &name, unsigned int tex)
396{
397        CGparameter p = GetOrCreateParameter(name);
398
399        cgGLSetTextureParameter(p, tex);
400        cgGLEnableTextureParameter(p);
401
402        mTextureParams.push_back(p);
403}
404
405
406int ShaderProgram::GetParamIdxByName(const std::string &name) const
407{
408        CGParameterMap::const_iterator it = mParamHash.find(name);
409        return (*it).second;
410}
411
412
413} // namespace
Note: See TracBrowser for help on using the repository browser.