Merge branch 'master' of github.com:supertuxkart/stk-code
This commit is contained in:
commit
73e8fb3556
@ -19,7 +19,7 @@ vec2 EncodeNormal(vec3 n);
|
||||
void main()
|
||||
{
|
||||
// normal in Tangent Space
|
||||
vec3 TS_normal = 2.0 * texture (normalMap, uv).rgb - 1.0;
|
||||
vec3 TS_normal = 2.0 * pow(texture(normalMap, uv).rgb, vec3(1./2.2)) - 1.0;
|
||||
// Because of interpolation, we need to renormalize
|
||||
vec3 Frag_tangent = normalize(tangent);
|
||||
vec3 Frag_normal = normalize(cross(Frag_tangent, bitangent));
|
||||
|
@ -642,6 +642,7 @@ bool CIrrDeviceMacOSX::createWindow()
|
||||
NSOpenGLPFASamples, (NSOpenGLPixelFormatAttribute)CreationParams.AntiAlias,
|
||||
NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute)(CreationParams.Stencilbuffer?1:0),
|
||||
NSOpenGLPFADoubleBuffer,
|
||||
NSOpenGLPFAOpenGLProfile, (NSOpenGLPixelFormatAttribute)NSOpenGLProfileVersion3_2Core,
|
||||
(NSOpenGLPixelFormatAttribute)nil
|
||||
};
|
||||
|
||||
|
@ -57,6 +57,7 @@ PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer;
|
||||
PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB;
|
||||
PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
|
||||
PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
|
||||
PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
|
||||
PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture;
|
||||
PFNGLTEXIMAGE3DPROC glTexImage3D;
|
||||
PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
|
||||
@ -199,6 +200,7 @@ void initGL()
|
||||
glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)IRR_OGL_LOAD_EXTENSION("glVertexAttribIPointer");
|
||||
glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)IRR_OGL_LOAD_EXTENSION("glGenFramebuffers");
|
||||
glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)IRR_OGL_LOAD_EXTENSION("glBindFramebuffer");
|
||||
glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)IRR_OGL_LOAD_EXTENSION("glFramebufferTexture2D");
|
||||
glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)IRR_OGL_LOAD_EXTENSION("glFramebufferTexture");
|
||||
glTexImage3D = (PFNGLTEXIMAGE3DPROC)IRR_OGL_LOAD_EXTENSION("glTexImage3D");
|
||||
glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)IRR_OGL_LOAD_EXTENSION("glGenerateMipmap");
|
||||
@ -309,7 +311,7 @@ void transformTexturesTosRGB(irr::video::ITexture *tex)
|
||||
memcpy(data, tex->lock(), w * h * 4);
|
||||
tex->unlock();
|
||||
glBindTexture(GL_TEXTURE_2D, getTextureGLuint(tex));
|
||||
if (irr_driver->getGLSLVersion() < 320)
|
||||
if (irr_driver->getGLSLVersion() < 150)
|
||||
{
|
||||
if (tex->hasAlpha())
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid *)data);
|
||||
|
@ -74,6 +74,7 @@ extern PFNGLBUFFERSUBDATAPROC glBufferSubData;
|
||||
extern PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer;
|
||||
extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
|
||||
extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
|
||||
extern PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture;
|
||||
extern PFNGLTEXIMAGE3DPROC glTexImage3D;
|
||||
extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
|
||||
|
@ -441,11 +441,6 @@ void IrrDriver::renderSolidSecondPass()
|
||||
setTexture(0, m_rtts->getRenderTarget(RTT_TMP1), GL_NEAREST, GL_NEAREST);
|
||||
setTexture(1, m_rtts->getRenderTarget(RTT_TMP2), GL_NEAREST, GL_NEAREST);
|
||||
setTexture(2, m_rtts->getRenderTarget(RTT_SSAO), GL_NEAREST, GL_NEAREST);
|
||||
if (!UserConfigParams::m_ssao)
|
||||
{
|
||||
GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ONE };
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
||||
}
|
||||
m_scene_manager->drawAll(m_renderpass);
|
||||
}
|
||||
|
||||
@ -771,6 +766,9 @@ void IrrDriver::renderLights(const core::aabbox3df& cambox,
|
||||
for (unsigned i = 0; i < sun_ortho_matrix.size(); i++)
|
||||
sun_ortho_matrix[i] *= getInvViewMatrix();
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, m_rtts->getFBO(FBO_COMBINED_TMP1_TMP2));
|
||||
irr::video::COpenGLDriver* gl_driver = (irr::video::COpenGLDriver*)m_device->getVideoDriver();
|
||||
GLenum bufs[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
|
||||
gl_driver->extGlDrawBuffers(2, bufs);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
const u32 lightcount = m_lights.size();
|
||||
|
@ -36,7 +36,7 @@ static GLuint generateFBO(GLuint ColorAttachement)
|
||||
GLuint fbo;
|
||||
glGenFramebuffers(1, &fbo);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
||||
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, ColorAttachement, 0);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ColorAttachement, 0);
|
||||
GLenum result = glCheckFramebufferStatus(GL_FRAMEBUFFER);
|
||||
assert(result == GL_FRAMEBUFFER_COMPLETE_EXT);
|
||||
return fbo;
|
||||
@ -45,7 +45,7 @@ static GLuint generateFBO(GLuint ColorAttachement)
|
||||
static GLuint generateFBO(GLuint ColorAttachement, GLuint DepthAttachement)
|
||||
{
|
||||
GLuint fbo = generateFBO(ColorAttachement);
|
||||
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, DepthAttachement, 0);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, DepthAttachement, 0);
|
||||
GLenum result = glCheckFramebufferStatus(GL_FRAMEBUFFER);
|
||||
assert(result == GL_FRAMEBUFFER_COMPLETE_EXT);
|
||||
return fbo;
|
||||
@ -100,6 +100,10 @@ RTT::RTT()
|
||||
RenderTargetTextures[RTT_EIGHTH2] = generateRTT(eighth, GL_RGBA16F, GL_BGRA, GL_FLOAT);
|
||||
|
||||
FrameBuffers[FBO_SSAO] = generateFBO(RenderTargetTextures[RTT_SSAO]);
|
||||
// Clear this FBO to 1s so that if no SSAO is computed we can still use it.
|
||||
glClearColor(1., 1., 1., 1.);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
FrameBuffers[FBO_NORMAL_AND_DEPTHS] = generateFBO(RenderTargetTextures[RTT_NORMAL_AND_DEPTH], DepthStencilTexture);
|
||||
FrameBuffers[FBO_COLORS] = generateFBO(RenderTargetTextures[RTT_COLOR], DepthStencilTexture);
|
||||
FrameBuffers[FBO_MLAA_COLORS] = generateFBO(RenderTargetTextures[RTT_MLAA_COLORS], DepthStencilTexture);
|
||||
@ -116,9 +120,9 @@ RTT::RTT()
|
||||
FrameBuffers[FBO_EIGHTH2] = generateFBO(RenderTargetTextures[RTT_EIGHTH2]);
|
||||
|
||||
FrameBuffers[FBO_COMBINED_TMP1_TMP2] = generateFBO(RenderTargetTextures[RTT_TMP1]);
|
||||
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, RenderTargetTextures[RTT_TMP2], 0);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, RenderTargetTextures[RTT_TMP2], 0);
|
||||
|
||||
if (irr_driver->getGLSLVersion() < 150)
|
||||
if (irr_driver->getGLSLVersion() >= 150)
|
||||
{
|
||||
glGenFramebuffers(1, &shadowFBO);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, shadowFBO);
|
||||
|
@ -8,8 +8,11 @@ STKInstancedSceneNode::STKInstancedSceneNode(irr::scene::IMesh* mesh, ISceneNode
|
||||
const irr::core::vector3df& scale) :
|
||||
CMeshSceneNode(mesh, parent, mgr, id, position, rotation, scale)
|
||||
{
|
||||
if (irr_driver->isGLSL())
|
||||
{
|
||||
createGLMeshes();
|
||||
setAutomaticCulling(0);
|
||||
}
|
||||
}
|
||||
|
||||
void STKInstancedSceneNode::cleanGL()
|
||||
@ -39,6 +42,7 @@ void STKInstancedSceneNode::cleanGL()
|
||||
|
||||
STKInstancedSceneNode::~STKInstancedSceneNode()
|
||||
{
|
||||
if (irr_driver->isGLSL())
|
||||
cleanGL();
|
||||
}
|
||||
|
||||
@ -77,9 +81,12 @@ void STKInstancedSceneNode::initinstancedvaostate(GLMesh &mesh, GeometricMateria
|
||||
glBindBuffer(GL_ARRAY_BUFFER, instances_vbo);
|
||||
glBufferData(GL_ARRAY_BUFFER, instance_pos.size() * sizeof(float), instance_pos.data(), GL_STATIC_DRAW);
|
||||
setInstanceAttribPointer<MeshShader::InstancedObjectPass1Shader>();
|
||||
if (irr_driver->getGLSLVersion() >= 150)
|
||||
{
|
||||
mesh.vao_shadow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::InstancedShadowShader::attrib_position, -1, -1, -1, -1, -1, -1, mesh.Stride);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, instances_vbo);
|
||||
setInstanceAttribPointer<MeshShader::InstancedShadowShader>();
|
||||
}
|
||||
break;
|
||||
case FPSM_ALPHA_REF_TEXTURE:
|
||||
mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
|
||||
@ -88,9 +95,12 @@ void STKInstancedSceneNode::initinstancedvaostate(GLMesh &mesh, GeometricMateria
|
||||
glBindBuffer(GL_ARRAY_BUFFER, instances_vbo);
|
||||
glBufferData(GL_ARRAY_BUFFER, instance_pos.size() * sizeof(float), instance_pos.data(), GL_STATIC_DRAW);
|
||||
setInstanceAttribPointer<MeshShader::InstancedObjectRefPass1Shader>();
|
||||
if (irr_driver->getGLSLVersion() >= 150)
|
||||
{
|
||||
mesh.vao_shadow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::InstancedRefShadowShader::attrib_position, MeshShader::InstancedRefShadowShader::attrib_texcoord, -1, -1, -1, -1, -1, mesh.Stride);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, instances_vbo);
|
||||
setInstanceAttribPointer<MeshShader::InstancedRefShadowShader>();
|
||||
}
|
||||
break;
|
||||
case FPSM_GRASS:
|
||||
mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
|
||||
@ -300,6 +310,12 @@ static void drawSMGrass(GLMesh &mesh, const core::matrix4 &ModelViewProjectionMa
|
||||
|
||||
void STKInstancedSceneNode::render()
|
||||
{
|
||||
if (!irr_driver->isGLSL())
|
||||
{
|
||||
CMeshSceneNode::render();
|
||||
return;
|
||||
}
|
||||
|
||||
setFirstTimeMaterial();
|
||||
|
||||
if (irr_driver->getPhase() == SOLID_NORMAL_AND_DEPTH_PASS)
|
||||
|
@ -145,3 +145,10 @@ void ModelDefinitionLoader::clear()
|
||||
{
|
||||
m_lod_groups.clear();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
scene::IMesh* ModelDefinitionLoader::getFirstMeshFor(const std::string& name)
|
||||
{
|
||||
return irr_driver->getMesh(m_lod_groups[name][0].m_model_file);
|
||||
}
|
@ -90,6 +90,8 @@ public:
|
||||
|
||||
void clear();
|
||||
|
||||
|
||||
scene::IMesh* getFirstMeshFor(const std::string& name);
|
||||
}; // ModelDefinitionLoader
|
||||
|
||||
#endif // HEADER_LOD_NODE_LOADER_HPP
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "graphics/material_manager.hpp"
|
||||
#include "graphics/particle_emitter.hpp"
|
||||
#include "graphics/particle_kind_manager.hpp"
|
||||
#include "graphics/stkinstancedscenenode.hpp"
|
||||
#include "io/file_manager.hpp"
|
||||
#include "io/xml_node.hpp"
|
||||
#include "input/device_manager.hpp"
|
||||
@ -160,6 +161,8 @@ TrackObjectPresentationInstancing::TrackObjectPresentationInstancing(const XMLNo
|
||||
scene::ISceneNode* parent,
|
||||
ModelDefinitionLoader& model_def_loader) : TrackObjectPresentationSceneNode(xml_node)
|
||||
{
|
||||
m_instancing_group = NULL;
|
||||
|
||||
std::string instancing_model;
|
||||
xml_node.get("instancing_model", &instancing_model);
|
||||
|
||||
@ -168,9 +171,17 @@ TrackObjectPresentationInstancing::TrackObjectPresentationInstancing(const XMLNo
|
||||
m_node->setRotation(m_init_hpr);
|
||||
m_node->setScale(m_init_scale);
|
||||
m_node->updateAbsolutePosition();
|
||||
if (irr_driver->isGLSL())
|
||||
{
|
||||
m_instancing_group = model_def_loader.instanciate(m_node->getAbsolutePosition(),
|
||||
m_node->getAbsoluteTransformation().getRotationDegrees(), m_node->getAbsoluteTransformation().getScale(),
|
||||
instancing_model);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_instancing_group = new STKInstancedSceneNode(model_def_loader.getFirstMeshFor(instancing_model),
|
||||
m_node, irr_driver->getSceneManager(), -1);
|
||||
}
|
||||
}
|
||||
|
||||
TrackObjectPresentationInstancing::~TrackObjectPresentationInstancing()
|
||||
|
Loading…
Reference in New Issue
Block a user