Allow render red or blue karts in soccer mode using shader
This commit is contained in:
parent
d520c4477d
commit
2f217fd55b
39
data/shaders/instanced_object_pass2_blue.frag
Normal file
39
data/shaders/instanced_object_pass2_blue.frag
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#ifndef Use_Bindless_Texture
|
||||||
|
uniform sampler2D Albedo;
|
||||||
|
uniform sampler2D SpecMap;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef Use_Bindless_Texture
|
||||||
|
flat in sampler2D handle;
|
||||||
|
flat in sampler2D secondhandle;
|
||||||
|
#endif
|
||||||
|
in vec2 uv;
|
||||||
|
in vec4 color;
|
||||||
|
out vec4 FragColor;
|
||||||
|
|
||||||
|
vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue, float emitMapValue);
|
||||||
|
vec3 rgbToHsv(vec3 c);
|
||||||
|
vec3 hsvToRgb(vec3 c);
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
#ifdef Use_Bindless_Texture
|
||||||
|
vec4 col = texture(handle, uv);
|
||||||
|
float specmap = texture(secondhandle, uv).g;
|
||||||
|
float emitmap = texture(secondhandle, uv).b;
|
||||||
|
#ifdef SRGBBindlessFix
|
||||||
|
col.xyz = pow(col.xyz, vec3(2.2));
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
vec4 col = texture(Albedo, uv);
|
||||||
|
float specmap = texture(SpecMap, uv).g;
|
||||||
|
float emitmap = texture(SpecMap, uv).b;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vec3 old_color = rgbToHsv(col.rgb);
|
||||||
|
vec3 new_color = hsvToRgb(vec3(0.1,0.5,old_color.z));
|
||||||
|
col = vec4(new_color.b, new_color.g, new_color.r, col.a);
|
||||||
|
col.xyz *= pow(color.xyz, vec3(2.2));
|
||||||
|
|
||||||
|
FragColor = vec4(getLightFactor(col.xyz, vec3(1.), specmap, emitmap) , 1.);
|
||||||
|
}
|
39
data/shaders/instanced_object_pass2_red.frag
Normal file
39
data/shaders/instanced_object_pass2_red.frag
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#ifndef Use_Bindless_Texture
|
||||||
|
uniform sampler2D Albedo;
|
||||||
|
uniform sampler2D SpecMap;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef Use_Bindless_Texture
|
||||||
|
flat in sampler2D handle;
|
||||||
|
flat in sampler2D secondhandle;
|
||||||
|
#endif
|
||||||
|
in vec2 uv;
|
||||||
|
in vec4 color;
|
||||||
|
out vec4 FragColor;
|
||||||
|
|
||||||
|
vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue, float emitMapValue);
|
||||||
|
vec3 rgbToHsv(vec3 c);
|
||||||
|
vec3 hsvToRgb(vec3 c);
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
#ifdef Use_Bindless_Texture
|
||||||
|
vec4 col = texture(handle, uv);
|
||||||
|
float specmap = texture(secondhandle, uv).g;
|
||||||
|
float emitmap = texture(secondhandle, uv).b;
|
||||||
|
#ifdef SRGBBindlessFix
|
||||||
|
col.xyz = pow(col.xyz, vec3(2.2));
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
vec4 col = texture(Albedo, uv);
|
||||||
|
float specmap = texture(SpecMap, uv).g;
|
||||||
|
float emitmap = texture(SpecMap, uv).b;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vec3 old_color = rgbToHsv(col.rgb);
|
||||||
|
vec3 new_color = hsvToRgb(vec3(0.7,0.7,old_color.z));
|
||||||
|
col = vec4(new_color.b, new_color.g, new_color.r, col.a);
|
||||||
|
col.xyz *= pow(color.xyz, vec3(2.2));
|
||||||
|
|
||||||
|
FragColor = vec4(getLightFactor(col.xyz, vec3(1.), specmap, emitmap) , 1.);
|
||||||
|
}
|
35
data/shaders/object_pass2_blue.frag
Normal file
35
data/shaders/object_pass2_blue.frag
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#ifdef Use_Bindless_Texture
|
||||||
|
layout(bindless_sampler) uniform sampler2D Albedo;
|
||||||
|
layout(bindless_sampler) uniform sampler2D SpecMap;
|
||||||
|
#else
|
||||||
|
uniform sampler2D Albedo;
|
||||||
|
uniform sampler2D SpecMap;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
in vec2 uv;
|
||||||
|
in vec4 color;
|
||||||
|
out vec4 FragColor;
|
||||||
|
|
||||||
|
vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue, float emitMapValue);
|
||||||
|
vec3 rgbToHsv(vec3 c);
|
||||||
|
vec3 hsvToRgb(vec3 c);
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
#ifdef Use_Bindless_Texture
|
||||||
|
vec4 col = texture(Albedo, uv);
|
||||||
|
#ifdef SRGBBindlessFix
|
||||||
|
col.xyz = pow(col.xyz, vec3(2.2));
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
vec4 col = texture(Albedo, uv);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vec3 old_color = rgbToHsv(col.rgb);
|
||||||
|
vec3 new_color = hsvToRgb(vec3(0.1,0.5,old_color.z));
|
||||||
|
col = vec4(new_color.b, new_color.g, new_color.r, col.a);
|
||||||
|
col.xyz *= pow(color.xyz, vec3(2.2));
|
||||||
|
float specmap = texture(SpecMap, uv).g;
|
||||||
|
float emitmap = texture(SpecMap, uv).b;
|
||||||
|
FragColor = vec4(getLightFactor(col.xyz, vec3(1.), specmap, emitmap), 1.);
|
||||||
|
}
|
35
data/shaders/object_pass2_red.frag
Normal file
35
data/shaders/object_pass2_red.frag
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#ifdef Use_Bindless_Texture
|
||||||
|
layout(bindless_sampler) uniform sampler2D Albedo;
|
||||||
|
layout(bindless_sampler) uniform sampler2D SpecMap;
|
||||||
|
#else
|
||||||
|
uniform sampler2D Albedo;
|
||||||
|
uniform sampler2D SpecMap;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
in vec2 uv;
|
||||||
|
in vec4 color;
|
||||||
|
out vec4 FragColor;
|
||||||
|
|
||||||
|
vec3 getLightFactor(vec3 diffuseMatColor, vec3 specularMatColor, float specMapValue, float emitMapValue);
|
||||||
|
vec3 rgbToHsv(vec3 c);
|
||||||
|
vec3 hsvToRgb(vec3 c);
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
#ifdef Use_Bindless_Texture
|
||||||
|
vec4 col = texture(Albedo, uv);
|
||||||
|
#ifdef SRGBBindlessFix
|
||||||
|
col.xyz = pow(col.xyz, vec3(2.2));
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
vec4 col = texture(Albedo, uv);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vec3 old_color = rgbToHsv(col.rgb);
|
||||||
|
vec3 new_color = hsvToRgb(vec3(0.7,0.7,old_color.z));
|
||||||
|
col = vec4(new_color.b, new_color.g, new_color.r, col.a);
|
||||||
|
col.xyz *= pow(color.xyz, vec3(2.2));
|
||||||
|
float specmap = texture(SpecMap, uv).g;
|
||||||
|
float emitmap = texture(SpecMap, uv).b;
|
||||||
|
FragColor = vec4(getLightFactor(col.xyz, vec3(1.), specmap, emitmap), 1.);
|
||||||
|
}
|
17
data/shaders/utils/rgb_conversion.frag
Normal file
17
data/shaders/utils/rgb_conversion.frag
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
vec3 rgbToHsv(vec3 c)
|
||||||
|
{
|
||||||
|
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
|
||||||
|
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
|
||||||
|
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
|
||||||
|
|
||||||
|
float d = q.x - min(q.w, q.y);
|
||||||
|
float e = 1.0e-10;
|
||||||
|
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 hsvToRgb(vec3 c)
|
||||||
|
{
|
||||||
|
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
|
||||||
|
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
|
||||||
|
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
|
||||||
|
}
|
@ -81,15 +81,15 @@ namespace scene
|
|||||||
|
|
||||||
//! Set the mesh to use a specific render type (mainly karts in STK)
|
//! Set the mesh to use a specific render type (mainly karts in STK)
|
||||||
/** \param t New render type for the mesh.
|
/** \param t New render type for the mesh.
|
||||||
\param effective_buffer Mesh buffer numbers which are effected by new render type,
|
\param affected_buffers Mesh buffer numbers which are effected by new render type,
|
||||||
if not given all mesh buffers are affected. */
|
if not given all mesh buffers are affected. */
|
||||||
void setMeshRenderType(video::E_RENDER_TYPE t, const std::vector<int>& effective_buffer = std::vector<int>())
|
void setMeshRenderType(video::E_RENDER_TYPE t, const std::vector<int>& affected_buffers = std::vector<int>())
|
||||||
{
|
{
|
||||||
if (t == video::ERT_DEFAULT) return;
|
if (t == video::ERT_DEFAULT) return;
|
||||||
setCustomRenderType(true);
|
setCustomRenderType(true);
|
||||||
for (int i = 0; i < int(getMeshBufferCount()); i++)
|
for (int i = 0; i < int(getMeshBufferCount()); i++)
|
||||||
{
|
{
|
||||||
if (!effective_buffer.empty() && std::find(effective_buffer.begin(), effective_buffer.end(), i) == effective_buffer.end())
|
if (!affected_buffers.empty() && std::find(affected_buffers.begin(), affected_buffers.end(), i) == affected_buffers.end())
|
||||||
continue;
|
continue;
|
||||||
getMeshBuffer(i)->setRenderType(t);
|
getMeshBuffer(i)->setRenderType(t);
|
||||||
}
|
}
|
||||||
|
@ -1015,7 +1015,7 @@ scene::IMesh *IrrDriver::getMesh(const std::string &filename)
|
|||||||
*/
|
*/
|
||||||
scene::IAnimatedMesh *IrrDriver::copyAnimatedMesh(scene::IAnimatedMesh *orig,
|
scene::IAnimatedMesh *IrrDriver::copyAnimatedMesh(scene::IAnimatedMesh *orig,
|
||||||
video::E_RENDER_TYPE rt,
|
video::E_RENDER_TYPE rt,
|
||||||
const std::vector<int>& effective_buffer)
|
const std::vector<int>& affected_buffers)
|
||||||
{
|
{
|
||||||
using namespace scene;
|
using namespace scene;
|
||||||
CSkinnedMesh *mesh = dynamic_cast<CSkinnedMesh*>(orig);
|
CSkinnedMesh *mesh = dynamic_cast<CSkinnedMesh*>(orig);
|
||||||
@ -1026,7 +1026,7 @@ scene::IAnimatedMesh *IrrDriver::copyAnimatedMesh(scene::IAnimatedMesh *orig,
|
|||||||
}
|
}
|
||||||
|
|
||||||
scene::IAnimatedMesh* out = mesh->clone();
|
scene::IAnimatedMesh* out = mesh->clone();
|
||||||
out->setMeshRenderType(rt, effective_buffer);
|
out->setMeshRenderType(rt, affected_buffers);
|
||||||
return out;
|
return out;
|
||||||
} // copyAnimatedMesh
|
} // copyAnimatedMesh
|
||||||
|
|
||||||
|
@ -355,7 +355,7 @@ public:
|
|||||||
scene::IMesh *getMesh(const std::string &name);
|
scene::IMesh *getMesh(const std::string &name);
|
||||||
scene::IAnimatedMesh *copyAnimatedMesh(scene::IAnimatedMesh *orig,
|
scene::IAnimatedMesh *copyAnimatedMesh(scene::IAnimatedMesh *orig,
|
||||||
video::E_RENDER_TYPE rt,
|
video::E_RENDER_TYPE rt,
|
||||||
const std::vector<int>& effective_buffer = std::vector<int>());
|
const std::vector<int>& affected_buffers = std::vector<int>());
|
||||||
video::ITexture *applyMask(video::ITexture* texture,
|
video::ITexture *applyMask(video::ITexture* texture,
|
||||||
const std::string& mask_path);
|
const std::string& mask_path);
|
||||||
void displayFPS();
|
void displayFPS();
|
||||||
|
@ -140,6 +140,7 @@ Material::Material(const XMLNode *node, bool deprecated)
|
|||||||
node->get("slowdown-time", &m_slowdown_time );
|
node->get("slowdown-time", &m_slowdown_time );
|
||||||
node->get("backface-culling", &m_backface_culling );
|
node->get("backface-culling", &m_backface_culling );
|
||||||
node->get("disable-z-write", &m_disable_z_write );
|
node->get("disable-z-write", &m_disable_z_write );
|
||||||
|
node->get("colorizable", &m_colorizable );
|
||||||
node->get("fog", &m_fog );
|
node->get("fog", &m_fog );
|
||||||
|
|
||||||
node->get("mask", &m_mask );
|
node->get("mask", &m_mask );
|
||||||
@ -434,6 +435,7 @@ void Material::init()
|
|||||||
m_mirror_axis_when_reverse = ' ';
|
m_mirror_axis_when_reverse = ' ';
|
||||||
m_collision_reaction = NORMAL;
|
m_collision_reaction = NORMAL;
|
||||||
m_disable_z_write = false;
|
m_disable_z_write = false;
|
||||||
|
m_colorizable = false;
|
||||||
m_water_shader_speed_1 = 6.6667f;
|
m_water_shader_speed_1 = 6.6667f;
|
||||||
m_water_shader_speed_2 = 4.0f;
|
m_water_shader_speed_2 = 4.0f;
|
||||||
m_fog = true;
|
m_fog = true;
|
||||||
|
@ -47,6 +47,8 @@ public:
|
|||||||
enum ShaderType
|
enum ShaderType
|
||||||
{
|
{
|
||||||
SHADERTYPE_SOLID,
|
SHADERTYPE_SOLID,
|
||||||
|
SHADERTYPE_SOLID_RED,
|
||||||
|
SHADERTYPE_SOLID_BLUE,
|
||||||
SHADERTYPE_ALPHA_TEST,
|
SHADERTYPE_ALPHA_TEST,
|
||||||
SHADERTYPE_ALPHA_BLEND,
|
SHADERTYPE_ALPHA_BLEND,
|
||||||
SHADERTYPE_ADDITIVE,
|
SHADERTYPE_ADDITIVE,
|
||||||
@ -175,6 +177,9 @@ private:
|
|||||||
/** Set to true to disable writing to the Z buffer. Usually to be used with alpha blending */
|
/** Set to true to disable writing to the Z buffer. Usually to be used with alpha blending */
|
||||||
bool m_disable_z_write;
|
bool m_disable_z_write;
|
||||||
|
|
||||||
|
/** True if this material can be colorized (like red/blue in team game). */
|
||||||
|
bool m_colorizable;
|
||||||
|
|
||||||
/** Some textures need to be pre-multiplied, some divided to give
|
/** Some textures need to be pre-multiplied, some divided to give
|
||||||
* the intended effect. */
|
* the intended effect. */
|
||||||
//enum {ADJ_NONE, ADJ_PREMUL, ADJ_DIV}
|
//enum {ADJ_NONE, ADJ_PREMUL, ADJ_DIV}
|
||||||
@ -283,6 +288,10 @@ public:
|
|||||||
* is driving on it. */
|
* is driving on it. */
|
||||||
bool isDriveReset () const { return m_drive_reset; }
|
bool isDriveReset () const { return m_drive_reset; }
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
/** Returns if this material can be colorized (like red/blue in team game).
|
||||||
|
*/
|
||||||
|
bool isColorizable () const { return m_colorizable; }
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
/** Returns if this material should trigger a rescue if a kart
|
/** Returns if this material should trigger a rescue if a kart
|
||||||
* crashes against it. */
|
* crashes against it. */
|
||||||
CollisionReaction getCollisionReaction() const { return m_collision_reaction; }
|
CollisionReaction getCollisionReaction() const { return m_collision_reaction; }
|
||||||
|
@ -149,6 +149,46 @@ public:
|
|||||||
} // InstancedObjectPass2Shader
|
} // InstancedObjectPass2Shader
|
||||||
}; // InstancedObjectPass2Shader
|
}; // InstancedObjectPass2Shader
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
class InstancedObjectPass2ShaderRed : public TextureShader<InstancedObjectPass2ShaderRed, 5>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
InstancedObjectPass2ShaderRed()
|
||||||
|
{
|
||||||
|
loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert",
|
||||||
|
GL_VERTEX_SHADER, "instanced_object_pass.vert",
|
||||||
|
GL_FRAGMENT_SHADER, "utils/getLightFactor.frag",
|
||||||
|
GL_FRAGMENT_SHADER, "utils/rgb_conversion.frag",
|
||||||
|
GL_FRAGMENT_SHADER, "instanced_object_pass2_red.frag");
|
||||||
|
assignUniforms();
|
||||||
|
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||||
|
1, "SpecularMap", ST_NEAREST_FILTERED,
|
||||||
|
2, "SSAO", ST_BILINEAR_FILTERED,
|
||||||
|
3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
||||||
|
4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
|
} // InstancedObjectPass2ShaderRed
|
||||||
|
}; // InstancedObjectPass2ShaderRed
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
class InstancedObjectPass2ShaderBlue : public TextureShader<InstancedObjectPass2ShaderBlue, 5>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
InstancedObjectPass2ShaderBlue()
|
||||||
|
{
|
||||||
|
loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert",
|
||||||
|
GL_VERTEX_SHADER, "instanced_object_pass.vert",
|
||||||
|
GL_FRAGMENT_SHADER, "utils/getLightFactor.frag",
|
||||||
|
GL_FRAGMENT_SHADER, "utils/rgb_conversion.frag",
|
||||||
|
GL_FRAGMENT_SHADER, "instanced_object_pass2_blue.frag");
|
||||||
|
assignUniforms();
|
||||||
|
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||||
|
1, "SpecularMap", ST_NEAREST_FILTERED,
|
||||||
|
2, "SSAO", ST_BILINEAR_FILTERED,
|
||||||
|
3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
||||||
|
4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
|
} // InstancedObjectPass2ShaderBlue
|
||||||
|
}; // InstancedObjectPass2ShaderBlue
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
class InstancedObjectRefPass2Shader : public TextureShader<InstancedObjectRefPass2Shader, 5>
|
class InstancedObjectRefPass2Shader : public TextureShader<InstancedObjectRefPass2Shader, 5>
|
||||||
{
|
{
|
||||||
@ -542,6 +582,66 @@ const STK::Tuple<size_t, size_t> DefaultMaterial::SecondPassTextures
|
|||||||
const STK::Tuple<> DefaultMaterial::ShadowTextures;
|
const STK::Tuple<> DefaultMaterial::ShadowTextures;
|
||||||
const STK::Tuple<size_t> DefaultMaterial::RSMTextures = STK::Tuple<size_t>(0);
|
const STK::Tuple<size_t> DefaultMaterial::RSMTextures = STK::Tuple<size_t>(0);
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
struct RedMaterial
|
||||||
|
{
|
||||||
|
typedef InstancedObjectPass1Shader InstancedFirstPassShader;
|
||||||
|
typedef InstancedObjectPass2ShaderRed InstancedSecondPassShader;
|
||||||
|
typedef InstancedShadowShader InstancedShadowPassShader;
|
||||||
|
typedef CInstancedRSMShader InstancedRSMShader;
|
||||||
|
typedef ListInstancedMatRed InstancedList;
|
||||||
|
typedef Shaders::ObjectPass1Shader FirstPassShader;
|
||||||
|
typedef Shaders::ObjectPass2ShaderRed SecondPassShader;
|
||||||
|
typedef ShadowShader ShadowPassShader;
|
||||||
|
typedef CRSMShader RSMShader;
|
||||||
|
typedef ListMatRed List;
|
||||||
|
static const enum video::E_VERTEX_TYPE VertexType = video::EVT_STANDARD;
|
||||||
|
static const enum Material::ShaderType MaterialType
|
||||||
|
= Material::SHADERTYPE_SOLID_RED;
|
||||||
|
static const enum InstanceType Instance = InstanceTypeDualTex;
|
||||||
|
static const STK::Tuple<size_t> FirstPassTextures;
|
||||||
|
static const STK::Tuple<size_t, size_t> SecondPassTextures;
|
||||||
|
static const STK::Tuple<> ShadowTextures;
|
||||||
|
static const STK::Tuple<size_t> RSMTextures;
|
||||||
|
}; // struct RedMaterial
|
||||||
|
|
||||||
|
const STK::Tuple<size_t> RedMaterial::FirstPassTextures
|
||||||
|
= STK::Tuple<size_t>(1);
|
||||||
|
const STK::Tuple<size_t, size_t> RedMaterial::SecondPassTextures
|
||||||
|
= STK::Tuple<size_t, size_t>(0, 1);
|
||||||
|
const STK::Tuple<> RedMaterial::ShadowTextures;
|
||||||
|
const STK::Tuple<size_t> RedMaterial::RSMTextures = STK::Tuple<size_t>(0);
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
struct BlueMaterial
|
||||||
|
{
|
||||||
|
typedef InstancedObjectPass1Shader InstancedFirstPassShader;
|
||||||
|
typedef InstancedObjectPass2ShaderBlue InstancedSecondPassShader;
|
||||||
|
typedef InstancedShadowShader InstancedShadowPassShader;
|
||||||
|
typedef CInstancedRSMShader InstancedRSMShader;
|
||||||
|
typedef ListInstancedMatBlue InstancedList;
|
||||||
|
typedef Shaders::ObjectPass1Shader FirstPassShader;
|
||||||
|
typedef Shaders::ObjectPass2ShaderBlue SecondPassShader;
|
||||||
|
typedef ShadowShader ShadowPassShader;
|
||||||
|
typedef CRSMShader RSMShader;
|
||||||
|
typedef ListMatBlue List;
|
||||||
|
static const enum video::E_VERTEX_TYPE VertexType = video::EVT_STANDARD;
|
||||||
|
static const enum Material::ShaderType MaterialType
|
||||||
|
= Material::SHADERTYPE_SOLID_BLUE;
|
||||||
|
static const enum InstanceType Instance = InstanceTypeDualTex;
|
||||||
|
static const STK::Tuple<size_t> FirstPassTextures;
|
||||||
|
static const STK::Tuple<size_t, size_t> SecondPassTextures;
|
||||||
|
static const STK::Tuple<> ShadowTextures;
|
||||||
|
static const STK::Tuple<size_t> RSMTextures;
|
||||||
|
}; // struct BlueMaterial
|
||||||
|
|
||||||
|
const STK::Tuple<size_t> BlueMaterial::FirstPassTextures
|
||||||
|
= STK::Tuple<size_t>(1);
|
||||||
|
const STK::Tuple<size_t, size_t> BlueMaterial::SecondPassTextures
|
||||||
|
= STK::Tuple<size_t, size_t>(0, 1);
|
||||||
|
const STK::Tuple<> BlueMaterial::ShadowTextures;
|
||||||
|
const STK::Tuple<size_t> BlueMaterial::RSMTextures = STK::Tuple<size_t>(0);
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
struct AlphaRef
|
struct AlphaRef
|
||||||
{
|
{
|
||||||
@ -1187,6 +1287,8 @@ void IrrDriver::renderSolidFirstPass()
|
|||||||
ImmediateDrawList::getInstance()->at(i)->render();
|
ImmediateDrawList::getInstance()->at(i)->render();
|
||||||
|
|
||||||
renderMeshes1stPass<DefaultMaterial, 2, 1>();
|
renderMeshes1stPass<DefaultMaterial, 2, 1>();
|
||||||
|
renderMeshes1stPass<RedMaterial, 2, 1>();
|
||||||
|
renderMeshes1stPass<BlueMaterial, 2, 1>();
|
||||||
renderMeshes1stPass<SplattingMat, 2, 1>();
|
renderMeshes1stPass<SplattingMat, 2, 1>();
|
||||||
renderMeshes1stPass<UnlitMat, 3, 2, 1>();
|
renderMeshes1stPass<UnlitMat, 3, 2, 1>();
|
||||||
renderMeshes1stPass<AlphaRef, 3, 2, 1>();
|
renderMeshes1stPass<AlphaRef, 3, 2, 1>();
|
||||||
@ -1198,6 +1300,8 @@ void IrrDriver::renderSolidFirstPass()
|
|||||||
if (CVS->isAZDOEnabled())
|
if (CVS->isAZDOEnabled())
|
||||||
{
|
{
|
||||||
multidraw1stPass<DefaultMaterial>();
|
multidraw1stPass<DefaultMaterial>();
|
||||||
|
multidraw1stPass<RedMaterial>();
|
||||||
|
multidraw1stPass<BlueMaterial>();
|
||||||
multidraw1stPass<AlphaRef>();
|
multidraw1stPass<AlphaRef>();
|
||||||
multidraw1stPass<SphereMap>();
|
multidraw1stPass<SphereMap>();
|
||||||
multidraw1stPass<UnlitMat>();
|
multidraw1stPass<UnlitMat>();
|
||||||
@ -1209,6 +1313,8 @@ void IrrDriver::renderSolidFirstPass()
|
|||||||
else if (CVS->supportsIndirectInstancingRendering())
|
else if (CVS->supportsIndirectInstancingRendering())
|
||||||
{
|
{
|
||||||
renderInstancedMeshes1stPass<DefaultMaterial>();
|
renderInstancedMeshes1stPass<DefaultMaterial>();
|
||||||
|
renderInstancedMeshes1stPass<RedMaterial>();
|
||||||
|
renderInstancedMeshes1stPass<BlueMaterial>();
|
||||||
renderInstancedMeshes1stPass<AlphaRef>();
|
renderInstancedMeshes1stPass<AlphaRef>();
|
||||||
renderInstancedMeshes1stPass<UnlitMat>();
|
renderInstancedMeshes1stPass<UnlitMat>();
|
||||||
renderInstancedMeshes1stPass<SphereMap>();
|
renderInstancedMeshes1stPass<SphereMap>();
|
||||||
@ -1351,6 +1457,8 @@ void IrrDriver::renderSolidSecondPass()
|
|||||||
m_rtts->getRenderTarget(RTT_HALF1_R));
|
m_rtts->getRenderTarget(RTT_HALF1_R));
|
||||||
|
|
||||||
renderMeshes2ndPass<DefaultMaterial, 3, 1>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle), DiffSpecSSAOTex);
|
renderMeshes2ndPass<DefaultMaterial, 3, 1>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle), DiffSpecSSAOTex);
|
||||||
|
renderMeshes2ndPass<RedMaterial, 3, 1>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle), DiffSpecSSAOTex);
|
||||||
|
renderMeshes2ndPass<BlueMaterial, 3, 1>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle), DiffSpecSSAOTex);
|
||||||
renderMeshes2ndPass<AlphaRef, 3, 1 >(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle), DiffSpecSSAOTex);
|
renderMeshes2ndPass<AlphaRef, 3, 1 >(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle), DiffSpecSSAOTex);
|
||||||
renderMeshes2ndPass<UnlitMat, 3, 1>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle), DiffSpecSSAOTex);
|
renderMeshes2ndPass<UnlitMat, 3, 1>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle), DiffSpecSSAOTex);
|
||||||
renderMeshes2ndPass<SplattingMat, 1>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle), DiffSpecSSAOTex);
|
renderMeshes2ndPass<SplattingMat, 1>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle), DiffSpecSSAOTex);
|
||||||
@ -1362,6 +1470,8 @@ void IrrDriver::renderSolidSecondPass()
|
|||||||
if (CVS->isAZDOEnabled())
|
if (CVS->isAZDOEnabled())
|
||||||
{
|
{
|
||||||
multidraw2ndPass<DefaultMaterial>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0, 0));
|
multidraw2ndPass<DefaultMaterial>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0, 0));
|
||||||
|
multidraw2ndPass<RedMaterial>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0, 0));
|
||||||
|
multidraw2ndPass<BlueMaterial>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0, 0));
|
||||||
multidraw2ndPass<AlphaRef>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0, 0));
|
multidraw2ndPass<AlphaRef>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0, 0));
|
||||||
multidraw2ndPass<SphereMap>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
|
multidraw2ndPass<SphereMap>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
|
||||||
multidraw2ndPass<UnlitMat>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
|
multidraw2ndPass<UnlitMat>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
|
||||||
@ -1392,6 +1502,8 @@ void IrrDriver::renderSolidSecondPass()
|
|||||||
else if (CVS->supportsIndirectInstancingRendering())
|
else if (CVS->supportsIndirectInstancingRendering())
|
||||||
{
|
{
|
||||||
renderInstancedMeshes2ndPass<DefaultMaterial>(DiffSpecSSAOTex);
|
renderInstancedMeshes2ndPass<DefaultMaterial>(DiffSpecSSAOTex);
|
||||||
|
renderInstancedMeshes2ndPass<RedMaterial>(DiffSpecSSAOTex);
|
||||||
|
renderInstancedMeshes2ndPass<BlueMaterial>(DiffSpecSSAOTex);
|
||||||
renderInstancedMeshes2ndPass<AlphaRef>(DiffSpecSSAOTex);
|
renderInstancedMeshes2ndPass<AlphaRef>(DiffSpecSSAOTex);
|
||||||
renderInstancedMeshes2ndPass<UnlitMat>(DiffSpecSSAOTex);
|
renderInstancedMeshes2ndPass<UnlitMat>(DiffSpecSSAOTex);
|
||||||
renderInstancedMeshes2ndPass<SphereMap>(DiffSpecSSAOTex);
|
renderInstancedMeshes2ndPass<SphereMap>(DiffSpecSSAOTex);
|
||||||
@ -1459,6 +1571,8 @@ void IrrDriver::renderNormalsVisualisation()
|
|||||||
{
|
{
|
||||||
if (CVS->isAZDOEnabled()) {
|
if (CVS->isAZDOEnabled()) {
|
||||||
renderMultiMeshNormals<DefaultMaterial>();
|
renderMultiMeshNormals<DefaultMaterial>();
|
||||||
|
renderMultiMeshNormals<RedMaterial>();
|
||||||
|
renderMultiMeshNormals<BlueMaterial>();
|
||||||
renderMultiMeshNormals<AlphaRef>();
|
renderMultiMeshNormals<AlphaRef>();
|
||||||
renderMultiMeshNormals<UnlitMat>();
|
renderMultiMeshNormals<UnlitMat>();
|
||||||
renderMultiMeshNormals<SphereMap>();
|
renderMultiMeshNormals<SphereMap>();
|
||||||
@ -1468,6 +1582,8 @@ void IrrDriver::renderNormalsVisualisation()
|
|||||||
else if (CVS->supportsIndirectInstancingRendering())
|
else if (CVS->supportsIndirectInstancingRendering())
|
||||||
{
|
{
|
||||||
renderInstancedMeshNormals<DefaultMaterial>();
|
renderInstancedMeshNormals<DefaultMaterial>();
|
||||||
|
renderInstancedMeshNormals<RedMaterial>();
|
||||||
|
renderInstancedMeshNormals<BlueMaterial>();
|
||||||
renderInstancedMeshNormals<AlphaRef>();
|
renderInstancedMeshNormals<AlphaRef>();
|
||||||
renderInstancedMeshNormals<UnlitMat>();
|
renderInstancedMeshNormals<UnlitMat>();
|
||||||
renderInstancedMeshNormals<SphereMap>();
|
renderInstancedMeshNormals<SphereMap>();
|
||||||
@ -1777,6 +1893,8 @@ void IrrDriver::renderShadows()
|
|||||||
ScopedGPUTimer Timer(getGPUTimer(Q_SHADOWS_CASCADE0 + cascade));
|
ScopedGPUTimer Timer(getGPUTimer(Q_SHADOWS_CASCADE0 + cascade));
|
||||||
|
|
||||||
renderShadow<DefaultMaterial, 1>(cascade);
|
renderShadow<DefaultMaterial, 1>(cascade);
|
||||||
|
renderShadow<RedMaterial, 1>(cascade);
|
||||||
|
renderShadow<BlueMaterial, 1>(cascade);
|
||||||
renderShadow<SphereMap, 1>(cascade);
|
renderShadow<SphereMap, 1>(cascade);
|
||||||
renderShadow<DetailMat, 1>(cascade);
|
renderShadow<DetailMat, 1>(cascade);
|
||||||
renderShadow<SplattingMat, 1>(cascade);
|
renderShadow<SplattingMat, 1>(cascade);
|
||||||
@ -1791,6 +1909,8 @@ void IrrDriver::renderShadows()
|
|||||||
if (CVS->isAZDOEnabled())
|
if (CVS->isAZDOEnabled())
|
||||||
{
|
{
|
||||||
multidrawShadow<DefaultMaterial>(cascade);
|
multidrawShadow<DefaultMaterial>(cascade);
|
||||||
|
multidrawShadow<RedMaterial>(cascade);
|
||||||
|
multidrawShadow<BlueMaterial>(cascade);
|
||||||
multidrawShadow<DetailMat>(cascade);
|
multidrawShadow<DetailMat>(cascade);
|
||||||
multidrawShadow<NormalMat>(cascade);
|
multidrawShadow<NormalMat>(cascade);
|
||||||
multidrawShadow<AlphaRef>(cascade);
|
multidrawShadow<AlphaRef>(cascade);
|
||||||
@ -1800,6 +1920,8 @@ void IrrDriver::renderShadows()
|
|||||||
else if (CVS->supportsIndirectInstancingRendering())
|
else if (CVS->supportsIndirectInstancingRendering())
|
||||||
{
|
{
|
||||||
renderInstancedShadow<DefaultMaterial>(cascade);
|
renderInstancedShadow<DefaultMaterial>(cascade);
|
||||||
|
renderInstancedShadow<RedMaterial>(cascade);
|
||||||
|
renderInstancedShadow<BlueMaterial>(cascade);
|
||||||
renderInstancedShadow<DetailMat>(cascade);
|
renderInstancedShadow<DetailMat>(cascade);
|
||||||
renderInstancedShadow<AlphaRef>(cascade);
|
renderInstancedShadow<AlphaRef>(cascade);
|
||||||
renderInstancedShadow<UnlitMat>(cascade);
|
renderInstancedShadow<UnlitMat>(cascade);
|
||||||
@ -1932,6 +2054,8 @@ void IrrDriver::renderRSM()
|
|||||||
|
|
||||||
const core::matrix4 &rsm_matrix = getShadowMatrices()->getRSMMatrix();
|
const core::matrix4 &rsm_matrix = getShadowMatrices()->getRSMMatrix();
|
||||||
drawRSM<DefaultMaterial, 3, 1>(rsm_matrix);
|
drawRSM<DefaultMaterial, 3, 1>(rsm_matrix);
|
||||||
|
drawRSM<RedMaterial, 3, 1>(rsm_matrix);
|
||||||
|
drawRSM<BlueMaterial, 3, 1>(rsm_matrix);
|
||||||
drawRSM<AlphaRef, 3, 1>(rsm_matrix);
|
drawRSM<AlphaRef, 3, 1>(rsm_matrix);
|
||||||
drawRSM<NormalMat, 3, 1>(rsm_matrix);
|
drawRSM<NormalMat, 3, 1>(rsm_matrix);
|
||||||
drawRSM<UnlitMat, 3, 1>(rsm_matrix);
|
drawRSM<UnlitMat, 3, 1>(rsm_matrix);
|
||||||
@ -1945,6 +2069,8 @@ void IrrDriver::renderRSM()
|
|||||||
if (CVS->isAZDOEnabled())
|
if (CVS->isAZDOEnabled())
|
||||||
{
|
{
|
||||||
multidrawRSM<DefaultMaterial>(rsm_matrix);
|
multidrawRSM<DefaultMaterial>(rsm_matrix);
|
||||||
|
multidrawRSM<RedMaterial>(rsm_matrix);
|
||||||
|
multidrawRSM<BlueMaterial>(rsm_matrix);
|
||||||
multidrawRSM<NormalMat>(rsm_matrix);
|
multidrawRSM<NormalMat>(rsm_matrix);
|
||||||
multidrawRSM<AlphaRef>(rsm_matrix);
|
multidrawRSM<AlphaRef>(rsm_matrix);
|
||||||
multidrawRSM<UnlitMat>(rsm_matrix);
|
multidrawRSM<UnlitMat>(rsm_matrix);
|
||||||
@ -1953,6 +2079,8 @@ void IrrDriver::renderRSM()
|
|||||||
else if (CVS->supportsIndirectInstancingRendering())
|
else if (CVS->supportsIndirectInstancingRendering())
|
||||||
{
|
{
|
||||||
renderRSMShadow<DefaultMaterial>(rsm_matrix);
|
renderRSMShadow<DefaultMaterial>(rsm_matrix);
|
||||||
|
renderRSMShadow<RedMaterial>(rsm_matrix);
|
||||||
|
renderRSMShadow<BlueMaterial>(rsm_matrix);
|
||||||
renderRSMShadow<AlphaRef>(rsm_matrix);
|
renderRSMShadow<AlphaRef>(rsm_matrix);
|
||||||
renderRSMShadow<UnlitMat>(rsm_matrix);
|
renderRSMShadow<UnlitMat>(rsm_matrix);
|
||||||
renderRSMShadow<NormalMat>(rsm_matrix);
|
renderRSMShadow<NormalMat>(rsm_matrix);
|
||||||
|
@ -349,6 +349,38 @@ Shaders::ObjectPass2Shader::ObjectPass2Shader()
|
|||||||
4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
} // ObjectPass2Shader
|
} // ObjectPass2Shader
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Solid Lit pass shaders (red version)
|
||||||
|
Shaders::ObjectPass2ShaderRed::ObjectPass2ShaderRed()
|
||||||
|
{
|
||||||
|
loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert",
|
||||||
|
GL_FRAGMENT_SHADER, "utils/getLightFactor.frag",
|
||||||
|
GL_FRAGMENT_SHADER, "utils/rgb_conversion.frag",
|
||||||
|
GL_FRAGMENT_SHADER, "object_pass2_red.frag");
|
||||||
|
assignUniforms("ModelMatrix", "TextureMatrix");
|
||||||
|
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||||
|
1, "SpecularMap", ST_NEAREST_FILTERED,
|
||||||
|
2, "SSAO", ST_BILINEAR_FILTERED,
|
||||||
|
3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
||||||
|
4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
|
} // ObjectPass2ShaderRed
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Solid Lit pass shaders (blue version)
|
||||||
|
Shaders::ObjectPass2ShaderBlue::ObjectPass2ShaderBlue()
|
||||||
|
{
|
||||||
|
loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert",
|
||||||
|
GL_FRAGMENT_SHADER, "utils/getLightFactor.frag",
|
||||||
|
GL_FRAGMENT_SHADER, "utils/rgb_conversion.frag",
|
||||||
|
GL_FRAGMENT_SHADER, "object_pass2_blue.frag");
|
||||||
|
assignUniforms("ModelMatrix", "TextureMatrix");
|
||||||
|
assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED,
|
||||||
|
1, "SpecularMap", ST_NEAREST_FILTERED,
|
||||||
|
2, "SSAO", ST_BILINEAR_FILTERED,
|
||||||
|
3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED,
|
||||||
|
4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||||
|
} // ObjectPass2ShaderBlue
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
Shaders::TransparentShader::TransparentShader()
|
Shaders::TransparentShader::TransparentShader()
|
||||||
{
|
{
|
||||||
|
@ -151,6 +151,22 @@ public:
|
|||||||
}; // ObjectPass2Shader
|
}; // ObjectPass2Shader
|
||||||
|
|
||||||
// ========================================================================
|
// ========================================================================
|
||||||
|
class ObjectPass2ShaderRed : public TextureShader < ObjectPass2ShaderRed, 5,
|
||||||
|
core::matrix4, core::matrix4 >
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ObjectPass2ShaderRed();
|
||||||
|
}; // ObjectPass2ShaderRed
|
||||||
|
|
||||||
|
// ========================================================================
|
||||||
|
class ObjectPass2ShaderBlue : public TextureShader < ObjectPass2ShaderBlue, 5,
|
||||||
|
core::matrix4, core::matrix4 >
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ObjectPass2ShaderBlue();
|
||||||
|
}; // ObjectPass2ShaderBlue
|
||||||
|
|
||||||
|
// ========================================================================
|
||||||
|
|
||||||
|
|
||||||
}; // class Shaders
|
}; // class Shaders
|
||||||
|
@ -130,6 +130,14 @@ void STKAnimatedMesh::updateNoGL()
|
|||||||
{
|
{
|
||||||
TransparentMesh[TM_ADDITIVE].push_back(&mesh);
|
TransparentMesh[TM_ADDITIVE].push_back(&mesh);
|
||||||
}
|
}
|
||||||
|
else if (mb->getRenderType() == video::ERT_RED)
|
||||||
|
{
|
||||||
|
MeshSolidMaterial[Material::SHADERTYPE_SOLID_RED].push_back(&mesh);
|
||||||
|
}
|
||||||
|
else if (mb->getRenderType() == video::ERT_BLUE)
|
||||||
|
{
|
||||||
|
MeshSolidMaterial[Material::SHADERTYPE_SOLID_BLUE].push_back(&mesh);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Material::ShaderType MatType = material->getShaderType();// getMeshMaterialFromType(type, mb->getVertexType(), material);
|
Material::ShaderType MatType = material->getShaderType();// getMeshMaterialFromType(type, mb->getVertexType(), material);
|
||||||
|
@ -122,10 +122,28 @@ class ListMatDefault : public MeshList<ListMatDefault, GLMesh *, core::matrix4,
|
|||||||
core::matrix4, core::matrix4>
|
core::matrix4, core::matrix4>
|
||||||
{};
|
{};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
class ListMatRed : public MeshList<ListMatRed, GLMesh *, core::matrix4,
|
||||||
|
core::matrix4, core::matrix4>
|
||||||
|
{};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
class ListMatBlue : public MeshList<ListMatBlue, GLMesh *, core::matrix4,
|
||||||
|
core::matrix4, core::matrix4>
|
||||||
|
{};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
class ListInstancedMatDefault : public InstancedMeshList<ListInstancedMatDefault>
|
class ListInstancedMatDefault : public InstancedMeshList<ListInstancedMatDefault>
|
||||||
{};
|
{};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
class ListInstancedMatRed : public InstancedMeshList<ListInstancedMatRed>
|
||||||
|
{};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
class ListInstancedMatBlue : public InstancedMeshList<ListInstancedMatBlue>
|
||||||
|
{};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
class ListMatAlphaRef : public MeshList<ListMatAlphaRef, GLMesh *, core::matrix4,
|
class ListMatAlphaRef : public MeshList<ListMatAlphaRef, GLMesh *, core::matrix4,
|
||||||
core::matrix4, core::matrix4>
|
core::matrix4, core::matrix4>
|
||||||
|
@ -188,6 +188,16 @@ void STKMeshSceneNode::updateNoGL()
|
|||||||
else
|
else
|
||||||
additive = (TranspMat == TM_ADDITIVE);
|
additive = (TranspMat == TM_ADDITIVE);
|
||||||
}
|
}
|
||||||
|
else if (mb->getRenderType() == video::ERT_RED)
|
||||||
|
{
|
||||||
|
if (!immediate_draw)
|
||||||
|
MeshSolidMaterial[Material::SHADERTYPE_SOLID_RED].push_back(&mesh);
|
||||||
|
}
|
||||||
|
else if (mb->getRenderType() == video::ERT_BLUE)
|
||||||
|
{
|
||||||
|
if (!immediate_draw)
|
||||||
|
MeshSolidMaterial[Material::SHADERTYPE_SOLID_BLUE].push_back(&mesh);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
assert(!isDisplacement);
|
assert(!isDisplacement);
|
||||||
|
@ -331,6 +331,12 @@ handleSTKCommon(scene::ISceneNode *Node, std::vector<scene::ISceneNode *> *Immed
|
|||||||
case Material::SHADERTYPE_SOLID:
|
case Material::SHADERTYPE_SOLID:
|
||||||
ListMatDefault::getInstance()->SolidPass.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
ListMatDefault::getInstance()->SolidPass.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
break;
|
break;
|
||||||
|
case Material::SHADERTYPE_SOLID_RED:
|
||||||
|
ListMatRed::getInstance()->SolidPass.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
|
break;
|
||||||
|
case Material::SHADERTYPE_SOLID_BLUE:
|
||||||
|
ListMatBlue::getInstance()->SolidPass.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
|
break;
|
||||||
case Material::SHADERTYPE_ALPHA_TEST:
|
case Material::SHADERTYPE_ALPHA_TEST:
|
||||||
ListMatAlphaRef::getInstance()->SolidPass.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
ListMatAlphaRef::getInstance()->SolidPass.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
break;
|
break;
|
||||||
@ -356,6 +362,12 @@ handleSTKCommon(scene::ISceneNode *Node, std::vector<scene::ISceneNode *> *Immed
|
|||||||
case Material::SHADERTYPE_SOLID:
|
case Material::SHADERTYPE_SOLID:
|
||||||
ListMatDefault::getInstance()->SolidPass.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
ListMatDefault::getInstance()->SolidPass.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
break;
|
break;
|
||||||
|
case Material::SHADERTYPE_SOLID_RED:
|
||||||
|
ListMatRed::getInstance()->SolidPass.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
|
break;
|
||||||
|
case Material::SHADERTYPE_SOLID_BLUE:
|
||||||
|
ListMatBlue::getInstance()->SolidPass.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
|
break;
|
||||||
case Material::SHADERTYPE_ALPHA_TEST:
|
case Material::SHADERTYPE_ALPHA_TEST:
|
||||||
ListMatAlphaRef::getInstance()->SolidPass.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
ListMatAlphaRef::getInstance()->SolidPass.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
break;
|
break;
|
||||||
@ -416,6 +428,12 @@ handleSTKCommon(scene::ISceneNode *Node, std::vector<scene::ISceneNode *> *Immed
|
|||||||
case Material::SHADERTYPE_SOLID:
|
case Material::SHADERTYPE_SOLID:
|
||||||
ListMatDefault::getInstance()->Shadows[cascade].emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
ListMatDefault::getInstance()->Shadows[cascade].emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
break;
|
break;
|
||||||
|
case Material::SHADERTYPE_SOLID_RED:
|
||||||
|
ListMatRed::getInstance()->Shadows[cascade].emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
|
break;
|
||||||
|
case Material::SHADERTYPE_SOLID_BLUE:
|
||||||
|
ListMatBlue::getInstance()->Shadows[cascade].emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
|
break;
|
||||||
case Material::SHADERTYPE_ALPHA_TEST:
|
case Material::SHADERTYPE_ALPHA_TEST:
|
||||||
ListMatAlphaRef::getInstance()->Shadows[cascade].emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
ListMatAlphaRef::getInstance()->Shadows[cascade].emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
break;
|
break;
|
||||||
@ -475,6 +493,12 @@ handleSTKCommon(scene::ISceneNode *Node, std::vector<scene::ISceneNode *> *Immed
|
|||||||
case Material::SHADERTYPE_SOLID:
|
case Material::SHADERTYPE_SOLID:
|
||||||
ListMatDefault::getInstance()->RSM.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
ListMatDefault::getInstance()->RSM.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
break;
|
break;
|
||||||
|
case Material::SHADERTYPE_SOLID_RED:
|
||||||
|
ListMatRed::getInstance()->RSM.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
|
break;
|
||||||
|
case Material::SHADERTYPE_SOLID_BLUE:
|
||||||
|
ListMatBlue::getInstance()->RSM.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
|
break;
|
||||||
case Material::SHADERTYPE_ALPHA_TEST:
|
case Material::SHADERTYPE_ALPHA_TEST:
|
||||||
ListMatAlphaRef::getInstance()->RSM.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
ListMatAlphaRef::getInstance()->RSM.emplace_back(mesh, ModelMatrix, InvModelMatrix, mesh->TextureMatrix);
|
||||||
break;
|
break;
|
||||||
@ -573,6 +597,8 @@ void IrrDriver::PrepareDrawCalls(scene::ICameraSceneNode *camnode)
|
|||||||
ListDisplacement::getInstance()->clear();
|
ListDisplacement::getInstance()->clear();
|
||||||
|
|
||||||
ListMatDefault::getInstance()->clear();
|
ListMatDefault::getInstance()->clear();
|
||||||
|
ListMatRed::getInstance()->clear();
|
||||||
|
ListMatBlue::getInstance()->clear();
|
||||||
ListMatAlphaRef::getInstance()->clear();
|
ListMatAlphaRef::getInstance()->clear();
|
||||||
ListMatSphereMap::getInstance()->clear();
|
ListMatSphereMap::getInstance()->clear();
|
||||||
ListMatDetails::getInstance()->clear();
|
ListMatDetails::getInstance()->clear();
|
||||||
@ -674,6 +700,8 @@ PROFILER_POP_CPU_MARKER();
|
|||||||
enableOpenMP = 0;
|
enableOpenMP = 0;
|
||||||
|
|
||||||
ListInstancedMatDefault::getInstance()->clear();
|
ListInstancedMatDefault::getInstance()->clear();
|
||||||
|
ListInstancedMatRed::getInstance()->clear();
|
||||||
|
ListInstancedMatBlue::getInstance()->clear();
|
||||||
ListInstancedMatAlphaRef::getInstance()->clear();
|
ListInstancedMatAlphaRef::getInstance()->clear();
|
||||||
ListInstancedMatGrass::getInstance()->clear();
|
ListInstancedMatGrass::getInstance()->clear();
|
||||||
ListInstancedMatNormalMap::getInstance()->clear();
|
ListInstancedMatNormalMap::getInstance()->clear();
|
||||||
@ -703,6 +731,14 @@ PROFILER_POP_CPU_MARKER();
|
|||||||
SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SOLID] = current_cmd;
|
SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SOLID] = current_cmd;
|
||||||
FillInstances(MeshForSolidPass[Material::SHADERTYPE_SOLID], ListInstancedMatDefault::getInstance()->SolidPass, InstanceBufferDualTex, CmdBuffer, offset, current_cmd, SolidPoly);
|
FillInstances(MeshForSolidPass[Material::SHADERTYPE_SOLID], ListInstancedMatDefault::getInstance()->SolidPass, InstanceBufferDualTex, CmdBuffer, offset, current_cmd, SolidPoly);
|
||||||
SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_SOLID] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SOLID];
|
SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_SOLID] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SOLID];
|
||||||
|
// Red Material
|
||||||
|
SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SOLID_RED] = current_cmd;
|
||||||
|
FillInstances(MeshForSolidPass[Material::SHADERTYPE_SOLID_RED], ListInstancedMatRed::getInstance()->SolidPass, InstanceBufferDualTex, CmdBuffer, offset, current_cmd, SolidPoly);
|
||||||
|
SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_SOLID_RED] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SOLID_RED];
|
||||||
|
// Blue Material
|
||||||
|
SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SOLID_BLUE] = current_cmd;
|
||||||
|
FillInstances(MeshForSolidPass[Material::SHADERTYPE_SOLID_BLUE], ListInstancedMatBlue::getInstance()->SolidPass, InstanceBufferDualTex, CmdBuffer, offset, current_cmd, SolidPoly);
|
||||||
|
SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_SOLID_BLUE] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SOLID_BLUE];
|
||||||
// Alpha Ref
|
// Alpha Ref
|
||||||
SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_ALPHA_TEST] = current_cmd;
|
SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_ALPHA_TEST] = current_cmd;
|
||||||
FillInstances(MeshForSolidPass[Material::SHADERTYPE_ALPHA_TEST], ListInstancedMatAlphaRef::getInstance()->SolidPass, InstanceBufferDualTex, CmdBuffer, offset, current_cmd, SolidPoly);
|
FillInstances(MeshForSolidPass[Material::SHADERTYPE_ALPHA_TEST], ListInstancedMatAlphaRef::getInstance()->SolidPass, InstanceBufferDualTex, CmdBuffer, offset, current_cmd, SolidPoly);
|
||||||
|
@ -27,6 +27,8 @@
|
|||||||
#include "graphics/central_settings.hpp"
|
#include "graphics/central_settings.hpp"
|
||||||
#include "graphics/irr_driver.hpp"
|
#include "graphics/irr_driver.hpp"
|
||||||
#include "graphics/lod_node.hpp"
|
#include "graphics/lod_node.hpp"
|
||||||
|
#include "graphics/material.hpp"
|
||||||
|
#include "graphics/material_manager.hpp"
|
||||||
#include "graphics/mesh_tools.hpp"
|
#include "graphics/mesh_tools.hpp"
|
||||||
#include "io/file_manager.hpp"
|
#include "io/file_manager.hpp"
|
||||||
#include "io/xml_node.hpp"
|
#include "io/xml_node.hpp"
|
||||||
@ -309,7 +311,8 @@ KartModel* KartModel::makeCopy(video::E_RENDER_TYPE rt)
|
|||||||
km->m_kart_height = m_kart_height;
|
km->m_kart_height = m_kart_height;
|
||||||
km->m_kart_highest_point= m_kart_highest_point;
|
km->m_kart_highest_point= m_kart_highest_point;
|
||||||
km->m_kart_lowest_point = m_kart_lowest_point;
|
km->m_kart_lowest_point = m_kart_lowest_point;
|
||||||
km->m_mesh = irr_driver->copyAnimatedMesh(m_mesh, rt);
|
km->m_mesh = irr_driver->copyAnimatedMesh
|
||||||
|
(m_mesh, rt, getColorizableParts(m_mesh));
|
||||||
km->m_model_filename = m_model_filename;
|
km->m_model_filename = m_model_filename;
|
||||||
km->m_animation_speed = m_animation_speed;
|
km->m_animation_speed = m_animation_speed;
|
||||||
km->m_current_animation = AF_DEFAULT;
|
km->m_current_animation = AF_DEFAULT;
|
||||||
@ -982,6 +985,7 @@ void KartModel::update(float dt, float distance, float steer, float speed,
|
|||||||
|
|
||||||
m_animated_node->setCurrentFrame(frame);
|
m_animated_node->setCurrentFrame(frame);
|
||||||
} // update
|
} // update
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void KartModel::attachHat()
|
void KartModel::attachHat()
|
||||||
{
|
{
|
||||||
@ -1016,4 +1020,19 @@ void KartModel::attachHat()
|
|||||||
m_hat_node->setRotation(inv.getRotationDegrees());
|
m_hat_node->setRotation(inv.getRotationDegrees());
|
||||||
} // if bone
|
} // if bone
|
||||||
} // if(m_hat_name)
|
} // if(m_hat_name)
|
||||||
}
|
} // attachHat
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
std::vector<int> KartModel::getColorizableParts(scene::IAnimatedMesh* m)
|
||||||
|
{
|
||||||
|
std::vector<int> colorizable_parts;
|
||||||
|
for (int i = 0; i < int(m->getMeshBufferCount()); ++i)
|
||||||
|
{
|
||||||
|
scene::IMeshBuffer* mb = m->getMeshBuffer(i);
|
||||||
|
Material* material = material_manager->getMaterialFor(mb
|
||||||
|
->getMaterial().getTexture(0), mb);
|
||||||
|
if (material->isColorizable())
|
||||||
|
colorizable_parts.push_back(i);
|
||||||
|
}
|
||||||
|
return colorizable_parts;
|
||||||
|
} // getColorizableParts
|
||||||
|
@ -328,6 +328,8 @@ public:
|
|||||||
scene::IAnimatedMeshSceneNode* getAnimatedNode(){ return m_animated_node; }
|
scene::IAnimatedMeshSceneNode* getAnimatedNode(){ return m_animated_node; }
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
core::vector3df getHatOffset() { return m_hat_offset; }
|
core::vector3df getHatOffset() { return m_hat_offset; }
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
std::vector<int> getColorizableParts(scene::IAnimatedMesh* m);
|
||||||
|
|
||||||
}; // KartModel
|
}; // KartModel
|
||||||
#endif
|
#endif
|
||||||
|
@ -388,9 +388,9 @@ AbstractKart *SoccerWorld::createKart(const std::string &kart_ident, int index,
|
|||||||
m_kart_position_map[index] = (unsigned)(pos_index - 1);
|
m_kart_position_map[index] = (unsigned)(pos_index - 1);
|
||||||
|
|
||||||
AbstractKart *new_kart = new Kart(kart_ident, index, position, init_pos,
|
AbstractKart *new_kart = new Kart(kart_ident, index, position, init_pos,
|
||||||
difficulty);
|
//difficulty);
|
||||||
//difficulty, team == SOCCER_TEAM_BLUE ?
|
difficulty, team == SOCCER_TEAM_BLUE ?
|
||||||
//video::ERT_BLUE : video::ERT_RED);
|
video::ERT_BLUE : video::ERT_RED);
|
||||||
new_kart->init(race_manager->getKartType(index));
|
new_kart->init(race_manager->getKartType(index));
|
||||||
Controller *controller = NULL;
|
Controller *controller = NULL;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user