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

Revision 3050, 3.2 KB checked in by mattausch, 16 years ago (diff)
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;
[3050]36
37        mDepthWriteEnabled = true;
[2756]38}
39
40
[3042]41Technique::Technique():
[3034]42mAmbientColor(RgbaColor(0.2f, 0.2f, 0.2f, 1.0f)),
43mDiffuseColor(RgbaColor(1.0f, 1.0f, 1.0f, 1.0f)),
44mSpecularColor(RgbaColor(.0f, .0f, .0f, 1.0f)),
45mEmmisiveColor(RgbaColor(.0f, .0f, .0f, 1.0f))
[2756]46{
[3047]47        Init();
[2756]48}
[2755]49
[2756]50
[3042]51Technique::Technique(const RgbaColor &color):
[2756]52mDiffuseColor(color),
[2755]53mAmbientColor(color),
[2795]54mSpecularColor(0, 0, 0, 1),
[2756]55mTexture(NULL)
[2755]56{
[3047]57        Init();
[2755]58}
59
60
[3050]61Technique::Technique(const Technique &tech)
62{
63        mAmbientColor = tech.mAmbientColor;
64        mDiffuseColor = tech.mDiffuseColor;
65        mSpecularColor = tech.mSpecularColor;
66        mEmmisiveColor = tech.mEmmisiveColor;
[3045]67
[3050]68        mVertexProgram = tech.mVertexProgram;
69        mFragmentProgram = tech.mFragmentProgram;
70
71        mAlphaTestEnabled = tech.mAlphaTestEnabled;
72        mCullFaceEnabled =tech.mCullFaceEnabled;
73
74        mTexture = tech.mTexture;
75
76        mVertexProgramParameters = tech.mVertexProgramParameters;
77        mFragmentProgramParameters = tech.mFragmentProgramParameters;
78
79        mColorWriteEnabled = tech.mColorWriteEnabled;
80        mLightingEnabled = tech.mLightingEnabled;
81        mDepthWriteEnabled = tech.mDepthWriteEnabled;
82}
83
84
[3045]85Technique::~Technique()
86{
87}
88
89
[3042]90void Technique::Render(RenderState *state)
[2747]91{
[2960]92        glMaterialfv(GL_FRONT, GL_AMBIENT, (float *)&mAmbientColor.r);
93        glMaterialfv(GL_FRONT, GL_DIFFUSE, (float *)&mDiffuseColor.r);
94        glMaterialfv(GL_FRONT, GL_EMISSION, (float *)&mEmmisiveColor.r);
95        glMaterialfv(GL_FRONT, GL_SPECULAR, (float *)&mSpecularColor.r);
[3039]96
97        state->SetState(this);
[2751]98}
[2756]99
100
[3042]101void Technique::SetFragmentProgram(ShaderProgram *p)
[3036]102{
103        mFragmentProgram = p;
104
[3045]105        mFragmentProgramParameters.Reset();
106        mFragmentProgramParameters.SetProgram(p);
[2756]107}
[3036]108       
109
[3042]110void Technique::SetVertexProgram(ShaderProgram *p)
[3036]111{
112        mVertexProgram = p;
113
[3045]114        mVertexProgramParameters.Reset();
115        mVertexProgramParameters.SetProgram(p);
[3036]116}
117
[3042]118
[3045]119/***********************************************/
120/*        class Material implementation        */
121/***********************************************/
122
123
[3042]124void Material::Render(RenderState *state)
125{
[3048]126        mTechniques[state->GetRenderTechnique()]->Render(state);
[3036]127}
[3042]128
129
130Technique *Material::GetDefaultTechnique() const
131{
132        return mTechniques[0];
133}
134
135
136Technique *Material::GetTechnique(int i) const
137{
138        return mTechniques[i];
139}
140
141
142Material::Material()
143{
144        Technique *tech = new Technique();
145
146        mTechniques.push_back(tech);
147}
148
149
150Material::~Material()
151{
152        CLEAR_CONTAINER(mTechniques);
153}
154
155
156int Material::GetNumTechniques() const
157{
158        return (int)mTechniques.size();
159}
160
161
[3045]162void Material::AddTechnique(Technique *tech)
163{
164        mTechniques.push_back(tech);
[3042]165}
[3045]166
167
168}
Note: See TracBrowser for help on using the repository browser.