1
0

Merging r6364 through r6379 from trunk to ogl-es branch

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@6380 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
cutealien
2022-05-04 21:38:12 +00:00
parent 993f990036
commit 67a488fc5c
227 changed files with 19006 additions and 5574 deletions

View File

@@ -10,10 +10,7 @@
#include "CSoftwareDriver2.h"
#include "IShaderConstantSetCallBack.h"
namespace irr
{
namespace video
{
burning_namespace_start
const tFixPointu IBurningShader::dithermask[] =
{
@@ -23,14 +20,14 @@ const tFixPointu IBurningShader::dithermask[] =
0xf0,0x70,0xd0,0x50
};
void IBurningShader::constructor_IBurningShader(CBurningVideoDriver* driver)
void IBurningShader::constructor_IBurningShader(CBurningVideoDriver* driver, E_MATERIAL_TYPE baseMaterial)
{
#ifdef _DEBUG
setDebugName("IBurningShader");
#endif
#if defined(ENV64BIT)
if (((unsigned long long)&scan & 15) || ((unsigned long long)&line & 15))
if (((unsigned long long) & scan & 15) || ((unsigned long long) & line & 15))
{
os::Printer::log("BurningVideo Shader not 16 byte aligned", ELL_ERROR);
IRR_DEBUG_BREAK_IF(1);
@@ -42,7 +39,6 @@ void IBurningShader::constructor_IBurningShader(CBurningVideoDriver* driver)
Interlaced.nr = 0;
EdgeTestPass = edge_test_pass;
EdgeTestPass_stack = edge_test_pass;
for (u32 i = 0; i < BURNING_MATERIAL_MAX_TEXTURES; ++i)
{
@@ -66,14 +62,37 @@ void IBurningShader::constructor_IBurningShader(CBurningVideoDriver* driver)
stencilOp[1] = StencilOp_KEEP;
stencilOp[2] = StencilOp_KEEP;
AlphaRef = 0;
RenderPass_ShaderIsTransparent = 0;
PrimitiveColor = COLOR_BRIGHT_WHITE;
TL_Flag = 0;
fragment_draw_count = 0;
VertexShaderProgram_buildin = BVT_Fix;
//set default Transparent/Solid
BaseMaterial = baseMaterial;
switch (BaseMaterial)
{
case EMT_TRANSPARENT_ADD_COLOR:
case EMT_TRANSPARENT_ALPHA_CHANNEL:
case EMT_TRANSPARENT_ALPHA_CHANNEL_REF:
case EMT_TRANSPARENT_VERTEX_ALPHA:
case EMT_TRANSPARENT_REFLECTION_2_LAYER:
case EMT_NORMAL_MAP_TRANSPARENT_ADD_COLOR:
case EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA:
case EMT_PARALLAX_MAP_TRANSPARENT_ADD_COLOR:
case EMT_PARALLAX_MAP_TRANSPARENT_VERTEX_ALPHA:
case EMT_ONETEXTURE_BLEND:
RenderPass_ShaderIsTransparent = 1;
break;
default:
RenderPass_ShaderIsTransparent = 0;
break;
}
}
IBurningShader::IBurningShader(CBurningVideoDriver* driver)
IBurningShader::IBurningShader(CBurningVideoDriver* driver,E_MATERIAL_TYPE baseMaterial)
{
constructor_IBurningShader(driver);
constructor_IBurningShader(driver, baseMaterial);
}
//! Constructor
@@ -96,15 +115,55 @@ IBurningShader::IBurningShader(
E_MATERIAL_TYPE baseMaterial,
s32 userData)
{
constructor_IBurningShader(driver);
BaseMaterial = baseMaterial;
constructor_IBurningShader(driver, baseMaterial);
UserData = userData;
CallBack = callback;
if (CallBack)
CallBack->grab();
//v0.53 compile. only buildin
const c8* ip = vertexShaderProgram;
unsigned hash = 0;
unsigned len = 0;
if (ip)
{
while (ip[len])
{
hash = ip[len] + (hash << 6) + (hash << 16) - hash;
len += 1;
}
}
if (len == 815 && hash == 0x1f847599) VertexShaderProgram_buildin = BVT_815_0x1f847599; /* pp_opengl.vert */
else if (len == 1100 && hash == 0x12c79d1c) VertexShaderProgram_buildin = BVT_opengl_vsh_shaderexample; /*opengl.vert */
else if (len == 1259 && hash == 0xc8226e1a) VertexShaderProgram_buildin = STK_1259_0xc8226e1a; /* supertuxkart bubble.vert */
else if (len == 958 && hash == 0xa048973b) VertexShaderProgram_buildin = STK_958_0xa048973b; /* supertuxkart motion_blur.vert */
else if (len == 1309 && hash == 0x1fd689c2) VertexShaderProgram_buildin = STK_1309_0x1fd689c2; /* supertuxkart normalmap.vert */
else if (len == 1204 && hash == 0x072a4094) VertexShaderProgram_buildin = STK_1204_0x072a4094; /* supertuxkart splatting.vert */
else if (len == 1303 && hash == 0xd872cdb6) VertexShaderProgram_buildin = STK_1303_0xd872cdb6; /* supertuxkart water.vert */
//VertexShaderProgram = vertexShaderProgram;
//PixelShaderProgram = pixelShaderProgram;
// register myself as new material
outMaterialTypeNr = Driver->addMaterialRenderer(this);
//save info
#if 0
static int run = 0;
FILE* f = fopen("shader_id.txt", run ? "a" : "wb");
if (f)
{
fprintf(f, "--- start outMaterialTypeNr:%d len:%d hash: 0x%08x buildIn:%d\n"
, outMaterialTypeNr, len, hash, VertexShaderProgram_buildin);
fprintf(f, "%s", vertexShaderProgram);
fprintf(f, "\n-------------- end ---------------------------\n");
fclose(f);
}
run += 1;
#endif
}
@@ -139,7 +198,7 @@ void IBurningShader::setRenderTarget(video::IImage* surface, const core::rect<s3
if (RenderTarget)
RenderTarget->drop();
RenderTarget = (video::CImage*) surface;
RenderTarget = (video::CImage*)surface;
if (RenderTarget)
{
@@ -156,7 +215,9 @@ void IBurningShader::setTextureParam(const size_t stage, video::CSoftwareTexture
sInternalTexture* it = &IT[stage];
if (it->Texture)
{
it->Texture->drop();
}
it->Texture = texture;
@@ -212,9 +273,12 @@ void IBurningShader::drawPoint(const s4DVertex* a)
{
}
void IBurningShader::drawWireFrameTriangle(const s4DVertex* a, const s4DVertex* b, const s4DVertex* c)
void IBurningShader::drawWireFrameTriangle(s4DVertex* a, s4DVertex* b, s4DVertex* c)
{
if (EdgeTestPass & edge_test_pass) drawTriangle(a, b, c);
if (EdgeTestPass & edge_test_pass)
{
drawTriangle(a, b, c);
}
else if (EdgeTestPass & edge_test_point)
{
drawPoint(a);
@@ -234,7 +298,7 @@ void IBurningShader::OnSetMaterial(const SMaterial& material, const SMaterial& l
bool resetAllRenderstates, IMaterialRendererServices* services)
{
if (Driver)
Driver->setFallback_Material(BaseMaterial);
Driver->setFallback_Material(BaseMaterial, VertexShaderProgram_buildin);
services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
if (CallBack)
CallBack->OnSetMaterial(material);
@@ -243,6 +307,7 @@ void IBurningShader::OnSetMaterial(const SMaterial& material, const SMaterial& l
void IBurningShader::OnUnsetMaterial()
{
//restore previous state
}
bool IBurningShader::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype)
@@ -273,6 +338,22 @@ void IBurningShader::setBasicRenderStates(const SMaterial& material, const SMate
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
}
static BurningUniform _empty = { "null",BL_VERTEX_FLOAT,{0.f,0.f,0.f,0.f} };
const f32* IBurningShader::getUniform(const c8* name, EBurningUniformFlags flags) const
{
const size_t size = UniformInfo.size();
if (size && name && name[0])
{
const BurningUniform* b = &UniformInfo[0];
for (size_t i = 0; i < size; ++i)
{
if (tiny_istoken(b[i].name, name))
return b[i].data;
}
}
return _empty.data;
}
s32 IBurningShader::getShaderConstantID(EBurningUniformFlags flags, const c8* name)
{
if (!name || !name[0])
@@ -315,15 +396,6 @@ bool IBurningShader::setShaderConstantID(EBurningUniformFlags flags, s32 index,
{
if ((u32)index >= UniformInfo.size())
return false;
#if 0
BurningUniform add;
while ((u32)index >= UniformInfo.size())
{
tiny_strcpy(add.name, tiny_itoa(UniformInfo.size(), 10));
add.type = flags;
UniformInfo.push_back(add);
}
#endif
BurningUniform& use = UniformInfo[index];
use.type = flags;
@@ -357,7 +429,7 @@ void IBurningShader::setVertexShaderConstant(const f32* data, s32 startRegister,
c8 name[BL_ACTIVE_UNIFORM_MAX_LENGTH];
tiny_strcpy(name, tiny_itoa(startRegister, 10));
setShaderConstantID(BL_VERTEX_FLOAT, getShaderConstantID(BL_VERTEX_PROGRAM, name), data, constantAmount);
setShaderConstantID(BL_VERTEX_FLOAT, getShaderConstantID(BL_VERTEX_PROGRAM, name), data, constantAmount*4);
}
void IBurningShader::setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount)
@@ -365,7 +437,7 @@ void IBurningShader::setPixelShaderConstant(const f32* data, s32 startRegister,
c8 name[BL_ACTIVE_UNIFORM_MAX_LENGTH];
tiny_strcpy(name, tiny_itoa(startRegister, 10));
setShaderConstantID(BL_FRAGMENT_FLOAT, getShaderConstantID(BL_FRAGMENT_PROGRAM, name), data, constantAmount);
setShaderConstantID(BL_FRAGMENT_FLOAT, getShaderConstantID(BL_FRAGMENT_PROGRAM, name), data, constantAmount*4);
}
bool IBurningShader::setVertexShaderConstant(s32 index, const f32* floats, int count)
@@ -405,6 +477,27 @@ void IBurningShader::setStencilOp(eBurningStencilOp sfail, eBurningStencilOp dpf
stencilOp[2] = dppass;
}
void PushShaderData::push(IBurningShader* shader)
{
CurrentShader = shader;
if (shader) shader->pushShader(this,1);
}
void PushShaderData::pop()
{
if (CurrentShader) CurrentShader->pushShader(this, 0);
}
void IBurningShader::pushShader(PushShaderData* data, int save)
{
if (save)
{
data->EdgeTestPass = EdgeTestPass;
}
else
{
EdgeTestPass = data->EdgeTestPass;
}
}
IVideoDriver* IBurningShader::getVideoDriver()
{
@@ -412,7 +505,6 @@ IVideoDriver* IBurningShader::getVideoDriver()
}
} // end namespace video
} // end namespace irr
burning_namespace_end
#endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_