[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] | 8 | using namespace std;
|
---|
[2756] | 9 |
|
---|
[3034] | 10 |
|
---|
[2776] | 11 | namespace CHCDemoEngine
|
---|
[2751] | 12 | {
|
---|
[2747] | 13 |
|
---|
[2769] | 14 | RgbaColor 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] | 20 | void 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] | 41 | Technique::Technique():
|
---|
[3034] | 42 | mAmbientColor(RgbaColor(0.2f, 0.2f, 0.2f, 1.0f)),
|
---|
| 43 | mDiffuseColor(RgbaColor(1.0f, 1.0f, 1.0f, 1.0f)),
|
---|
| 44 | mSpecularColor(RgbaColor(.0f, .0f, .0f, 1.0f)),
|
---|
| 45 | mEmmisiveColor(RgbaColor(.0f, .0f, .0f, 1.0f))
|
---|
[2756] | 46 | {
|
---|
[3047] | 47 | Init();
|
---|
[2756] | 48 | }
|
---|
[2755] | 49 |
|
---|
[2756] | 50 |
|
---|
[3042] | 51 | Technique::Technique(const RgbaColor &color):
|
---|
[2756] | 52 | mDiffuseColor(color),
|
---|
[2755] | 53 | mAmbientColor(color),
|
---|
[2795] | 54 | mSpecularColor(0, 0, 0, 1),
|
---|
[2756] | 55 | mTexture(NULL)
|
---|
[2755] | 56 | {
|
---|
[3047] | 57 | Init();
|
---|
[2755] | 58 | }
|
---|
| 59 |
|
---|
| 60 |
|
---|
[3050] | 61 | Technique::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] | 85 | Technique::~Technique()
|
---|
| 86 | {
|
---|
| 87 | }
|
---|
| 88 |
|
---|
| 89 |
|
---|
[3042] | 90 | void 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] | 101 | void Technique::SetFragmentProgram(ShaderProgram *p)
|
---|
[3036] | 102 | {
|
---|
| 103 | mFragmentProgram = p;
|
---|
| 104 |
|
---|
[3045] | 105 | mFragmentProgramParameters.Reset();
|
---|
| 106 | mFragmentProgramParameters.SetProgram(p);
|
---|
[2756] | 107 | }
|
---|
[3036] | 108 |
|
---|
| 109 |
|
---|
[3042] | 110 | void 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] | 124 | void Material::Render(RenderState *state)
|
---|
| 125 | {
|
---|
[3048] | 126 | mTechniques[state->GetRenderTechnique()]->Render(state);
|
---|
[3036] | 127 | }
|
---|
[3042] | 128 |
|
---|
| 129 |
|
---|
| 130 | Technique *Material::GetDefaultTechnique() const
|
---|
| 131 | {
|
---|
| 132 | return mTechniques[0];
|
---|
| 133 | }
|
---|
| 134 |
|
---|
| 135 |
|
---|
| 136 | Technique *Material::GetTechnique(int i) const
|
---|
| 137 | {
|
---|
| 138 | return mTechniques[i];
|
---|
| 139 | }
|
---|
| 140 |
|
---|
| 141 |
|
---|
| 142 | Material::Material()
|
---|
| 143 | {
|
---|
| 144 | Technique *tech = new Technique();
|
---|
| 145 |
|
---|
| 146 | mTechniques.push_back(tech);
|
---|
| 147 | }
|
---|
| 148 |
|
---|
| 149 |
|
---|
| 150 | Material::~Material()
|
---|
| 151 | {
|
---|
| 152 | CLEAR_CONTAINER(mTechniques);
|
---|
| 153 | }
|
---|
| 154 |
|
---|
| 155 |
|
---|
| 156 | int Material::GetNumTechniques() const
|
---|
| 157 | {
|
---|
| 158 | return (int)mTechniques.size();
|
---|
| 159 | }
|
---|
| 160 |
|
---|
| 161 |
|
---|
[3045] | 162 | void Material::AddTechnique(Technique *tech)
|
---|
| 163 | {
|
---|
| 164 | mTechniques.push_back(tech);
|
---|
[3042] | 165 | }
|
---|
[3045] | 166 |
|
---|
| 167 |
|
---|
| 168 | }
|
---|