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

RevLine 
[3030]1#include "ShaderProgram.h"
2#include "Matrix4x4.h"
3
4
5using namespace std;
6
7namespace CHCDemoEngine
8{
9
10
[3033]11GPUProgramParameters::GPUProgramParameters(ShaderProgram *p)
12: mProgram(p)
13{
14}
15
[3036]16
17void GPUProgramParameters::Reset()
18{
19        mFloats.clear();
20        mTextures.clear();
21        mMatrices.clear();
22        mArrays.clear();
23}
24
25
[3033]26void GPUProgramParameters::SetValue1f(int idx, float value)
27{
[3036]28        if (mFloats.size() < idx + 1)
29                mFloats.resize(idx + 1);
30
31        mFloats[idx] = FloatParam(&value, 1);
[3033]32}
33
34
35void GPUProgramParameters::SetValue2f(int idx, float val1, float val2)
36{
[3036]37        if (mFloats.size() < idx + 1)
38                mFloats.resize(idx + 1);
39
40        float vals[] = {val1, val2};
41
42        mFloats[idx] = FloatParam(vals, 2);
[3033]43}
44
45
[3036]46void GPUProgramParameters::SetValue3f(int idx, float val1, float val2, float val3)
[3033]47{
[3036]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);
[3033]54}
55
56
57void GPUProgramParameters::SetArray1f(int idx, float *vals, int numElements)
58{
[3036]59        if (mArrays.size() < idx + 1)
60                mArrays.resize(idx + 1);
61
62        mArrays[idx] = ArrayParam(vals, 1, numElements);
[3033]63}
64
65
66void GPUProgramParameters::SetArray2f(int idx, float *vals, int numElements)
67{
[3036]68        if (mArrays.size() < idx + 1)
69                mArrays.resize(idx + 1);
70
71        mArrays[idx] = ArrayParam(vals, 2, numElements);
[3033]72}
73
74
75void GPUProgramParameters::SetArray3f(int idx, float *vals, int numElements)
76{
[3036]77        if (mArrays.size() < idx + 1)
78                mArrays.resize(idx + 1);
79
80        mArrays[idx] = ArrayParam(vals, 3, numElements);
[3033]81}
82
83
84void GPUProgramParameters::SetTexture(int idx, unsigned int tex)
85{
[3036]86        if (mTextures.size() < idx + 1)
87                mTextures.resize(idx + 1);
88
89        mTextures[idx] = IntParam(tex);
[3033]90}
91
92
93void GPUProgramParameters::SetMatrix(int idx, Matrix4x4 *mat)
94{
[3036]95        if (mMatrices.size() < idx + 1)
96                mMatrices.resize(idx + 1);
97
98        mMatrices[idx] = MatrixParam(mat);
[3033]99}
100
101
102void GPUProgramParameters::SetValue1f(const string &name, float val)
103{
[3034]104        SetValue1f(mProgram->GetParamIdxByName(name), val);
[3033]105}
106
107
[3034]108void GPUProgramParameters::SetValue2f(const string &name, float val1, float val2)
[3033]109{
[3034]110        SetValue2f(mProgram->GetParamIdxByName(name), val1, val2);
[3033]111}
112
113
114void GPUProgramParameters::SetValue3f(const string &name, float val1, float val2, float val3)
115{
[3034]116        SetValue3f(mProgram->GetParamIdxByName(name), val1, val2, val3);
[3033]117}
118
119
120void GPUProgramParameters::SetArray1f(const string &name, float *vals, int numElements)
121{
[3034]122        SetArray1f(mProgram->GetParamIdxByName(name), vals, numElements);
[3033]123}
124
125
[3034]126void GPUProgramParameters::SetArray2f(const string &name, float *vals, int numElements)
[3033]127{
[3034]128        SetArray2f(mProgram->GetParamIdxByName(name), vals, numElements);
[3033]129}
130
131
132void GPUProgramParameters::SetArray3f(const string &name, float *vals, int numElements)
133{
[3034]134        SetArray3f(mProgram->GetParamIdxByName(name), vals, numElements);
[3033]135}
136
137
138void GPUProgramParameters::SetMatrix(const string &name, Matrix4x4 *mat)
139{
[3034]140        SetMatrix(mProgram->GetParamIdxByName(name), mat);
[3033]141}
142
143
144void GPUProgramParameters::SetTexture(const string &name, unsigned int tex)
145{
[3034]146        SetTexture(mProgram->GetParamIdxByName(name), tex);
[3033]147}
148
149
[3034]150void GPUProgramParameters::UpdateParameters()
151{
[3036]152        for (int i = 0; i < (int)mFloats.size(); ++ i)
[3034]153        {
154                const FloatParam &p = mFloats[i];
155
[3036]156                if (!p.mValid) continue;
157
[3034]158                switch (p.mNumComponents)
159                {
160                case 1:
[3036]161                        mProgram->SetValue1f(i, p.mValues[0]);
[3034]162                        break;
163                case 2:
[3036]164                        mProgram->SetValue2f(i, p.mValues[0], p.mValues[1]);
[3034]165                        break;
166                case 3:
[3036]167                        mProgram->SetValue3f(i, p.mValues[0], p.mValues[1], p.mValues[2]);
[3034]168                        break;
169                default:
[3036]170                        mProgram->SetValue1f(i, p.mValues[0]);
[3034]171                }
172        }
173
[3036]174        for (int i = 0; i < (int)mTextures.size(); ++ i)
[3034]175        {
176                const IntParam &p = mTextures[i];
[3036]177
178                if (p.mValid)
179                        mProgram->SetTexture(i, p.mValue);
[3034]180        }
181
[3036]182        for (int i = 0; i < (int)mMatrices.size(); ++ i)
[3034]183        {
184                const MatrixParam &p = mMatrices[i];
[3036]185
186                if (p.mValid)
187                        mProgram->SetMatrix(i, *p.mValue);
[3034]188        }
[3036]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        }
[3034]211}
212
213
214
215/********************************************************/
216/*             ShaderProgram implementation             */
217/********************************************************/
218
219
[3030]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);
[3033]233
[3034]234        const int maxParams = 64;
235        mParameters.resize(maxParams);
[3033]236
[3034]237        for (int i = 0; i < maxParams; ++ i)
[3033]238        {
239                mParameters[i] = NULL;
240        }
[3030]241}
242
243
[3033]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
[3034]270        mParamHash[name] = idx;
[3033]271        mParameters[idx] = p;
[3034]272
[3033]273        return p;
274}
275
276
[3030]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        {
[3033]288                p = mParameters[(*it).second];
[3030]289        }
290
291        //cout << "name: " << name << " " << p << " " << mProgram << endl;
292        return p;
293}
294
295
[3033]296CGparameter ShaderProgram::GetParameter(int idx) const
[3030]297{
[3034]298        return mParameters[idx];
[3030]299}
300
301
[3033]302void ShaderProgram::SetValue1f(int idx, float val)
[3030]303{
[3033]304        cgGLSetParameter1f(GetParameter(idx), val);
[3030]305}
306
307
[3033]308void ShaderProgram::SetValue2f(int idx, float val1, float val2)
[3030]309{
[3033]310        cgGLSetParameter2f(GetParameter(idx), val1, val2);
[3030]311}
312
313
[3033]314void ShaderProgram::SetValue3f(int idx, float val1, float val2, float val3)
[3030]315{
[3033]316        cgGLSetParameter3f(GetParameter(idx), val1, val2, val3);
[3030]317}
318
319
[3033]320void ShaderProgram::SetArray1f(int idx, float *vals, int numElements)
[3030]321{
[3033]322        cgGLSetParameterArray1f(GetParameter(idx), 0, numElements, (const float *)vals);
[3030]323}
324
325
[3033]326void ShaderProgram::SetArray2f(int idx, float *vals, int numElements)
[3030]327{
[3033]328        cgGLSetParameterArray2f(GetParameter(idx), 0, numElements, (const float *)vals);
[3030]329}
330
331
[3033]332void ShaderProgram::SetArray3f(int idx, float *vals, int numElements)
[3030]333{
[3033]334        cgGLSetParameterArray3f(GetParameter(idx), 0, numElements, (const float *)vals);
[3030]335}
336
337
[3033]338void ShaderProgram::SetMatrix(int idx, const Matrix4x4 &mat)
[3030]339{
[3033]340        cgGLSetMatrixParameterfc(GetParameter(idx), (const float *)mat.x);
341}
[3030]342
[3033]343
344void ShaderProgram::SetTexture(int idx, unsigned int tex)
345{
346        CGparameter p = GetParameter(idx);
347
[3030]348        cgGLSetTextureParameter(p, tex);
[3031]349        cgGLEnableTextureParameter(p);
[3034]350}
[3031]351
[3034]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
[3030]402        mTextureParams.push_back(p);
403}
404
405
[3034]406int ShaderProgram::GetParamIdxByName(const std::string &name) const
[3030]407{
[3034]408        CGParameterMap::const_iterator it = mParamHash.find(name);
409        return (*it).second;
[3030]410}
411
412
413} // namespace
Note: See TracBrowser for help on using the repository browser.