Merge remote-tracking branch 'upstream/master' into walldriving
This commit is contained in:
@@ -29,7 +29,7 @@ else()
|
||||
endif()
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
option(USE_XRANDR "Use xrandr instead of vidmode" OFF)
|
||||
option(USE_XRANDR "Use xrandr instead of vidmode" ON)
|
||||
endif()
|
||||
|
||||
set(STK_SOURCE_DIR "src")
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
uniform sampler2D DiffuseMap;
|
||||
uniform sampler2D SpecularMap;
|
||||
uniform sampler2D SSAO;
|
||||
uniform vec3 ambient;
|
||||
|
||||
#ifdef UBO_DISABLED
|
||||
uniform mat4 ViewMatrix;
|
||||
uniform mat4 ProjectionMatrix;
|
||||
uniform mat4 InverseViewMatrix;
|
||||
uniform mat4 InverseProjectionMatrix;
|
||||
uniform vec2 screen;
|
||||
#else
|
||||
layout (std140) uniform MatrixesData
|
||||
{
|
||||
mat4 ViewMatrix;
|
||||
@@ -12,6 +18,7 @@ layout (std140) uniform MatrixesData
|
||||
mat4 ShadowViewProjMatrixes[4];
|
||||
vec2 screen;
|
||||
};
|
||||
#endif
|
||||
|
||||
vec3 getLightFactor(float specMapValue)
|
||||
{
|
||||
@@ -19,6 +26,6 @@ vec3 getLightFactor(float specMapValue)
|
||||
vec3 DiffuseComponent = texture(DiffuseMap, tc).xyz;
|
||||
vec3 SpecularComponent = texture(SpecularMap, tc).xyz;
|
||||
float ao = texture(SSAO, tc).x;
|
||||
vec3 tmp = ao * ambient + DiffuseComponent + SpecularComponent * specMapValue;
|
||||
vec3 tmp = DiffuseComponent + SpecularComponent * specMapValue;
|
||||
return tmp * ao;
|
||||
}
|
||||
@@ -49,6 +49,9 @@
|
||||
|
||||
#endif // _IRR_COMPILE_WITH_JOYSTICK_EVENTS_
|
||||
|
||||
#define XRANDR_ROTATION_LEFT (1 << 1)
|
||||
#define XRANDR_ROTATION_RIGHT (1 << 3)
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
@@ -346,8 +349,20 @@ bool CIrrDeviceLinux::switchToFullscreen(bool reset)
|
||||
for (int i = 0; i < res->nmode; i++)
|
||||
{
|
||||
const XRRModeInfo* mode = &res->modes[i];
|
||||
unsigned int w, h;
|
||||
|
||||
if (crtc->rotation & (XRANDR_ROTATION_LEFT|XRANDR_ROTATION_RIGHT))
|
||||
{
|
||||
w = mode->height;
|
||||
h = mode->width;
|
||||
}
|
||||
else
|
||||
{
|
||||
w = mode->width;
|
||||
h = mode->height;
|
||||
}
|
||||
|
||||
if (bestMode == -1 && mode->width == Width && mode->height == Height)
|
||||
if (bestMode == -1 && w == Width && h == Height)
|
||||
{
|
||||
for (int j = 0; j < output->nmode; j++)
|
||||
{
|
||||
@@ -359,7 +374,7 @@ bool CIrrDeviceLinux::switchToFullscreen(bool reset)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bestMode != -1 && mode->width == Width && mode->height == Height)
|
||||
else if (bestMode != -1 && w == Width && h == Height)
|
||||
{
|
||||
refresh_rate_new = (mode->dotClock * 1000.0) / (mode->hTotal * mode->vTotal);
|
||||
|
||||
@@ -826,6 +841,17 @@ bool CIrrDeviceLinux::createWindow()
|
||||
{
|
||||
if (netWM)
|
||||
{
|
||||
// Some window managers don't respect values from XCreateWindow and
|
||||
// place window in random position. This may cause that fullscreen
|
||||
// window is showed in wrong screen. It doesn't matter for vidmode
|
||||
// which displays cloned image in all devices.
|
||||
#ifdef _IRR_LINUX_X11_RANDR_
|
||||
XResizeWindow(display, window, Width, Height);
|
||||
XMoveWindow(display, window, crtc_x, crtc_y);
|
||||
XRaiseWindow(display, window);
|
||||
XFlush(display);
|
||||
#endif
|
||||
|
||||
// Workaround for Gnome which sometimes creates window smaller than display
|
||||
XSizeHints *hints = XAllocSizeHints();
|
||||
hints->flags=PMinSize;
|
||||
@@ -839,7 +865,8 @@ bool CIrrDeviceLinux::createWindow()
|
||||
Atom WMStateAtom = XInternAtom(display, "_NET_WM_STATE", true);
|
||||
Atom WMFullscreenAtom = XInternAtom(display, "_NET_WM_STATE_FULLSCREEN", true);
|
||||
// Set the fullscreen property
|
||||
XChangeProperty(display, window, WMStateAtom, XA_ATOM, 32, PropModeReplace, reinterpret_cast<unsigned char *>(& WMFullscreenAtom), 1);
|
||||
XChangeProperty(display, window, WMStateAtom, XA_ATOM, 32, PropModeReplace,
|
||||
reinterpret_cast<unsigned char*>(&WMFullscreenAtom), 1);
|
||||
|
||||
// Notify the root window
|
||||
XEvent xev = {0}; // The event should be filled with zeros before setting its attributes
|
||||
@@ -850,7 +877,10 @@ bool CIrrDeviceLinux::createWindow()
|
||||
xev.xclient.format = 32;
|
||||
xev.xclient.data.l[0] = 1;
|
||||
xev.xclient.data.l[1] = WMFullscreenAtom;
|
||||
XSendEvent(display, DefaultRootWindow(display), false, SubstructureRedirectMask | SubstructureNotifyMask, &xev);
|
||||
XSendEvent(display, RootWindow(display, visual->screen), false,
|
||||
SubstructureRedirectMask | SubstructureNotifyMask, &xev);
|
||||
|
||||
XFlush(display);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1557,10 +1587,11 @@ video::IVideoModeList* CIrrDeviceLinux::getVideoModeList()
|
||||
XRRScreenResources* res = XRRGetScreenResources(display, DefaultRootWindow(display));
|
||||
|
||||
if (!res)
|
||||
return NULL;
|
||||
return &VideoModeList;
|
||||
|
||||
XRROutputInfo *output = NULL;
|
||||
XRRCrtcInfo* crtc = NULL;
|
||||
crtc_x = crtc_y = -1;
|
||||
|
||||
for (int i = 0; i < res->noutput; i++)
|
||||
{
|
||||
@@ -1574,35 +1605,63 @@ video::IVideoModeList* CIrrDeviceLinux::getVideoModeList()
|
||||
|
||||
crtc = XRRGetCrtcInfo(display, res, output->crtc);
|
||||
|
||||
if (!crtc || crtc->x != 0 || crtc->y != 0)
|
||||
if (!crtc)
|
||||
{
|
||||
XRRFreeCrtcInfo(crtc);
|
||||
XRRFreeOutputInfo(output);
|
||||
continue;
|
||||
}
|
||||
|
||||
output_id = res->outputs[i];
|
||||
break;
|
||||
|
||||
if (crtc_x == -1 || crtc->x < crtc_x)
|
||||
{
|
||||
crtc_x = crtc->x;
|
||||
crtc_y = crtc->y;
|
||||
output_id = res->outputs[i];
|
||||
}
|
||||
else if (crtc_x == crtc->x && crtc->y < crtc_y)
|
||||
{
|
||||
crtc_x = crtc->x;
|
||||
crtc_y = crtc->y;
|
||||
output_id = res->outputs[i];
|
||||
}
|
||||
|
||||
XRRFreeCrtcInfo(crtc);
|
||||
XRRFreeOutputInfo(output);
|
||||
}
|
||||
|
||||
output = XRRGetOutputInfo(display, res, output_id);
|
||||
crtc = XRRGetCrtcInfo(display, res, output->crtc);
|
||||
|
||||
if (crtc == NULL)
|
||||
{
|
||||
XRRFreeCrtcInfo(crtc);
|
||||
XRRFreeOutputInfo(output);
|
||||
XRRFreeScreenResources(res);
|
||||
return NULL;
|
||||
return &VideoModeList;
|
||||
}
|
||||
|
||||
for (int i = 0; i < res->nmode; i++)
|
||||
{
|
||||
const XRRModeInfo* mode = &res->modes[i];
|
||||
unsigned int w, h;
|
||||
|
||||
if (crtc->rotation & (XRANDR_ROTATION_LEFT|XRANDR_ROTATION_RIGHT))
|
||||
{
|
||||
w = mode->height;
|
||||
h = mode->width;
|
||||
}
|
||||
else
|
||||
{
|
||||
w = mode->width;
|
||||
h = mode->height;
|
||||
}
|
||||
|
||||
for (int j = 0; j < output->nmode; j++)
|
||||
{
|
||||
{
|
||||
if (mode->id == output->modes[j])
|
||||
{
|
||||
VideoModeList.addMode(core::dimension2d<u32>(
|
||||
mode->width, mode->height), defaultDepth);
|
||||
w, h), defaultDepth);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1611,7 +1670,7 @@ video::IVideoModeList* CIrrDeviceLinux::getVideoModeList()
|
||||
{
|
||||
old_mode = crtc->mode;
|
||||
VideoModeList.setDesktop(defaultDepth,
|
||||
core::dimension2d<u32>(mode->width, mode->height));
|
||||
core::dimension2d<u32>(w, h));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -396,6 +396,8 @@ namespace irr
|
||||
#ifdef _IRR_LINUX_X11_RANDR_
|
||||
RROutput output_id;
|
||||
RRMode old_mode;
|
||||
int crtc_x;
|
||||
int crtc_y;
|
||||
#endif
|
||||
#ifdef _IRR_COMPILE_WITH_OPENGL_
|
||||
GLXWindow glxWin;
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#define HEADER_LIGHT_HPP
|
||||
|
||||
#include <ISceneNode.h>
|
||||
#include <utils/cpp2011.h>
|
||||
#include <utils/cpp2011.hpp>
|
||||
#include <vector>
|
||||
|
||||
using namespace irr;
|
||||
|
||||
@@ -141,6 +141,9 @@ void IrrDriver::renderGLSL(float dt)
|
||||
|
||||
const core::recti &viewport = camera->getViewport();
|
||||
|
||||
if (World::getWorld() && World::getWorld()->getTrack()->hasShadows() && !SphericalHarmonicsTextures.empty())
|
||||
irr_driver->getSceneManager()->setAmbientLight(SColor(0, 0, 0, 0));
|
||||
|
||||
unsigned plc = UpdateLightsInfo(camnode, dt);
|
||||
computeCameraMatrix(camnode, viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X, viewport.LowerRightCorner.Y - viewport.UpperLeftCorner.Y);
|
||||
renderScene(camnode, plc, glows, dt, track->hasShadows(), false);
|
||||
|
||||
@@ -292,24 +292,24 @@ void IrrDriver::renderSolidSecondPass()
|
||||
|
||||
m_scene_manager->drawAll(scene::ESNRP_SOLID);
|
||||
|
||||
renderMeshes2ndPass<MeshShader::ObjectPass2Shader, video::EVT_STANDARD, 4, 3, 1>(TexUnits(
|
||||
renderMeshes2ndPass<MeshShader::ObjectPass2Shader, video::EVT_STANDARD, 3, 1>(TexUnits(
|
||||
TexUnit(MeshShader::ObjectPass2Shader::getInstance()->TU_Albedo, true)
|
||||
), ListMatDefault::Arguments);
|
||||
|
||||
renderMeshes2ndPass<MeshShader::ObjectRefPass2Shader, video::EVT_STANDARD, 4, 3, 1 >(TexUnits(
|
||||
renderMeshes2ndPass<MeshShader::ObjectRefPass2Shader, video::EVT_STANDARD, 3, 1 >(TexUnits(
|
||||
TexUnit(MeshShader::ObjectRefPass2Shader::getInstance()->TU_Albedo, true)
|
||||
), ListMatAlphaRef::Arguments);
|
||||
|
||||
renderMeshes2ndPass<MeshShader::SphereMapShader, video::EVT_STANDARD, 4, 2, 1>(TexUnits(
|
||||
renderMeshes2ndPass<MeshShader::SphereMapShader, video::EVT_STANDARD, 2, 1>(TexUnits(
|
||||
TexUnit(MeshShader::SphereMapShader::getInstance()->TU_tex, true)
|
||||
), ListMatSphereMap::Arguments);
|
||||
|
||||
renderMeshes2ndPass<MeshShader::DetailledObjectPass2Shader, video::EVT_2TCOORDS, 4, 1>(TexUnits(
|
||||
renderMeshes2ndPass<MeshShader::DetailledObjectPass2Shader, video::EVT_2TCOORDS, 1>(TexUnits(
|
||||
TexUnit(MeshShader::DetailledObjectPass2Shader::getInstance()->TU_Albedo, true),
|
||||
TexUnit(MeshShader::DetailledObjectPass2Shader::getInstance()->TU_detail, true)
|
||||
), ListMatDetails::Arguments);
|
||||
|
||||
renderMeshes2ndPass<MeshShader::GrassPass2Shader, video::EVT_STANDARD, 4, 3, 1>(TexUnits(
|
||||
renderMeshes2ndPass<MeshShader::GrassPass2Shader, video::EVT_STANDARD, 3, 1>(TexUnits(
|
||||
TexUnit(MeshShader::GrassPass2Shader::getInstance()->TU_Albedo, true)
|
||||
), ListMatGrass::Arguments);
|
||||
|
||||
@@ -317,7 +317,7 @@ void IrrDriver::renderSolidSecondPass()
|
||||
TexUnit(MeshShader::ObjectUnlitShader::getInstance()->TU_tex, true)
|
||||
), ListMatUnlit::Arguments);
|
||||
|
||||
renderMeshes2ndPass<MeshShader::SplattingShader, video::EVT_2TCOORDS, 3, 1>(TexUnits(
|
||||
renderMeshes2ndPass<MeshShader::SplattingShader, video::EVT_2TCOORDS, 1>(TexUnits(
|
||||
TexUnit(8, true),
|
||||
TexUnit(MeshShader::SplattingShader::getInstance()->TU_tex_layout, false),
|
||||
TexUnit(MeshShader::SplattingShader::getInstance()->TU_tex_detail0, true),
|
||||
@@ -326,7 +326,7 @@ void IrrDriver::renderSolidSecondPass()
|
||||
TexUnit(MeshShader::SplattingShader::getInstance()->TU_tex_detail3, true)
|
||||
), ListMatSplatting::Arguments);
|
||||
|
||||
renderMeshes2ndPass<MeshShader::ObjectPass2Shader, video::EVT_TANGENTS, 4, 3, 1>(TexUnits(
|
||||
renderMeshes2ndPass<MeshShader::ObjectPass2Shader, video::EVT_TANGENTS, 3, 1>(TexUnits(
|
||||
TexUnit(MeshShader::ObjectPass2Shader::getInstance()->TU_Albedo, true)
|
||||
), ListMatNormalMap::Arguments);
|
||||
}
|
||||
|
||||
@@ -168,9 +168,6 @@ void IrrDriver::renderLights(unsigned pointlightcount)
|
||||
}
|
||||
m_rtts->getFBO(FBO_COMBINED_TMP1_TMP2).Bind();
|
||||
|
||||
if (World::getWorld() && World::getWorld()->getTrack()->hasShadows() && SkyboxCubeMap)
|
||||
irr_driver->getSceneManager()->setAmbientLight(SColor(0, 0, 0, 0));
|
||||
|
||||
// Render sunlight if and only if track supports shadow
|
||||
if (!World::getWorld() || World::getWorld()->getTrack()->hasShadows())
|
||||
{
|
||||
|
||||
@@ -38,11 +38,27 @@
|
||||
\subsection shader_declaration_compile Compile the shader
|
||||
|
||||
The LoadProgram() function is provided to ease shader compilation and link.
|
||||
It takes a flat sequence of SHADER_TYPE, filename pairs that will be linked together.
|
||||
This way you can add any shader stage you want (geometry, domain/hull shader)
|
||||
|
||||
It is highly recommended to use explicit attribute location for a program input.
|
||||
However as not all hardware support this extension, default location are provided for
|
||||
input whose name is either Position (location 0) or Normal (location 1) or
|
||||
Texcoord (location 3) or Color (location 2) or SecondTexcoord (location 4).
|
||||
You can use these predefined name and location in your vao for shader
|
||||
that needs GL pre 3.3 support.
|
||||
|
||||
\subsection shader_declaration_uniform_names Declare uniforms
|
||||
|
||||
Use the AssignUniforms() function to pass name of the uniforms in the program.
|
||||
The order of name declaration is the same as the argument passed to setUniforms function.
|
||||
|
||||
\subsection shader_declaration_bind_texture_unit Bind texture unit and name
|
||||
|
||||
Texture are optional but if you have one, you must give them determined texture unit (up to 32).
|
||||
You can do this using the AssignTextureUnit function that takes pair of texture unit and sampler name
|
||||
as argument.
|
||||
|
||||
\section shader_usage
|
||||
|
||||
Shader's class are singleton that can be retrieved using ShaderClassName::getInstance() which automatically
|
||||
@@ -389,12 +405,6 @@ void Shaders::loadShaders()
|
||||
FullScreenShader::MLAABlendWeightSHader::init();
|
||||
FullScreenShader::MLAAGatherSHader::init();
|
||||
MeshShader::ColorizeShader::init();
|
||||
MeshShader::InstancedObjectPass1ShaderInstance = new MeshShader::InstancedObjectPass1Shader();
|
||||
MeshShader::InstancedObjectRefPass1ShaderInstance = new MeshShader::InstancedObjectRefPass1Shader();
|
||||
MeshShader::InstancedGrassPass1ShaderInstance = new MeshShader::InstancedGrassPass1Shader();
|
||||
MeshShader::InstancedObjectPass2ShaderInstance = new MeshShader::InstancedObjectPass2Shader();
|
||||
MeshShader::InstancedObjectRefPass2ShaderInstance = new MeshShader::InstancedObjectRefPass2Shader();
|
||||
MeshShader::InstancedGrassPass2ShaderInstance = new MeshShader::InstancedGrassPass2Shader();
|
||||
MeshShader::BubbleShader::init();
|
||||
MeshShader::BillboardShader::init();
|
||||
LightShader::PointLightShader::init();
|
||||
@@ -666,8 +676,6 @@ namespace MeshShader
|
||||
}
|
||||
}
|
||||
|
||||
InstancedObjectPass1Shader *InstancedObjectPass1ShaderInstance;
|
||||
|
||||
InstancedObjectRefPass1Shader::InstancedObjectRefPass1Shader()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
@@ -684,8 +692,6 @@ namespace MeshShader
|
||||
}
|
||||
}
|
||||
|
||||
InstancedObjectRefPass1Shader *InstancedObjectRefPass1ShaderInstance;
|
||||
|
||||
InstancedGrassPass1Shader::InstancedGrassPass1Shader()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
@@ -703,8 +709,6 @@ namespace MeshShader
|
||||
}
|
||||
}
|
||||
|
||||
InstancedGrassPass1Shader *InstancedGrassPass1ShaderInstance;
|
||||
|
||||
// Solid Lit pass shaders
|
||||
ObjectPass2Shader::ObjectPass2Shader()
|
||||
{
|
||||
@@ -728,8 +732,6 @@ namespace MeshShader
|
||||
);
|
||||
}
|
||||
|
||||
ObjectPass2Shader *ObjectPass2ShaderInstance;
|
||||
|
||||
InstancedObjectPass2Shader::InstancedObjectPass2Shader()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
@@ -754,8 +756,6 @@ namespace MeshShader
|
||||
}
|
||||
}
|
||||
|
||||
InstancedObjectPass2Shader *InstancedObjectPass2ShaderInstance;
|
||||
|
||||
InstancedObjectRefPass2Shader::InstancedObjectRefPass2Shader()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
@@ -777,8 +777,6 @@ namespace MeshShader
|
||||
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
|
||||
}
|
||||
|
||||
InstancedObjectRefPass2Shader *InstancedObjectRefPass2ShaderInstance;
|
||||
|
||||
DetailledObjectPass2Shader::DetailledObjectPass2Shader()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
@@ -800,8 +798,6 @@ namespace MeshShader
|
||||
);
|
||||
}
|
||||
|
||||
DetailledObjectPass2Shader *DetailledObjectPass2ShaderInstance;
|
||||
|
||||
ObjectUnlitShader::ObjectUnlitShader()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
@@ -818,8 +814,6 @@ namespace MeshShader
|
||||
AssignTextureUnit(Program, TexUnit(TU_tex, "tex"));
|
||||
}
|
||||
|
||||
ObjectUnlitShader *ObjectUnlitShaderInstance;
|
||||
|
||||
ObjectRefPass2Shader::ObjectRefPass2Shader()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
@@ -842,8 +836,6 @@ namespace MeshShader
|
||||
);
|
||||
}
|
||||
|
||||
ObjectRefPass2Shader *ObjectRefPass2ShaderInstance;
|
||||
|
||||
GrassPass2Shader::GrassPass2Shader()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
@@ -861,8 +853,6 @@ namespace MeshShader
|
||||
);
|
||||
}
|
||||
|
||||
GrassPass2Shader *GrassPass2ShaderInstance;
|
||||
|
||||
InstancedGrassPass2Shader::InstancedGrassPass2Shader()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
@@ -886,8 +876,6 @@ namespace MeshShader
|
||||
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
|
||||
}
|
||||
|
||||
InstancedGrassPass2Shader *InstancedGrassPass2ShaderInstance;
|
||||
|
||||
SphereMapShader::SphereMapShader()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
@@ -911,8 +899,6 @@ namespace MeshShader
|
||||
);
|
||||
}
|
||||
|
||||
SphereMapShader *SphereMapShaderInstance;
|
||||
|
||||
SplattingShader::SplattingShader()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
@@ -937,8 +923,6 @@ namespace MeshShader
|
||||
);
|
||||
}
|
||||
|
||||
SplattingShader *SplattingShaderInstance;
|
||||
|
||||
GLuint BubbleShader::Program;
|
||||
GLuint BubbleShader::uniform_MVP;
|
||||
GLuint BubbleShader::uniform_tex;
|
||||
@@ -979,8 +963,6 @@ namespace MeshShader
|
||||
AssignTextureUnit(Program, TexUnit(TU_tex, "tex"));
|
||||
}
|
||||
|
||||
TransparentShader *TransparentShaderInstance;
|
||||
|
||||
TransparentFogShader::TransparentFogShader()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
@@ -997,8 +979,6 @@ namespace MeshShader
|
||||
AssignTextureUnit(Program, TexUnit(TU_tex, "tex"));
|
||||
}
|
||||
|
||||
TransparentFogShader *TransparentFogShaderInstance;
|
||||
|
||||
GLuint BillboardShader::Program;
|
||||
GLuint BillboardShader::attrib_corner;
|
||||
GLuint BillboardShader::attrib_texcoord;
|
||||
|
||||
@@ -195,7 +195,7 @@ public:
|
||||
NormalMapShader();
|
||||
};
|
||||
|
||||
class InstancedObjectPass1Shader : public ShaderHelper<>
|
||||
class InstancedObjectPass1Shader : public ShaderHelperSingleton<InstancedObjectPass1Shader>
|
||||
{
|
||||
public:
|
||||
GLuint TU_tex;
|
||||
@@ -203,9 +203,7 @@ public:
|
||||
InstancedObjectPass1Shader();
|
||||
};
|
||||
|
||||
extern InstancedObjectPass1Shader *InstancedObjectPass1ShaderInstance;
|
||||
|
||||
class InstancedObjectRefPass1Shader : public ShaderHelper<>
|
||||
class InstancedObjectRefPass1Shader : public ShaderHelperSingleton<InstancedObjectRefPass1Shader>
|
||||
{
|
||||
public:
|
||||
GLuint TU_tex;
|
||||
@@ -213,9 +211,7 @@ public:
|
||||
InstancedObjectRefPass1Shader();
|
||||
};
|
||||
|
||||
extern InstancedObjectRefPass1Shader *InstancedObjectRefPass1ShaderInstance;
|
||||
|
||||
class InstancedGrassPass1Shader : public ShaderHelper<core::vector3df>
|
||||
class InstancedGrassPass1Shader : public ShaderHelperSingleton<InstancedGrassPass1Shader, core::vector3df>
|
||||
{
|
||||
public:
|
||||
GLuint TU_tex;
|
||||
@@ -223,9 +219,7 @@ public:
|
||||
InstancedGrassPass1Shader();
|
||||
};
|
||||
|
||||
extern InstancedGrassPass1Shader *InstancedGrassPass1ShaderInstance;
|
||||
|
||||
class ObjectPass2Shader : public ShaderHelperSingleton<ObjectPass2Shader, core::matrix4, core::matrix4, video::SColorf>
|
||||
class ObjectPass2Shader : public ShaderHelperSingleton<ObjectPass2Shader, core::matrix4, core::matrix4>
|
||||
{
|
||||
public:
|
||||
GLuint TU_Albedo;
|
||||
@@ -233,7 +227,7 @@ public:
|
||||
ObjectPass2Shader();
|
||||
};
|
||||
|
||||
class InstancedObjectPass2Shader : public ShaderHelper<video::SColorf>
|
||||
class InstancedObjectPass2Shader : public ShaderHelperSingleton<InstancedObjectPass2Shader>
|
||||
{
|
||||
public:
|
||||
GLuint TU_Albedo;
|
||||
@@ -241,9 +235,7 @@ public:
|
||||
InstancedObjectPass2Shader();
|
||||
};
|
||||
|
||||
extern InstancedObjectPass2Shader *InstancedObjectPass2ShaderInstance;
|
||||
|
||||
class InstancedObjectRefPass2Shader : public ShaderHelper<video::SColorf>
|
||||
class InstancedObjectRefPass2Shader : public ShaderHelperSingleton<InstancedObjectRefPass2Shader>
|
||||
{
|
||||
public:
|
||||
GLuint TU_Albedo;
|
||||
@@ -251,9 +243,7 @@ public:
|
||||
InstancedObjectRefPass2Shader();
|
||||
};
|
||||
|
||||
extern InstancedObjectRefPass2Shader *InstancedObjectRefPass2ShaderInstance;
|
||||
|
||||
class DetailledObjectPass2Shader : public ShaderHelperSingleton<DetailledObjectPass2Shader, core::matrix4, video::SColorf>
|
||||
class DetailledObjectPass2Shader : public ShaderHelperSingleton<DetailledObjectPass2Shader, core::matrix4>
|
||||
{
|
||||
public:
|
||||
GLuint TU_Albedo, TU_detail;
|
||||
@@ -269,7 +259,7 @@ public:
|
||||
ObjectUnlitShader();
|
||||
};
|
||||
|
||||
class ObjectRefPass2Shader : public ShaderHelperSingleton<ObjectRefPass2Shader, core::matrix4, core::matrix4, video::SColorf>
|
||||
class ObjectRefPass2Shader : public ShaderHelperSingleton<ObjectRefPass2Shader, core::matrix4, core::matrix4>
|
||||
{
|
||||
public:
|
||||
GLuint TU_Albedo;
|
||||
@@ -277,7 +267,7 @@ public:
|
||||
ObjectRefPass2Shader();
|
||||
};
|
||||
|
||||
class GrassPass2Shader : public ShaderHelperSingleton<GrassPass2Shader, core::matrix4, core::vector3df, video::SColorf>
|
||||
class GrassPass2Shader : public ShaderHelperSingleton<GrassPass2Shader, core::matrix4, core::vector3df>
|
||||
{
|
||||
public:
|
||||
GLuint TU_Albedo;
|
||||
@@ -285,7 +275,7 @@ public:
|
||||
GrassPass2Shader();
|
||||
};
|
||||
|
||||
class InstancedGrassPass2Shader : public ShaderHelper<core::vector3df, core::vector3df, video::SColorf>
|
||||
class InstancedGrassPass2Shader : public ShaderHelperSingleton<InstancedGrassPass2Shader, core::vector3df, core::vector3df>
|
||||
{
|
||||
public:
|
||||
GLuint TU_Albedo, TU_dtex;
|
||||
@@ -293,9 +283,7 @@ public:
|
||||
InstancedGrassPass2Shader();
|
||||
};
|
||||
|
||||
extern InstancedGrassPass2Shader *InstancedGrassPass2ShaderInstance;
|
||||
|
||||
class SphereMapShader : public ShaderHelperSingleton<SphereMapShader, core::matrix4, core::matrix4, video::SColorf>
|
||||
class SphereMapShader : public ShaderHelperSingleton<SphereMapShader, core::matrix4, core::matrix4>
|
||||
{
|
||||
public:
|
||||
GLuint TU_tex;
|
||||
@@ -303,7 +291,7 @@ public:
|
||||
SphereMapShader();
|
||||
};
|
||||
|
||||
class SplattingShader : public ShaderHelperSingleton<SplattingShader, core::matrix4, video::SColorf>
|
||||
class SplattingShader : public ShaderHelperSingleton<SplattingShader, core::matrix4>
|
||||
{
|
||||
public:
|
||||
GLuint TU_tex_layout, TU_tex_detail0, TU_tex_detail1, TU_tex_detail2, TU_tex_detail3;
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "tracks/track.hpp"
|
||||
#include "graphics/camera.hpp"
|
||||
#include "utils/profiler.hpp"
|
||||
#include "utils/cpp2011.hpp"
|
||||
|
||||
using namespace irr;
|
||||
|
||||
@@ -141,16 +142,16 @@ void STKAnimatedMesh::render()
|
||||
|
||||
GLMesh* mesh;
|
||||
for_in(mesh, MeshSolidMaterial[MAT_DEFAULT])
|
||||
ListMatDefault::Arguments.emplace_back(mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix, irr_driver->getSceneManager()->getAmbientLight());
|
||||
pushVector(ListMatDefault::Arguments, mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix);
|
||||
|
||||
for_in(mesh, MeshSolidMaterial[MAT_ALPHA_REF])
|
||||
ListMatAlphaRef::Arguments.emplace_back(mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix, irr_driver->getSceneManager()->getAmbientLight());
|
||||
pushVector(ListMatAlphaRef::Arguments, mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix);
|
||||
|
||||
for_in(mesh, MeshSolidMaterial[MAT_DETAIL])
|
||||
ListMatDetails::Arguments.emplace_back(mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix, irr_driver->getSceneManager()->getAmbientLight());
|
||||
pushVector(ListMatDetails::Arguments, mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix);
|
||||
|
||||
for_in(mesh, MeshSolidMaterial[MAT_UNLIT])
|
||||
ListMatUnlit::Arguments.emplace_back(mesh, AbsoluteTransformation, core::matrix4::EM4CONST_IDENTITY);
|
||||
pushVector(ListMatUnlit::Arguments, mesh, AbsoluteTransformation, core::matrix4::EM4CONST_IDENTITY);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -191,10 +192,10 @@ void STKAnimatedMesh::render()
|
||||
else
|
||||
{
|
||||
for_in(mesh, TransparentMesh[TM_DEFAULT])
|
||||
ListBlendTransparent::Arguments.emplace_back(mesh, AbsoluteTransformation, mesh->TextureMatrix);
|
||||
pushVector(ListBlendTransparent::Arguments, mesh, AbsoluteTransformation, mesh->TextureMatrix);
|
||||
|
||||
for_in(mesh, TransparentMesh[TM_ADDITIVE])
|
||||
ListAdditiveTransparent::Arguments.emplace_back(mesh, AbsoluteTransformation, mesh->TextureMatrix);
|
||||
pushVector(ListAdditiveTransparent::Arguments, mesh, AbsoluteTransformation, mesh->TextureMatrix);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "graphics/glwrap.hpp"
|
||||
#include "graphics/shaders.hpp"
|
||||
#include "graphics/irr_driver.hpp"
|
||||
#include <ISceneManager.h>
|
||||
|
||||
using namespace irr;
|
||||
|
||||
@@ -28,6 +29,17 @@ STKBillboard::STKBillboard(irr::scene::ISceneNode* parent, irr::scene::ISceneMan
|
||||
createbillboardvao();
|
||||
}
|
||||
|
||||
void STKBillboard::OnRegisterSceneNode()
|
||||
{
|
||||
if (IsVisible)
|
||||
{
|
||||
SceneManager->registerNodeForRendering(this, scene::ESNRP_TRANSPARENT);
|
||||
}
|
||||
|
||||
ISceneNode::OnRegisterSceneNode();
|
||||
}
|
||||
|
||||
|
||||
void STKBillboard::render()
|
||||
{
|
||||
if (irr_driver->getPhase() != TRANSPARENT_PASS)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "../lib/irrlicht/source/Irrlicht/CBillboardSceneNode.h"
|
||||
#include <IBillboardSceneNode.h>
|
||||
#include <irrTypes.h>
|
||||
#include "utils/cpp2011.hpp"
|
||||
|
||||
class STKBillboard : public irr::scene::CBillboardSceneNode
|
||||
{
|
||||
@@ -13,7 +14,9 @@ public:
|
||||
irr::video::SColor colorTop = irr::video::SColor(0xFFFFFFFF),
|
||||
irr::video::SColor colorBottom = irr::video::SColor(0xFFFFFFFF));
|
||||
|
||||
virtual void render();
|
||||
virtual void OnRegisterSceneNode() OVERRIDE;
|
||||
|
||||
virtual void render() OVERRIDE;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -129,15 +129,15 @@ static void drawFSPMDefault(GLMesh &mesh, size_t instance_count)
|
||||
if (mesh.textures[0])
|
||||
{
|
||||
compressTexture(mesh.textures[0], true);
|
||||
setTexture(MeshShader::InstancedObjectPass1ShaderInstance->TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
setTexture(MeshShader::InstancedObjectPass1Shader::getInstance()->TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
setTexture(MeshShader::InstancedObjectPass1ShaderInstance->TU_tex, 0, GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, false);
|
||||
setTexture(MeshShader::InstancedObjectPass1Shader::getInstance()->TU_tex, 0, GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, false);
|
||||
GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ONE };
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
||||
}
|
||||
MeshShader::InstancedObjectPass1ShaderInstance->setUniforms();
|
||||
MeshShader::InstancedObjectPass1Shader::getInstance()->setUniforms();
|
||||
|
||||
glBindVertexArray(mesh.vao);
|
||||
glDrawElementsInstanced(ptype, count, itype, 0, instance_count);
|
||||
@@ -170,8 +170,8 @@ static void drawFSPMAlphaRefTexture(GLMesh &mesh, size_t instance_count)
|
||||
size_t count = mesh.IndexCount;
|
||||
|
||||
compressTexture(mesh.textures[0], true);
|
||||
setTexture(MeshShader::InstancedObjectRefPass1ShaderInstance->TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
MeshShader::InstancedObjectRefPass1ShaderInstance->setUniforms();
|
||||
setTexture(MeshShader::InstancedObjectRefPass1Shader::getInstance()->TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
MeshShader::InstancedObjectRefPass1Shader::getInstance()->setUniforms();
|
||||
|
||||
glBindVertexArray(mesh.vao);
|
||||
glDrawElementsInstanced(ptype, count, itype, 0, instance_count);
|
||||
@@ -215,8 +215,8 @@ static void drawFSPMGrass(GLMesh &mesh, const core::vector3df &windDir, size_t i
|
||||
size_t count = mesh.IndexCount;
|
||||
|
||||
compressTexture(mesh.textures[0], true);
|
||||
setTexture(MeshShader::InstancedGrassPass1ShaderInstance->TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
MeshShader::InstancedGrassPass1ShaderInstance->setUniforms(windDir);
|
||||
setTexture(MeshShader::InstancedGrassPass1Shader::getInstance()->TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
MeshShader::InstancedGrassPass1Shader::getInstance()->setUniforms(windDir);
|
||||
|
||||
glBindVertexArray(mesh.vao);
|
||||
glDrawElementsInstanced(ptype, count, itype, 0, instance_count);
|
||||
@@ -229,7 +229,7 @@ static void drawSMDefault(GLMesh &mesh, size_t instance_count)
|
||||
GLenum itype = mesh.IndexType;
|
||||
size_t count = mesh.IndexCount;
|
||||
|
||||
setTexture(MeshShader::InstancedObjectPass2ShaderInstance->TU_Albedo, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
setTexture(MeshShader::InstancedObjectPass2Shader::getInstance()->TU_Albedo, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
if (irr_driver->getLightViz())
|
||||
{
|
||||
GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ALPHA };
|
||||
@@ -241,7 +241,7 @@ static void drawSMDefault(GLMesh &mesh, size_t instance_count)
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
||||
}
|
||||
|
||||
MeshShader::InstancedObjectPass2ShaderInstance->setUniforms(irr_driver->getSceneManager()->getAmbientLight());
|
||||
MeshShader::InstancedObjectPass2Shader::getInstance()->setUniforms();
|
||||
|
||||
glBindVertexArray(mesh.vao);
|
||||
glDrawElementsInstanced(ptype, count, itype, 0, instance_count);
|
||||
@@ -255,7 +255,7 @@ static void drawSMAlphaRefTexture(GLMesh &mesh, size_t instance_count)
|
||||
size_t count = mesh.IndexCount;
|
||||
|
||||
compressTexture(mesh.textures[0], true);
|
||||
setTexture(MeshShader::InstancedObjectRefPass2ShaderInstance->TU_Albedo, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
setTexture(MeshShader::InstancedObjectRefPass2Shader::getInstance()->TU_Albedo, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
if (irr_driver->getLightViz())
|
||||
{
|
||||
GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ALPHA };
|
||||
@@ -267,7 +267,7 @@ static void drawSMAlphaRefTexture(GLMesh &mesh, size_t instance_count)
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
||||
}
|
||||
|
||||
MeshShader::InstancedObjectRefPass2ShaderInstance->setUniforms(irr_driver->getSceneManager()->getAmbientLight());
|
||||
MeshShader::InstancedObjectRefPass2Shader::getInstance()->setUniforms();
|
||||
|
||||
glBindVertexArray(mesh.vao);
|
||||
glDrawElementsInstanced(ptype, count, itype, 0, instance_count);
|
||||
@@ -281,7 +281,7 @@ static void drawSMGrass(GLMesh &mesh, const core::vector3df &windDir, size_t ins
|
||||
size_t count = mesh.IndexCount;
|
||||
|
||||
compressTexture(mesh.textures[0], true);
|
||||
setTexture(MeshShader::InstancedGrassPass2ShaderInstance->TU_Albedo, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
setTexture(MeshShader::InstancedGrassPass2Shader::getInstance()->TU_Albedo, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
if (irr_driver->getLightViz())
|
||||
{
|
||||
GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ALPHA };
|
||||
@@ -292,10 +292,10 @@ static void drawSMGrass(GLMesh &mesh, const core::vector3df &windDir, size_t ins
|
||||
GLint swizzleMask[] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA };
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
||||
}
|
||||
setTexture(MeshShader::InstancedGrassPass2ShaderInstance->TU_dtex, irr_driver->getDepthStencilTexture(), GL_NEAREST, GL_NEAREST);
|
||||
setTexture(MeshShader::InstancedGrassPass2Shader::getInstance()->TU_dtex, irr_driver->getDepthStencilTexture(), GL_NEAREST, GL_NEAREST);
|
||||
SunLightProvider * const cb = (SunLightProvider *)irr_driver->getCallback(ES_SUNLIGHT);
|
||||
|
||||
MeshShader::InstancedGrassPass2ShaderInstance->setUniforms(windDir, cb->getPosition(), irr_driver->getSceneManager()->getAmbientLight());
|
||||
MeshShader::InstancedGrassPass2Shader::getInstance()->setUniforms(windDir, cb->getPosition());
|
||||
|
||||
glBindVertexArray(mesh.vao);
|
||||
glDrawElementsInstanced(ptype, count, itype, 0, instance_count);
|
||||
@@ -317,18 +317,18 @@ void STKInstancedSceneNode::render()
|
||||
ModelViewProjectionMatrix *= irr_driver->getViewMatrix();
|
||||
|
||||
if (!MeshSolidMaterial[MAT_DEFAULT].empty())
|
||||
glUseProgram(MeshShader::InstancedObjectPass1ShaderInstance->Program);
|
||||
glUseProgram(MeshShader::InstancedObjectPass1Shader::getInstance()->Program);
|
||||
for (unsigned i = 0; i < MeshSolidMaterial[MAT_DEFAULT].size(); i++)
|
||||
drawFSPMDefault(*MeshSolidMaterial[MAT_DEFAULT][i], instance_pos.size() / 9);
|
||||
|
||||
if (!MeshSolidMaterial[MAT_ALPHA_REF].empty())
|
||||
glUseProgram(MeshShader::InstancedObjectRefPass1ShaderInstance->Program);
|
||||
glUseProgram(MeshShader::InstancedObjectRefPass1Shader::getInstance()->Program);
|
||||
for (unsigned i = 0; i < MeshSolidMaterial[MAT_ALPHA_REF].size(); i++)
|
||||
drawFSPMAlphaRefTexture(*MeshSolidMaterial[MAT_ALPHA_REF][i], instance_pos.size() / 9);
|
||||
|
||||
windDir = getWind();
|
||||
if (!MeshSolidMaterial[MAT_GRASS].empty())
|
||||
glUseProgram(MeshShader::InstancedGrassPass1ShaderInstance->Program);
|
||||
glUseProgram(MeshShader::InstancedGrassPass1Shader::getInstance()->Program);
|
||||
for (unsigned i = 0; i < MeshSolidMaterial[MAT_GRASS].size(); i++)
|
||||
drawFSPMGrass(*MeshSolidMaterial[MAT_GRASS][i], windDir, instance_pos.size() / 9);
|
||||
return;
|
||||
@@ -337,17 +337,17 @@ void STKInstancedSceneNode::render()
|
||||
if (irr_driver->getPhase() == SOLID_LIT_PASS)
|
||||
{
|
||||
if (!MeshSolidMaterial[MAT_DEFAULT].empty())
|
||||
glUseProgram(MeshShader::InstancedObjectPass2ShaderInstance->Program);
|
||||
glUseProgram(MeshShader::InstancedObjectPass2Shader::getInstance()->Program);
|
||||
for (unsigned i = 0; i < MeshSolidMaterial[MAT_DEFAULT].size(); i++)
|
||||
drawSMDefault(*MeshSolidMaterial[MAT_DEFAULT][i], instance_pos.size() / 9);
|
||||
|
||||
if (!MeshSolidMaterial[MAT_ALPHA_REF].empty())
|
||||
glUseProgram(MeshShader::InstancedObjectRefPass2ShaderInstance->Program);
|
||||
glUseProgram(MeshShader::InstancedObjectRefPass2Shader::getInstance()->Program);
|
||||
for (unsigned i = 0; i < MeshSolidMaterial[MAT_ALPHA_REF].size(); i++)
|
||||
drawSMAlphaRefTexture(*MeshSolidMaterial[MAT_ALPHA_REF][i], instance_pos.size() / 9);
|
||||
|
||||
if (!MeshSolidMaterial[MAT_GRASS].empty())
|
||||
glUseProgram(MeshShader::InstancedGrassPass2ShaderInstance->Program);
|
||||
glUseProgram(MeshShader::InstancedGrassPass2Shader::getInstance()->Program);
|
||||
for (unsigned i = 0; i < MeshSolidMaterial[MAT_GRASS].size(); i++)
|
||||
drawSMGrass(*MeshSolidMaterial[MAT_GRASS][i], windDir, instance_pos.size() / 9);
|
||||
return;
|
||||
|
||||
@@ -293,14 +293,14 @@ bool isObject(video::E_MATERIAL_TYPE type)
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4, video::SColorf> > ListMatDefault::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4, video::SColorf> > ListMatAlphaRef::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4, video::SColorf> > ListMatSphereMap::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4, video::SColorf> > ListMatDetails::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::vector3df, video::SColorf> > ListMatGrass::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4> > ListMatDefault::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4> > ListMatAlphaRef::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4> > ListMatSphereMap::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4> > ListMatDetails::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::vector3df> > ListMatGrass::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4> > ListMatUnlit::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, video::SColorf> > ListMatSplatting::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4, video::SColorf> > ListMatNormalMap::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4> > ListMatSplatting::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4> > ListMatNormalMap::Arguments;
|
||||
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4> > ListBlendTransparent::Arguments;
|
||||
std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4> > ListAdditiveTransparent::Arguments;
|
||||
|
||||
@@ -62,37 +62,37 @@ core::vector3df getWind();
|
||||
class ListMatDefault
|
||||
{
|
||||
public:
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4, video::SColorf> > Arguments;
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4> > Arguments;
|
||||
};
|
||||
|
||||
class ListMatAlphaRef
|
||||
{
|
||||
public:
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4, video::SColorf> > Arguments;
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4> > Arguments;
|
||||
};
|
||||
|
||||
class ListMatNormalMap
|
||||
{
|
||||
public:
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4, video::SColorf> > Arguments;
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4> > Arguments;
|
||||
};
|
||||
|
||||
class ListMatGrass
|
||||
{
|
||||
public:
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::vector3df, video::SColorf> > Arguments;
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::vector3df> > Arguments;
|
||||
};
|
||||
|
||||
class ListMatSphereMap
|
||||
{
|
||||
public:
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4, video::SColorf> > Arguments;
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4> > Arguments;
|
||||
};
|
||||
|
||||
class ListMatSplatting
|
||||
{
|
||||
public:
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, video::SColorf> > Arguments;
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4> > Arguments;
|
||||
};
|
||||
|
||||
class ListMatUnlit
|
||||
@@ -104,7 +104,7 @@ public:
|
||||
class ListMatDetails
|
||||
{
|
||||
public:
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4, video::SColorf> > Arguments;
|
||||
static std::vector<STK::Tuple<GLMesh *, core::matrix4, core::matrix4, core::matrix4> > Arguments;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "modes/world.hpp"
|
||||
#include "utils/helpers.hpp"
|
||||
#include "utils/tuple.hpp"
|
||||
#include "utils/cpp2011.hpp"
|
||||
|
||||
STKMeshSceneNode::STKMeshSceneNode(irr::scene::IMesh* mesh, ISceneNode* parent, irr::scene::ISceneManager* mgr, irr::s32 id,
|
||||
const irr::core::vector3df& position,
|
||||
@@ -246,29 +247,29 @@ void STKMeshSceneNode::render()
|
||||
|
||||
GLMesh* mesh;
|
||||
for_in(mesh, MeshSolidMaterials[MAT_DEFAULT])
|
||||
ListMatDefault::Arguments.emplace_back(mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix, irr_driver->getSceneManager()->getAmbientLight());
|
||||
pushVector(ListMatDefault::Arguments, mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix);
|
||||
|
||||
for_in(mesh, MeshSolidMaterials[MAT_ALPHA_REF])
|
||||
ListMatAlphaRef::Arguments.emplace_back(mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix, irr_driver->getSceneManager()->getAmbientLight());
|
||||
pushVector(ListMatAlphaRef::Arguments, mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix);
|
||||
|
||||
for_in(mesh, MeshSolidMaterials[MAT_SPHEREMAP])
|
||||
ListMatSphereMap::Arguments.emplace_back(mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix, irr_driver->getSceneManager()->getAmbientLight());
|
||||
pushVector(ListMatSphereMap::Arguments, mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix);
|
||||
|
||||
for_in(mesh, MeshSolidMaterials[MAT_DETAIL])
|
||||
ListMatDetails::Arguments.emplace_back(mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix, irr_driver->getSceneManager()->getAmbientLight());
|
||||
pushVector(ListMatDetails::Arguments, mesh, AbsoluteTransformation, invmodel, mesh->TextureMatrix);
|
||||
|
||||
windDir = getWind();
|
||||
for_in(mesh, MeshSolidMaterials[MAT_GRASS])
|
||||
ListMatGrass::Arguments.emplace_back(mesh, AbsoluteTransformation, invmodel, windDir, irr_driver->getSceneManager()->getAmbientLight());
|
||||
pushVector(ListMatGrass::Arguments, mesh, AbsoluteTransformation, invmodel, windDir);
|
||||
|
||||
for_in(mesh, MeshSolidMaterials[MAT_UNLIT])
|
||||
ListMatUnlit::Arguments.emplace_back(mesh, AbsoluteTransformation, core::matrix4::EM4CONST_IDENTITY);
|
||||
pushVector(ListMatUnlit::Arguments, mesh, AbsoluteTransformation, core::matrix4::EM4CONST_IDENTITY);
|
||||
|
||||
for_in(mesh, MeshSolidMaterials[MAT_SPLATTING])
|
||||
ListMatSplatting::Arguments.emplace_back(mesh, AbsoluteTransformation, invmodel, irr_driver->getSceneManager()->getAmbientLight());
|
||||
pushVector(ListMatSplatting::Arguments, mesh, AbsoluteTransformation, invmodel);
|
||||
|
||||
for_in(mesh, MeshSolidMaterials[MAT_NORMAL_MAP])
|
||||
ListMatNormalMap::Arguments.emplace_back(mesh, AbsoluteTransformation, invmodel, core::matrix4::EM4CONST_IDENTITY, irr_driver->getSceneManager()->getAmbientLight());
|
||||
pushVector( ListMatNormalMap::Arguments, mesh, AbsoluteTransformation, invmodel, core::matrix4::EM4CONST_IDENTITY);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -294,7 +295,7 @@ void STKMeshSceneNode::render()
|
||||
size_t count = mesh.IndexCount;
|
||||
|
||||
setTexture(MeshShader::ObjectPass2Shader::getInstance()->TU_Albedo, getTextureGLuint(spareWhiteTex), GL_NEAREST, GL_NEAREST, false);
|
||||
MeshShader::ObjectPass2Shader::getInstance()->setUniforms(AbsoluteTransformation, mesh.TextureMatrix, irr_driver->getSceneManager()->getAmbientLight());
|
||||
MeshShader::ObjectPass2Shader::getInstance()->setUniforms(AbsoluteTransformation, mesh.TextureMatrix);
|
||||
assert(mesh.vao);
|
||||
glBindVertexArray(mesh.vao);
|
||||
glDrawElements(ptype, count, itype, 0);
|
||||
@@ -408,23 +409,23 @@ void STKMeshSceneNode::render()
|
||||
tmpcol.getBlue() / 255.0f);
|
||||
|
||||
for_in(mesh, TransparentMesh[TM_DEFAULT])
|
||||
ListBlendTransparentFog::Arguments.emplace_back(mesh, AbsoluteTransformation, mesh->TextureMatrix,
|
||||
pushVector(ListBlendTransparentFog::Arguments, mesh, AbsoluteTransformation, mesh->TextureMatrix,
|
||||
fogmax, startH, endH, start, end, col);
|
||||
for_in(mesh, TransparentMesh[TM_ADDITIVE])
|
||||
ListAdditiveTransparentFog::Arguments.emplace_back(mesh, AbsoluteTransformation, mesh->TextureMatrix,
|
||||
pushVector(ListAdditiveTransparentFog::Arguments, mesh, AbsoluteTransformation, mesh->TextureMatrix,
|
||||
fogmax, startH, endH, start, end, col);
|
||||
}
|
||||
else
|
||||
{
|
||||
for_in(mesh, TransparentMesh[TM_DEFAULT])
|
||||
ListBlendTransparent::Arguments.emplace_back(mesh, AbsoluteTransformation, mesh->TextureMatrix);
|
||||
pushVector(ListBlendTransparent::Arguments, mesh, AbsoluteTransformation, mesh->TextureMatrix);
|
||||
|
||||
for_in(mesh, TransparentMesh[TM_ADDITIVE])
|
||||
ListAdditiveTransparent::Arguments.emplace_back(mesh, AbsoluteTransformation, mesh->TextureMatrix);
|
||||
pushVector(ListAdditiveTransparent::Arguments, mesh, AbsoluteTransformation, mesh->TextureMatrix);
|
||||
}
|
||||
|
||||
for_in(mesh, TransparentMesh[TM_DISPLACEMENT])
|
||||
ListDisplacement::Arguments.emplace_back(mesh, AbsoluteTransformation);
|
||||
pushVector(ListDisplacement::Arguments, mesh, AbsoluteTransformation);
|
||||
|
||||
if (!TransparentMesh[TM_BUBBLE].empty())
|
||||
glUseProgram(MeshShader::BubbleShader::Program);
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#define HEADER_SUN_HPP
|
||||
|
||||
#include "graphics/light.hpp"
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
|
||||
class ScreenQuad;
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#define HEADER_WATER_HPP
|
||||
|
||||
#include <IMeshSceneNode.h>
|
||||
#include <utils/cpp2011.h>
|
||||
#include <utils/cpp2011.hpp>
|
||||
|
||||
using namespace irr;
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <typeinfo>
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
|
||||
#include <irrString.h>
|
||||
#include <IXMLReader.h>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "input/wiimote.hpp"
|
||||
#include "states_screens/dialogs/message_dialog.hpp"
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
|
||||
#include "IEventReceiver.h"
|
||||
|
||||
|
||||
@@ -137,6 +137,12 @@ void WorldStatus::update(const float dt)
|
||||
return;
|
||||
case TRACK_INTRO_PHASE:
|
||||
m_auxiliary_timer += dt;
|
||||
|
||||
if (UserConfigParams::m_artist_debug_mode &&
|
||||
race_manager->getNumberOfKarts() == 1 &&
|
||||
race_manager->getTrackName() != "tutorial")
|
||||
m_auxiliary_timer += dt * 6;
|
||||
|
||||
// Work around a bug that occurred on linux once:
|
||||
// the sfx_manager kept on reporting that it is playing,
|
||||
// while it was not - so STK would never reach the ready
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#ifndef HEADER_WORLD_STATUS_HPP
|
||||
#define HEADER_WORLD_STATUS_HPP
|
||||
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
|
||||
class SFXBase;
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#include "io/file_manager.hpp"
|
||||
#include "online/request.hpp"
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
#include "utils/string_utils.hpp"
|
||||
#include "utils/synchronised.hpp"
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#define HEADER_ONLINE_REQUEST_HPP
|
||||
|
||||
#include "io/file_manager.hpp"
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
#include "utils/leak_check.hpp"
|
||||
#include "utils/no_copy.hpp"
|
||||
#include "utils/string_utils.hpp"
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#include "io/file_manager.hpp"
|
||||
#include "online/http_request.hpp"
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
#include "utils/string_utils.hpp"
|
||||
#include "utils/synchronised.hpp"
|
||||
|
||||
|
||||
@@ -553,7 +553,7 @@ void GrandPrixData::editTrack(unsigned int index, Track* track,
|
||||
// ----------------------------------------------------------------------------
|
||||
void GrandPrixData::remove(const unsigned int track)
|
||||
{
|
||||
assert (0 < track && track < getNumberOfTracks(true));
|
||||
assert (0 <= track && track < getNumberOfTracks(true));
|
||||
|
||||
m_tracks.erase(m_tracks.begin() + track);
|
||||
m_laps.erase(m_laps.begin() + track);
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
using namespace irr;
|
||||
|
||||
#include "states_screens/race_gui_base.hpp"
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
|
||||
class AbstractKart;
|
||||
class InputMap;
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#include "states_screens/dialogs/message_dialog.hpp"
|
||||
#include "states_screens/options_screen_input.hpp"
|
||||
#include "states_screens/state_manager.hpp"
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
#include "utils/string_utils.hpp"
|
||||
#include "utils/translation.hpp"
|
||||
#include "input/wiimote_manager.hpp"
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#define HEADER_DEBUG_SLIDER_DIALOG_HPP
|
||||
|
||||
#include "guiengine/modaldialog.hpp"
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
#include "utils/leak_check.hpp"
|
||||
|
||||
/**
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#define HEADER_TUTORIAL_DIALOG_HPP
|
||||
|
||||
#include "guiengine/modaldialog.hpp"
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
#include "utils/leak_check.hpp"
|
||||
|
||||
/**
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#define HEADER_CHECK_GOAL_HPP
|
||||
|
||||
#include "tracks/check_structure.hpp"
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
#include <line2d.h>
|
||||
using namespace irr;
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include "items/item.hpp"
|
||||
#include "physics/physical_object.hpp"
|
||||
#include "tracks/track_object_presentation.hpp"
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
#include "utils/no_copy.hpp"
|
||||
#include "utils/vec3.hpp"
|
||||
#include <string>
|
||||
|
||||
@@ -30,7 +30,7 @@ using namespace irr;
|
||||
|
||||
#include "graphics/lod_node.hpp"
|
||||
#include "items/item.hpp"
|
||||
#include "utils/cpp2011.h"
|
||||
#include "utils/cpp2011.hpp"
|
||||
#include "utils/no_copy.hpp"
|
||||
#include "utils/vec3.hpp"
|
||||
#include <string>
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
|
||||
#if __cplusplus >= 201103 || _MSC_VER >=1800
|
||||
|
||||
#define OVERRIDE override
|
||||
|
||||
#else
|
||||
|
||||
#define OVERRIDE
|
||||
|
||||
#endif
|
||||
30
src/utils/cpp2011.hpp
Normal file
30
src/utils/cpp2011.hpp
Normal file
@@ -0,0 +1,30 @@
|
||||
#ifndef CPP2011_HPP
|
||||
#define CPP2011_HPP
|
||||
#include <vector>
|
||||
#if __cplusplus >= 201103 || _MSC_VER >=1800
|
||||
|
||||
#define OVERRIDE override
|
||||
|
||||
#else
|
||||
|
||||
#define OVERRIDE
|
||||
|
||||
#endif
|
||||
|
||||
#if (__cplusplus >= 201103 || _MSC_VER >=1800) && !(defined(__clang__) && defined(__APPLE__))
|
||||
#define STDCPP2011
|
||||
#else
|
||||
#define STDCPP2003
|
||||
#endif
|
||||
|
||||
|
||||
template<typename T, typename... Args>
|
||||
void pushVector(std::vector<T> &vec, Args ...args)
|
||||
{
|
||||
#ifdef STDCPP2003
|
||||
vec.push_back(T(args...));
|
||||
#else
|
||||
vec.emplace_back(args...);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user