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