Commit 1f574c60 authored by hybrid's avatar hybrid

Add support for different primitive types for geometry shaders.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3019 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 7909a00d
// Copyright (C) 2002-2009 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __E_PRIMITIVE_TYPES_H_INCLUDED__
#define __E_PRIMITIVE_TYPES_H_INCLUDED__
namespace irr
{
namespace scene
{
//! Enumeration for all primitive types there are.
enum E_PRIMITIVE_TYPE
{
//! All vertices are non-connected points.
EPT_POINTS=0,
//! All vertices form a single connected line.
EPT_LINE_STRIP,
//! Just as LINE_STRIP, but the last and the first vertex is also connected.
EPT_LINE_LOOP,
//! Every two vertices are connected creating n/2 lines.
EPT_LINES,
//! After the first two vertices each vertex defines a new triangle.
//! Always the two last and the new one form a new triangle.
EPT_TRIANGLE_STRIP,
//! After the first two vertices each vertex defines a new triangle.
//! All around the common first vertex.
EPT_TRIANGLE_FAN,
//! Explicitly set all vertices for each triangle.
EPT_TRIANGLES,
//! After the first two vertices each further tw vetices create a quad with the preceding two.
EPT_QUAD_STRIP,
//! Every four vertices create a quad.
EPT_QUADS,
//! Just as LINE_LOOP, but filled.
EPT_POLYGON,
//! The single vertices are expanded to quad billboards on the GPU.
EPT_POINT_SPRITES
};
} // end namespace scene
} // end namespace irr
#endif
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "EShaderTypes.h" #include "EShaderTypes.h"
#include "EMaterialTypes.h" #include "EMaterialTypes.h"
#include "EPrimitiveTypes.h"
#include "path.h" #include "path.h"
namespace irr namespace irr
...@@ -52,6 +53,10 @@ public: ...@@ -52,6 +53,10 @@ public:
geometryShaderEntryPointName geometryShaderEntryPointName
\param gsCompileTarget: Geometry shader version the high level shader \param gsCompileTarget: Geometry shader version the high level shader
shall be compiled to. shall be compiled to.
\param inType Type of vertices passed to geometry shader
\param outType Type of vertices created by geometry shader
\param verticesOut Maximal number of vertices created by geometry
shader. If 0, maximal number supported is assumed.
\param callback: Pointer to an implementation of \param callback: Pointer to an implementation of
IShaderConstantSetCallBack in which you can set the needed vertex, IShaderConstantSetCallBack in which you can set the needed vertex,
pixel, and geometry shader program constants. Set this to 0 if you pixel, and geometry shader program constants. Set this to 0 if you
...@@ -78,6 +83,9 @@ public: ...@@ -78,6 +83,9 @@ public:
const c8* geometryShaderProgram = 0, const c8* geometryShaderProgram = 0,
const c8* geometryShaderEntryPointName = "main", const c8* geometryShaderEntryPointName = "main",
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0,
IShaderConstantSetCallBack* callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0 ) = 0; s32 userData = 0 ) = 0;
...@@ -99,6 +107,7 @@ public: ...@@ -99,6 +107,7 @@ public:
vsCompileTarget, pixelShaderProgram, vsCompileTarget, pixelShaderProgram,
pixelShaderEntryPointName, psCompileTarget, pixelShaderEntryPointName, psCompileTarget,
0, "main", EGST_GS_4_0, 0, "main", EGST_GS_4_0,
scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0,
callback, baseMaterial, userData); callback, baseMaterial, userData);
} }
...@@ -124,6 +133,10 @@ public: ...@@ -124,6 +133,10 @@ public:
geometryShaderEntryPointName geometryShaderEntryPointName
\param gsCompileTarget: Geometry shader version the high level shader \param gsCompileTarget: Geometry shader version the high level shader
shall be compiled to. shall be compiled to.
\param inType Type of vertices passed to geometry shader
\param outType Type of vertices created by geometry shader
\param verticesOut Maximal number of vertices created by geometry
shader. If 0, maximal number supported is assumed.
\param callback: Pointer to an implementation of \param callback: Pointer to an implementation of
IShaderConstantSetCallBack in which you can set the needed vertex, IShaderConstantSetCallBack in which you can set the needed vertex,
pixel, and geometry shader program constants. Set this to 0 if you pixel, and geometry shader program constants. Set this to 0 if you
...@@ -150,6 +163,9 @@ public: ...@@ -150,6 +163,9 @@ public:
const io::path& geometryShaderProgramFileName="", const io::path& geometryShaderProgramFileName="",
const c8* geometryShaderEntryPointName = "main", const c8* geometryShaderEntryPointName = "main",
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0,
IShaderConstantSetCallBack* callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) = 0; s32 userData = 0) = 0;
...@@ -171,6 +187,7 @@ public: ...@@ -171,6 +187,7 @@ public:
vsCompileTarget, pixelShaderProgramFileName, vsCompileTarget, pixelShaderProgramFileName,
pixelShaderEntryPointName, psCompileTarget, pixelShaderEntryPointName, psCompileTarget,
"", "main", EGST_GS_4_0, "", "main", EGST_GS_4_0,
scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0,
callback, baseMaterial, userData); callback, baseMaterial, userData);
} }
...@@ -195,6 +212,10 @@ public: ...@@ -195,6 +212,10 @@ public:
geometryShaderEntryPointName geometryShaderEntryPointName
\param gsCompileTarget: Geometry shader version the high level shader \param gsCompileTarget: Geometry shader version the high level shader
shall be compiled to. shall be compiled to.
\param inType Type of vertices passed to geometry shader
\param outType Type of vertices created by geometry shader
\param verticesOut Maximal number of vertices created by geometry
shader. If 0, maximal number supported is assumed.
\param callback: Pointer to an implementation of \param callback: Pointer to an implementation of
IShaderConstantSetCallBack in which you can set the needed vertex and IShaderConstantSetCallBack in which you can set the needed vertex and
pixel shader program constants. Set this to 0 if you don't need this. pixel shader program constants. Set this to 0 if you don't need this.
...@@ -220,6 +241,9 @@ public: ...@@ -220,6 +241,9 @@ public:
io::IReadFile* geometryShaderProgram = 0, io::IReadFile* geometryShaderProgram = 0,
const c8* geometryShaderEntryPointName = "main", const c8* geometryShaderEntryPointName = "main",
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0,
IShaderConstantSetCallBack* callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0) = 0; s32 userData = 0) = 0;
...@@ -241,6 +265,7 @@ public: ...@@ -241,6 +265,7 @@ public:
vsCompileTarget, pixelShaderProgram, vsCompileTarget, pixelShaderProgram,
pixelShaderEntryPointName, psCompileTarget, pixelShaderEntryPointName, psCompileTarget,
0, "main", EGST_GS_4_0, 0, "main", EGST_GS_4_0,
scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0,
callback, baseMaterial, userData); callback, baseMaterial, userData);
} }
......
...@@ -11,51 +11,12 @@ ...@@ -11,51 +11,12 @@
#include "S3DVertex.h" #include "S3DVertex.h"
#include "SVertexIndex.h" #include "SVertexIndex.h"
#include "EHardwareBufferFlags.h" #include "EHardwareBufferFlags.h"
#include "EPrimitiveTypes.h"
namespace irr namespace irr
{ {
namespace scene namespace scene
{ {
//! Enumeration for all primitive types there are.
enum E_PRIMITIVE_TYPE
{
//! All vertices are non-connected points.
EPT_POINTS=0,
//! All vertices form a single connected line.
EPT_LINE_STRIP,
//! Just as LINE_STRIP, but the last and the first vertex is also connected.
EPT_LINE_LOOP,
//! Every two vertices are connected creating n/2 lines.
EPT_LINES,
//! After the first two vertices each vertex defines a new triangle.
//! Always the two last and the new one form a new triangle.
EPT_TRIANGLE_STRIP,
//! After the first two vertices each vertex defines a new triangle.
//! All around the common first vertex.
EPT_TRIANGLE_FAN,
//! Explicitly set all vertices for each triangle.
EPT_TRIANGLES,
//! After the first two vertices each further tw vetices create a quad with the preceding two.
EPT_QUAD_STRIP,
//! Every four vertices create a quad.
EPT_QUADS,
//! Just as LINE_LOOP, but filled.
EPT_POLYGON,
//! The single vertices are expanded to quad billboards on the GPU.
EPT_POINT_SPRITES
};
//! Struct for holding a mesh with a single material. //! Struct for holding a mesh with a single material.
/** A part of an IMesh which has the same material on each face of that /** A part of an IMesh which has the same material on each face of that
group. Logical groups of an IMesh need not be put into separate mesh group. Logical groups of an IMesh need not be put into separate mesh
......
...@@ -2913,6 +2913,8 @@ s32 CD3D9Driver::addHighLevelShaderMaterial( ...@@ -2913,6 +2913,8 @@ s32 CD3D9Driver::addHighLevelShaderMaterial(
const c8* geometryShaderProgram, const c8* geometryShaderProgram,
const c8* geometryShaderEntryPointName, const c8* geometryShaderEntryPointName,
E_GEOMETRY_SHADER_TYPE gsCompileTarget, E_GEOMETRY_SHADER_TYPE gsCompileTarget,
scene::E_PRIMITIVE_TYPE inType, scene::E_PRIMITIVE_TYPE outType,
u32 verticesOut,
IShaderConstantSetCallBack* callback, IShaderConstantSetCallBack* callback,
E_MATERIAL_TYPE baseMaterial, s32 userData) E_MATERIAL_TYPE baseMaterial, s32 userData)
{ {
......
...@@ -349,6 +349,9 @@ namespace video ...@@ -349,6 +349,9 @@ namespace video
const c8* geometryShaderProgram = 0, const c8* geometryShaderProgram = 0,
const c8* geometryShaderEntryPointName = "main", const c8* geometryShaderEntryPointName = "main",
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0,
IShaderConstantSetCallBack* callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData=0); s32 userData=0);
......
...@@ -1796,6 +1796,8 @@ s32 CNullDriver::addHighLevelShaderMaterial( ...@@ -1796,6 +1796,8 @@ s32 CNullDriver::addHighLevelShaderMaterial(
const c8* geometryShaderProgram, const c8* geometryShaderProgram,
const c8* geometryShaderEntryPointName, const c8* geometryShaderEntryPointName,
E_GEOMETRY_SHADER_TYPE gsCompileTarget, E_GEOMETRY_SHADER_TYPE gsCompileTarget,
scene::E_PRIMITIVE_TYPE inType, scene::E_PRIMITIVE_TYPE outType,
u32 verticesOut,
IShaderConstantSetCallBack* callback, IShaderConstantSetCallBack* callback,
E_MATERIAL_TYPE baseMaterial, E_MATERIAL_TYPE baseMaterial,
s32 userData) s32 userData)
...@@ -1817,6 +1819,8 @@ s32 CNullDriver::addHighLevelShaderMaterialFromFiles( ...@@ -1817,6 +1819,8 @@ s32 CNullDriver::addHighLevelShaderMaterialFromFiles(
const io::path& geometryShaderProgramFileName, const io::path& geometryShaderProgramFileName,
const c8* geometryShaderEntryPointName, const c8* geometryShaderEntryPointName,
E_GEOMETRY_SHADER_TYPE gsCompileTarget, E_GEOMETRY_SHADER_TYPE gsCompileTarget,
scene::E_PRIMITIVE_TYPE inType, scene::E_PRIMITIVE_TYPE outType,
u32 verticesOut,
IShaderConstantSetCallBack* callback, IShaderConstantSetCallBack* callback,
E_MATERIAL_TYPE baseMaterial, E_MATERIAL_TYPE baseMaterial,
s32 userData) s32 userData)
...@@ -1859,6 +1863,7 @@ s32 CNullDriver::addHighLevelShaderMaterialFromFiles( ...@@ -1859,6 +1863,7 @@ s32 CNullDriver::addHighLevelShaderMaterialFromFiles(
vsfile, vertexShaderEntryPointName, vsCompileTarget, vsfile, vertexShaderEntryPointName, vsCompileTarget,
psfile, pixelShaderEntryPointName, psCompileTarget, psfile, pixelShaderEntryPointName, psCompileTarget,
gsfile, geometryShaderEntryPointName, gsCompileTarget, gsfile, geometryShaderEntryPointName, gsCompileTarget,
inType, outType, verticesOut,
callback, baseMaterial, userData); callback, baseMaterial, userData);
if (psfile) if (psfile)
...@@ -1886,6 +1891,8 @@ s32 CNullDriver::addHighLevelShaderMaterialFromFiles( ...@@ -1886,6 +1891,8 @@ s32 CNullDriver::addHighLevelShaderMaterialFromFiles(
io::IReadFile* geometryShaderProgram, io::IReadFile* geometryShaderProgram,
const c8* geometryShaderEntryPointName, const c8* geometryShaderEntryPointName,
E_GEOMETRY_SHADER_TYPE gsCompileTarget, E_GEOMETRY_SHADER_TYPE gsCompileTarget,
scene::E_PRIMITIVE_TYPE inType, scene::E_PRIMITIVE_TYPE outType,
u32 verticesOut,
IShaderConstantSetCallBack* callback, IShaderConstantSetCallBack* callback,
E_MATERIAL_TYPE baseMaterial, E_MATERIAL_TYPE baseMaterial,
s32 userData) s32 userData)
...@@ -1938,6 +1945,7 @@ s32 CNullDriver::addHighLevelShaderMaterialFromFiles( ...@@ -1938,6 +1945,7 @@ s32 CNullDriver::addHighLevelShaderMaterialFromFiles(
vs, vertexShaderEntryPointName, vsCompileTarget, vs, vertexShaderEntryPointName, vsCompileTarget,
ps, pixelShaderEntryPointName, psCompileTarget, ps, pixelShaderEntryPointName, psCompileTarget,
gs, geometryShaderEntryPointName, gsCompileTarget, gs, geometryShaderEntryPointName, gsCompileTarget,
inType, outType, verticesOut,
callback, baseMaterial, userData); callback, baseMaterial, userData);
delete [] vs; delete [] vs;
......
...@@ -482,6 +482,9 @@ namespace video ...@@ -482,6 +482,9 @@ namespace video
const c8* geometryShaderProgram = 0, const c8* geometryShaderProgram = 0,
const c8* geometryShaderEntryPointName = "main", const c8* geometryShaderEntryPointName = "main",
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0,
IShaderConstantSetCallBack* callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData=0); s32 userData=0);
...@@ -498,6 +501,9 @@ namespace video ...@@ -498,6 +501,9 @@ namespace video
const io::path& geometryShaderProgramFileName="", const io::path& geometryShaderProgramFileName="",
const c8* geometryShaderEntryPointName = "main", const c8* geometryShaderEntryPointName = "main",
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0,
IShaderConstantSetCallBack* callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData=0); s32 userData=0);
...@@ -514,6 +520,9 @@ namespace video ...@@ -514,6 +520,9 @@ namespace video
io::IReadFile* geometryShaderProgram= 0, io::IReadFile* geometryShaderProgram= 0,
const c8* geometryShaderEntryPointName = "main", const c8* geometryShaderEntryPointName = "main",
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0,
IShaderConstantSetCallBack* callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData=0); s32 userData=0);
......
...@@ -3253,6 +3253,9 @@ s32 COpenGLDriver::addHighLevelShaderMaterial( ...@@ -3253,6 +3253,9 @@ s32 COpenGLDriver::addHighLevelShaderMaterial(
const c8* geometryShaderProgram, const c8* geometryShaderProgram,
const c8* geometryShaderEntryPointName, const c8* geometryShaderEntryPointName,
E_GEOMETRY_SHADER_TYPE gsCompileTarget, E_GEOMETRY_SHADER_TYPE gsCompileTarget,
scene::E_PRIMITIVE_TYPE inType,
scene::E_PRIMITIVE_TYPE outType,
u32 verticesOut,
IShaderConstantSetCallBack* callback, IShaderConstantSetCallBack* callback,
E_MATERIAL_TYPE baseMaterial, E_MATERIAL_TYPE baseMaterial,
s32 userData) s32 userData)
...@@ -3264,6 +3267,7 @@ s32 COpenGLDriver::addHighLevelShaderMaterial( ...@@ -3264,6 +3267,7 @@ s32 COpenGLDriver::addHighLevelShaderMaterial(
vertexShaderProgram, vertexShaderEntryPointName, vsCompileTarget, vertexShaderProgram, vertexShaderEntryPointName, vsCompileTarget,
pixelShaderProgram, pixelShaderEntryPointName, psCompileTarget, pixelShaderProgram, pixelShaderEntryPointName, psCompileTarget,
geometryShaderProgram, geometryShaderEntryPointName, gsCompileTarget, geometryShaderProgram, geometryShaderEntryPointName, gsCompileTarget,
inType, outType, verticesOut,
callback,getMaterialRenderer(baseMaterial), userData); callback,getMaterialRenderer(baseMaterial), userData);
r->drop(); r->drop();
return nr; return nr;
...@@ -3733,6 +3737,41 @@ core::dimension2du COpenGLDriver::getMaxTextureSize() const ...@@ -3733,6 +3737,41 @@ core::dimension2du COpenGLDriver::getMaxTextureSize() const
return core::dimension2du(MaxTextureSize, MaxTextureSize); return core::dimension2du(MaxTextureSize, MaxTextureSize);
} }
//! Convert E_PRIMITIVE_TYPE to OpenGL equivalent
GLenum COpenGLDriver::primitiveTypeToGL(scene::E_PRIMITIVE_TYPE type) const
{
switch (type)
{
case scene::EPT_POINTS:
return GL_POINTS;
case scene::EPT_LINE_STRIP:
return GL_LINE_STRIP;
case scene::EPT_LINE_LOOP:
return GL_LINE_LOOP;
case scene::EPT_LINES:
return GL_LINES;
case scene::EPT_TRIANGLE_STRIP:
return GL_TRIANGLE_STRIP;
case scene::EPT_TRIANGLE_FAN:
return GL_TRIANGLE_FAN;
case scene::EPT_TRIANGLES:
return GL_TRIANGLES;
case scene::EPT_QUAD_STRIP:
return GL_QUAD_STRIP;
case scene::EPT_QUADS:
return GL_QUADS;
case scene::EPT_POLYGON:
return GL_POLYGON;
case scene::EPT_POINT_SPRITES:
#ifdef GL_ARB_point_sprite
return GL_POINT_SPRITE_ARB;
#else
return GL_POINTS;
#endif
}
return GL_TRIANGLES;
}
} // end namespace } // end namespace
} // end namespace } // end namespace
......
...@@ -271,6 +271,9 @@ namespace video ...@@ -271,6 +271,9 @@ namespace video
const c8* geometryShaderProgram = 0, const c8* geometryShaderProgram = 0,
const c8* geometryShaderEntryPointName = "main", const c8* geometryShaderEntryPointName = "main",
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0,
IShaderConstantSetCallBack* callback = 0, IShaderConstantSetCallBack* callback = 0,
E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
s32 userData = 0); s32 userData = 0);
...@@ -331,6 +334,9 @@ namespace video ...@@ -331,6 +334,9 @@ namespace video
ITexture* createDepthTexture(ITexture* texture, bool shared=true); ITexture* createDepthTexture(ITexture* texture, bool shared=true);
void removeDepthTexture(ITexture* texture); void removeDepthTexture(ITexture* texture);
//! Convert E_PRIMITIVE_TYPE to OpenGL equivalent
GLenum primitiveTypeToGL(scene::E_PRIMITIVE_TYPE type) const;
private: private:
//! clears the zbuffer and color buffer //! clears the zbuffer and color buffer
......
...@@ -38,6 +38,8 @@ COpenGLSLMaterialRenderer::COpenGLSLMaterialRenderer(video::COpenGLDriver* drive ...@@ -38,6 +38,8 @@ COpenGLSLMaterialRenderer::COpenGLSLMaterialRenderer(video::COpenGLDriver* drive
const c8* geometryShaderProgram, const c8* geometryShaderProgram,
const c8* geometryShaderEntryPointName, const c8* geometryShaderEntryPointName,
E_GEOMETRY_SHADER_TYPE gsCompileTarget, E_GEOMETRY_SHADER_TYPE gsCompileTarget,
scene::E_PRIMITIVE_TYPE inType, scene::E_PRIMITIVE_TYPE outType,
u32 verticesOut,
IShaderConstantSetCallBack* callback, IShaderConstantSetCallBack* callback,
video::IMaterialRenderer* baseMaterial, video::IMaterialRenderer* baseMaterial,
s32 userData) s32 userData)
...@@ -103,7 +105,9 @@ COpenGLSLMaterialRenderer::~COpenGLSLMaterialRenderer() ...@@ -103,7 +105,9 @@ COpenGLSLMaterialRenderer::~COpenGLSLMaterialRenderer()
void COpenGLSLMaterialRenderer::init(s32& outMaterialTypeNr, void COpenGLSLMaterialRenderer::init(s32& outMaterialTypeNr,
const c8* vertexShaderProgram, const c8* vertexShaderProgram,
const c8* pixelShaderProgram, const c8* pixelShaderProgram,
const c8* geometryShaderProgram) const c8* geometryShaderProgram,
scene::E_PRIMITIVE_TYPE inType, scene::E_PRIMITIVE_TYPE outType,
u32 verticesOut)
{ {
outMaterialTypeNr = -1; outMaterialTypeNr = -1;
...@@ -122,8 +126,23 @@ void COpenGLSLMaterialRenderer::init(s32& outMaterialTypeNr, ...@@ -122,8 +126,23 @@ void COpenGLSLMaterialRenderer::init(s32& outMaterialTypeNr,
#if defined(GL_ARB_geometry_shader4) || defined(GL_EXT_geometry_shader4) || defined(GL_NV_geometry_program4) || defined(GL_NV_geometry_shader4) #if defined(GL_ARB_geometry_shader4) || defined(GL_EXT_geometry_shader4) || defined(GL_NV_geometry_program4) || defined(GL_NV_geometry_shader4)
if (geometryShaderProgram && Driver->queryFeature(EVDF_GEOMETRY_SHADER)) if (geometryShaderProgram && Driver->queryFeature(EVDF_GEOMETRY_SHADER))
{
if (!createShader(GL_GEOMETRY_SHADER_EXT, geometryShaderProgram)) if (!createShader(GL_GEOMETRY_SHADER_EXT, geometryShaderProgram))
return; return;
#if defined(GL_ARB_geometry_shader4) || defined(GL_EXT_geometry_shader4) || defined(GL_NV_geometry_shader4)
Driver->extGlProgramParameteri(Program, GL_GEOMETRY_INPUT_TYPE_EXT, Driver->primitiveTypeToGL(inType));
Driver->extGlProgramParameteri(Program, GL_GEOMETRY_OUTPUT_TYPE_EXT, Driver->primitiveTypeToGL(outType));
if (verticesOut==0)
Driver->extGlProgramParameteri(Program, GL_GEOMETRY_VERTICES_OUT_EXT, Driver->MaxGeometryVerticesOut);
else
Driver->extGlProgramParameteri(Program, GL_GEOMETRY_VERTICES_OUT_EXT, core::min_(verticesOut, Driver->MaxGeometryVerticesOut));
#elif defined(GL_NV_geometry_program4)
if (verticesOut==0)
Driver->extGlProgramVertexLimit(GL_GEOMETRY_PROGRAM_NV, Driver->MaxGeometryVerticesOut);
else
Driver->extGlProgramVertexLimit(GL_GEOMETRY_PROGRAM_NV, core::min_(verticesOut, Driver->MaxGeometryVerticesOut));
#endif
}
#endif #endif
if (!linkProgram()) if (!linkProgram())
...@@ -225,19 +244,6 @@ bool COpenGLSLMaterialRenderer::createShader(GLenum shaderType, const char* shad ...@@ -225,19 +244,6 @@ bool COpenGLSLMaterialRenderer::createShader(GLenum shaderType, const char* shad
Driver->extGlAttachObject(Program, shaderHandle); Driver->extGlAttachObject(Program, shaderHandle);
#if defined(GL_ARB_geometry_shader4) || defined(GL_EXT_geometry_shader4) || defined(GL_NV_geometry_shader4) || defined(GL_NV_geometry_program4)
if (shaderType==GL_GEOMETRY_SHADER_EXT && Driver->queryFeature(EVDF_GEOMETRY_SHADER))
{
#if defined(GL_ARB_geometry_shader4) || defined(GL_EXT_geometry_shader4) || defined(GL_NV_geometry_shader4)
Driver->extGlProgramParameteri(Program, GL_GEOMETRY_INPUT_TYPE_EXT, GL_TRIANGLES);
Driver->extGlProgramParameteri(Program, GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_TRIANGLE_STRIP);
Driver->extGlProgramParameteri(Program, GL_GEOMETRY_VERTICES_OUT_EXT, Driver->MaxGeometryVerticesOut);
#elif defined(GL_NV_geometry_program4)
Driver->extGlProgramVertexLimit(GL_GEOMETRY_PROGRAM_NV, Driver->MaxGeometryVerticesOut);
#endif
}
#endif
return true; return true;
} }
......
...@@ -63,6 +63,9 @@ public: ...@@ -63,6 +63,9 @@ public:
const c8* geometryShaderProgram = 0, const c8* geometryShaderProgram = 0,
const c8* geometryShaderEntryPointName = "main", const c8* geometryShaderEntryPointName = "main",
E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,
scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,
u32 verticesOut = 0,
IShaderConstantSetCallBack* callback = 0, IShaderConstantSetCallBack* callback = 0,
IMaterialRenderer* baseMaterial = 0, IMaterialRenderer* baseMaterial = 0,
s32 userData = 0); s32 userData = 0);
...@@ -100,7 +103,10 @@ protected: ...@@ -100,7 +103,10 @@ protected:
void init(s32& outMaterialTypeNr, void init(s32& outMaterialTypeNr,
const c8* vertexShaderProgram, const c8* vertexShaderProgram,
const c8* pixelShaderProgram, const c8* pixelShaderProgram,
const c8* geometryShaderProgram); const c8* geometryShaderProgram,
scene::E_PRIMITIVE_TYPE inType=scene::EPT_TRIANGLES,
scene::E_PRIMITIVE_TYPE outType=scene::EPT_TRIANGLE_STRIP,
u32 verticesOut=0);
bool createProgram(); bool createProgram();
bool createShader(GLenum shaderType, const char* shader); bool createShader(GLenum shaderType, const char* shader);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment