source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/Material.cpp @ 3147

Revision 3147, 3.0 KB checked in by mattausch, 16 years ago (diff)

updated shader loading

RevLine 
[2747]1#include "common.h"
2#include "Material.h"
[2756]3#include "Texture.h"
4#include "glInterface.h"
[2769]5#include "RenderState.h"
[2747]6
[3045]7
[3034]8using namespace std;
[2756]9
[3034]10
[2776]11namespace CHCDemoEngine
[2751]12{
[2747]13
[2769]14RgbaColor RandomColor(float a, float b)
[2747]15{
[2769]16        return RgbaColor(a + Random(b), a + Random(b), a + Random(b), 1);
[2747]17}
18
19
[3047]20void Technique::Init()
[2756]21{
22        mTexture = NULL;
[2769]23        mAlphaTestEnabled = false;
[2844]24        mCullFaceEnabled = true;
[3034]25       
[3045]26        mVertexProgramParameters.Reset();
27        mFragmentProgramParameters.Reset();
28       
[3034]29        mVertexProgram = NULL;
30        mFragmentProgram = NULL;
[3047]31
[3050]32        // if this material can write colors
[3047]33        mColorWriteEnabled = true;
[3050]34        // if lighting is used
[3048]35        mLightingEnabled = true;
[3054]36        /// if depth write should be enabled
37        mDepthWriteEnabled = true;
[3065]38        /// the render queue bucket this technique is assigned to
[3054]39        mRenderQueueBucket = NULL;
[2756]40}
41
42
[3042]43Technique::Technique():
[3034]44mAmbientColor(RgbaColor(0.2f, 0.2f, 0.2f, 1.0f)),
45mDiffuseColor(RgbaColor(1.0f, 1.0f, 1.0f, 1.0f)),
46mSpecularColor(RgbaColor(.0f, .0f, .0f, 1.0f)),
47mEmmisiveColor(RgbaColor(.0f, .0f, .0f, 1.0f))
[2756]48{
[3047]49        Init();
[2756]50}
[2755]51
[2756]52
[3042]53Technique::Technique(const RgbaColor &color):
[2756]54mDiffuseColor(color),
[2755]55mAmbientColor(color),
[2795]56mSpecularColor(0, 0, 0, 1),
[2756]57mTexture(NULL)
[2755]58{
[3047]59        Init();
[2755]60}
61
[3045]62
[3114]63void Technique::Render(RenderState *state, SceneEntity *ent)
[2747]64{
[2960]65        glMaterialfv(GL_FRONT, GL_AMBIENT, (float *)&mAmbientColor.r);
66        glMaterialfv(GL_FRONT, GL_DIFFUSE, (float *)&mDiffuseColor.r);
67        glMaterialfv(GL_FRONT, GL_EMISSION, (float *)&mEmmisiveColor.r);
68        glMaterialfv(GL_FRONT, GL_SPECULAR, (float *)&mSpecularColor.r);
[3039]69
[3114]70        state->SetState(this, ent);
[2751]71}
[2756]72
73
[3042]74void Technique::SetFragmentProgram(ShaderProgram *p)
[3036]75{
[3147]76        if (p->GetProgramType() == ShaderProgram::VERTEX_PROGRAM)
77                cerr << "warning: assigning a vertex program as fragment program!" << endl;
78
[3065]79        mFragmentProgram = p;
[3045]80        mFragmentProgramParameters.Reset();
81        mFragmentProgramParameters.SetProgram(p);
[2756]82}
[3036]83       
84
[3042]85void Technique::SetVertexProgram(ShaderProgram *p)
[3036]86{
[3147]87        if (p->GetProgramType() == ShaderProgram::FRAGMENT_PROGRAM)
88                cerr << "warning: assigning a fragment program as vertex program!" << endl;
89
90        mVertexProgram = p;
[3045]91        mVertexProgramParameters.Reset();
92        mVertexProgramParameters.SetProgram(p);
[3036]93}
94
[3042]95
[3045]96
[3065]97/***************************************************/
98/*          class Material implementation          */
99/***************************************************/
[3045]100
[3065]101
[3114]102void Material::Render(RenderState *state, SceneEntity *parent)
[3042]103{
[3068]104        // set technique if available
105        int idx = min((int)mTechniques.size() - 1 , state->GetRenderTechnique());
[3114]106        mTechniques[idx]->Render(state, parent);
[3036]107}
[3042]108
109
110Technique *Material::GetDefaultTechnique() const
111{
112        return mTechniques[0];
113}
114
115
116Technique *Material::GetTechnique(int i) const
117{
118        return mTechniques[i];
119}
120
121
122Material::Material()
123{
124        Technique *tech = new Technique();
125        mTechniques.push_back(tech);
126}
127
128
129Material::~Material()
130{
131        CLEAR_CONTAINER(mTechniques);
132}
133
134
135int Material::GetNumTechniques() const
136{
137        return (int)mTechniques.size();
138}
139
140
[3045]141void Material::AddTechnique(Technique *tech)
142{
143        mTechniques.push_back(tech);
[3042]144}
[3045]145
146
147}
Note: See TracBrowser for help on using the repository browser.