[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;
|
---|
[3065] | 38 | /// the render queue bucket this technique is assigned to
|
---|
[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 |
|
---|
[3045] | 62 |
|
---|
[3114] | 63 | void 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] | 74 | void 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] | 85 | void 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] | 102 | void 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 |
|
---|
| 110 | Technique *Material::GetDefaultTechnique() const
|
---|
| 111 | {
|
---|
| 112 | return mTechniques[0];
|
---|
| 113 | }
|
---|
| 114 |
|
---|
| 115 |
|
---|
| 116 | Technique *Material::GetTechnique(int i) const
|
---|
| 117 | {
|
---|
| 118 | return mTechniques[i];
|
---|
| 119 | }
|
---|
| 120 |
|
---|
| 121 |
|
---|
| 122 | Material::Material()
|
---|
| 123 | {
|
---|
| 124 | Technique *tech = new Technique();
|
---|
| 125 | mTechniques.push_back(tech);
|
---|
| 126 | }
|
---|
| 127 |
|
---|
| 128 |
|
---|
| 129 | Material::~Material()
|
---|
| 130 | {
|
---|
| 131 | CLEAR_CONTAINER(mTechniques);
|
---|
| 132 | }
|
---|
| 133 |
|
---|
| 134 |
|
---|
| 135 | int Material::GetNumTechniques() const
|
---|
| 136 | {
|
---|
| 137 | return (int)mTechniques.size();
|
---|
| 138 | }
|
---|
| 139 |
|
---|
| 140 |
|
---|
[3045] | 141 | void Material::AddTechnique(Technique *tech)
|
---|
| 142 | {
|
---|
| 143 | mTechniques.push_back(tech);
|
---|
[3042] | 144 | }
|
---|
[3045] | 145 |
|
---|
| 146 |
|
---|
| 147 | }
|
---|