mirror of
https://github.com/glest/glest-source.git
synced 2025-08-23 08:22:50 +02:00
Fading out at death works again
This commit is contained in:
@@ -12,7 +12,6 @@
|
||||
#ifndef _SHARED_GRAPHICS_GL_MODELRENDERERGL_H_
|
||||
#define _SHARED_GRAPHICS_GL_MODELRENDERERGL_H_
|
||||
|
||||
#include <array>
|
||||
#include "model_renderer.h"
|
||||
#include "model.h"
|
||||
#include "opengl.h"
|
||||
@@ -24,6 +23,23 @@ using ::Shared::Graphics::Gl::Texture2DGl;
|
||||
namespace Shared {
|
||||
namespace Graphics {
|
||||
namespace Gl {
|
||||
class MeshCallback {
|
||||
private:
|
||||
const Texture *teamTexture;
|
||||
|
||||
public:
|
||||
MeshCallback() {
|
||||
teamTexture = NULL;
|
||||
}
|
||||
|
||||
void setTeamTexture(const Texture *teamTexture) {
|
||||
this->teamTexture = teamTexture;
|
||||
}
|
||||
|
||||
void execute(const Mesh *mesh, float alpha);
|
||||
|
||||
static bool noTeamColors;
|
||||
};
|
||||
|
||||
// =====================================================
|
||||
// class ModelRendererGl
|
||||
@@ -55,24 +71,6 @@ namespace Shared {
|
||||
void renderMesh(Mesh *mesh, int renderMode = rmNormal, float alpha = 1.0f);
|
||||
void renderMeshNormals(Mesh *mesh);
|
||||
};
|
||||
|
||||
class MeshCallbackTeamColor : public MeshCallback {
|
||||
private:
|
||||
const Texture *teamTexture;
|
||||
|
||||
public:
|
||||
MeshCallbackTeamColor() : MeshCallback() {
|
||||
teamTexture = NULL;
|
||||
}
|
||||
|
||||
void setTeamTexture(const Texture *teamTexture) {
|
||||
this->teamTexture = teamTexture;
|
||||
}
|
||||
|
||||
virtual void execute(const Mesh *mesh);
|
||||
|
||||
static bool noTeamColors;
|
||||
};
|
||||
}
|
||||
}
|
||||
}//end namespace
|
||||
|
@@ -18,30 +18,18 @@
|
||||
|
||||
namespace Shared {
|
||||
namespace Graphics {
|
||||
namespace Gl {
|
||||
class MeshCallback;
|
||||
}
|
||||
|
||||
enum RenderMode {
|
||||
rmNormal,
|
||||
rmSelection,
|
||||
|
||||
renderModeCount
|
||||
};
|
||||
|
||||
|
||||
class Texture;
|
||||
|
||||
// =====================================================
|
||||
// class MeshCallback
|
||||
//
|
||||
/// This gets called before rendering mesh
|
||||
// =====================================================
|
||||
|
||||
class MeshCallback {
|
||||
public:
|
||||
virtual ~MeshCallback() {
|
||||
};
|
||||
virtual void execute(const Mesh *mesh) = 0;
|
||||
};
|
||||
|
||||
// =====================================================
|
||||
// class ModelRenderer
|
||||
// =====================================================
|
||||
@@ -52,7 +40,7 @@ namespace Shared {
|
||||
bool renderTextures;
|
||||
bool renderColors;
|
||||
bool colorPickingMode;
|
||||
MeshCallback *meshCallback;
|
||||
Gl::MeshCallback *meshCallback;
|
||||
|
||||
public:
|
||||
ModelRenderer() {
|
||||
@@ -67,7 +55,7 @@ namespace Shared {
|
||||
virtual ~ModelRenderer() {
|
||||
};
|
||||
|
||||
virtual void begin(bool renderNormals, bool renderTextures, bool renderColors, bool colorPickingMode, MeshCallback *meshCallback = NULL) = 0;
|
||||
virtual void begin(bool renderNormals, bool renderTextures, bool renderColors, bool colorPickingMode, Gl::MeshCallback *meshCallback = NULL) = 0;
|
||||
virtual void end() = 0;
|
||||
virtual void render(Model *model, int renderMode = rmNormal, float alpha = 1.0f) = 0;
|
||||
virtual void renderNormalsOnly(Model *model) = 0;
|
||||
|
@@ -22,12 +22,12 @@ using namespace Shared::Platform;
|
||||
namespace Shared {
|
||||
namespace Graphics {
|
||||
namespace Gl {
|
||||
bool MeshCallbackTeamColor::noTeamColors = false;
|
||||
bool MeshCallback::noTeamColors = false;
|
||||
|
||||
void MeshCallbackTeamColor::execute(const Mesh *mesh) {
|
||||
void MeshCallback::execute(const Mesh *mesh, float alpha) {
|
||||
//team color
|
||||
uint8 opacity = mesh->getFactionColorOpacity();
|
||||
if (!mesh->getCustomTexture() || opacity == 0 || teamTexture == NULL || MeshCallbackTeamColor::noTeamColors) {
|
||||
if (!mesh->getCustomTexture() || opacity == 0 || teamTexture == NULL || MeshCallback::noTeamColors) {
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
@@ -44,7 +44,7 @@ namespace Shared {
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_TEXTURE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
|
||||
//set alpha to 1
|
||||
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
|
||||
@@ -56,10 +56,10 @@ namespace Shared {
|
||||
GLuint handle = static_cast<const Texture2DGl*>(teamTexture)->getHandle();
|
||||
glBindTexture(GL_TEXTURE_2D, handle);
|
||||
float color[4];
|
||||
color[0] = 1.0f; // Red
|
||||
color[1] = 1.0f; // Green
|
||||
color[2] = 1.0f; // Blue
|
||||
color[3] = opacity * 0.00392156862f; // Alpha
|
||||
color[0] = 1.0f; // Red
|
||||
color[1] = 1.0f; // Green
|
||||
color[2] = 1.0f; // Blue
|
||||
color[3] = opacity * 0.00392156862f; // Alpha
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);
|
||||
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
@@ -72,14 +72,33 @@ namespace Shared {
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
|
||||
|
||||
//set alpha to 1
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_INTERPOLATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA);
|
||||
|
||||
if (alpha < 1.f - FLT_EPSILON) {
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glMultiTexCoord2f(GL_TEXTURE1, 0.f, 0.f);
|
||||
glBindTexture(GL_TEXTURE_2D, handle);
|
||||
color[3] = alpha;
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);
|
||||
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
|
||||
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
|
||||
}
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
}
|
||||
@@ -248,7 +267,7 @@ namespace Shared {
|
||||
if (this->colorPickingMode == false) {
|
||||
//set color
|
||||
if (renderColors) {
|
||||
Vec4f color(mesh->getDiffuseColor(), mesh->getOpacity() * alpha);
|
||||
Vec4f color(mesh->getDiffuseColor(), mesh->getOpacity());
|
||||
glColor4fv(color.ptr());
|
||||
}
|
||||
|
||||
@@ -272,7 +291,7 @@ namespace Shared {
|
||||
}
|
||||
|
||||
if (meshCallback != NULL) {
|
||||
meshCallback->execute(mesh);
|
||||
meshCallback->execute(mesh, alpha);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user