SuperTuxKart 1.5 upstream source (from official release tarball)
This commit is contained in:
@@ -0,0 +1,198 @@
|
||||
// Copyright (C) 2013 Patryk Nadrowski
|
||||
// Heavily based on the OpenGL driver implemented by Nikolaus Gebhardt
|
||||
// OpenGL ES driver implemented by Christian Stehno and first OpenGL ES 2.0
|
||||
// driver implemented by Amundis.
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in Irrlicht.h
|
||||
|
||||
#include "IrrCompileConfig.h"
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_OGLES2_
|
||||
|
||||
#include "COGLES2FixedPipelineRenderer.h"
|
||||
#include "IGPUProgrammingServices.h"
|
||||
#include "os.h"
|
||||
#include "COGLES2Driver.h"
|
||||
|
||||
#include "ge_render_info.hpp"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
|
||||
//! Constructor
|
||||
COGLES2FixedPipelineRenderer::COGLES2FixedPipelineRenderer(const c8* vertexShaderProgram,
|
||||
const c8* pixelShaderProgram, E_MATERIAL_TYPE baseMaterial,
|
||||
COGLES2Driver* driver)
|
||||
: COGLES2MaterialRenderer(driver, 0, baseMaterial)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
setDebugName("COGLES2FixedPipelineRenderer");
|
||||
#endif
|
||||
yy = (int)baseMaterial;
|
||||
int Temp = 0;
|
||||
|
||||
SharedRenderer = reinterpret_cast<COGLES2MaterialRenderer*>(driver->getMaterialRenderer(EMT_SOLID));
|
||||
|
||||
if (SharedRenderer)
|
||||
SharedRenderer->grab();
|
||||
else
|
||||
init(Temp, vertexShaderProgram, pixelShaderProgram, false);
|
||||
}
|
||||
|
||||
|
||||
//! Destructor
|
||||
COGLES2FixedPipelineRenderer::~COGLES2FixedPipelineRenderer()
|
||||
{
|
||||
if(SharedRenderer)
|
||||
SharedRenderer->drop();
|
||||
}
|
||||
|
||||
|
||||
void COGLES2FixedPipelineRenderer::OnSetMaterial(const video::SMaterial& material,
|
||||
const video::SMaterial& lastMaterial,
|
||||
bool resetAllRenderstates,
|
||||
video::IMaterialRendererServices* services)
|
||||
{
|
||||
if (SharedRenderer)
|
||||
Driver->getBridgeCalls()->setProgram(SharedRenderer->getProgram());
|
||||
else
|
||||
Driver->getBridgeCalls()->setProgram(Program);
|
||||
|
||||
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
|
||||
|
||||
if (FixedBlending)
|
||||
{
|
||||
Driver->getBridgeCalls()->setBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
|
||||
Driver->getBridgeCalls()->setBlend(true);
|
||||
}
|
||||
else if (Blending)
|
||||
{
|
||||
E_BLEND_FACTOR srcFact,dstFact;
|
||||
E_MODULATE_FUNC modulate;
|
||||
u32 alphaSource;
|
||||
unpack_textureBlendFunc(srcFact, dstFact, modulate, alphaSource, material.MaterialTypeParam);
|
||||
|
||||
Driver->getBridgeCalls()->setBlendFunc(Driver->getGLBlend(srcFact), Driver->getGLBlend(dstFact));
|
||||
Driver->getBridgeCalls()->setBlend(true);
|
||||
}
|
||||
else
|
||||
Driver->getBridgeCalls()->setBlend(false);
|
||||
}
|
||||
|
||||
|
||||
bool COGLES2FixedPipelineRenderer::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype)
|
||||
{
|
||||
if (SharedRenderer)
|
||||
return SharedRenderer->OnRender(service, vtxtype);
|
||||
else
|
||||
{
|
||||
Driver->setTextureRenderStates(Driver->getCurrentMaterial(), false);
|
||||
|
||||
s32 materialType = 0;
|
||||
bool second_texture = false;
|
||||
|
||||
switch(Driver->getCurrentMaterial().MaterialType)
|
||||
{
|
||||
case EMT_SOLID_2_LAYER:
|
||||
materialType = 1;
|
||||
break;
|
||||
case EMT_LIGHTMAP:
|
||||
case EMT_LIGHTMAP_ADD:
|
||||
case EMT_LIGHTMAP_M2:
|
||||
case EMT_LIGHTMAP_M4:
|
||||
materialType = 2;
|
||||
break;
|
||||
case EMT_LIGHTMAP_LIGHTING:
|
||||
case EMT_LIGHTMAP_LIGHTING_M2:
|
||||
case EMT_LIGHTMAP_LIGHTING_M4:
|
||||
materialType = 2;
|
||||
second_texture = true;
|
||||
break;
|
||||
case EMT_DETAIL_MAP:
|
||||
materialType = 3;
|
||||
break;
|
||||
case EMT_SPHERE_MAP:
|
||||
materialType = 4;
|
||||
break;
|
||||
case EMT_REFLECTION_2_LAYER:
|
||||
materialType = 5;
|
||||
break;
|
||||
case EMT_TRANSPARENT_ALPHA_CHANNEL:
|
||||
materialType = 6;
|
||||
break;
|
||||
case EMT_TRANSPARENT_ALPHA_CHANNEL_REF:
|
||||
materialType = 7;
|
||||
break;
|
||||
case EMT_TRANSPARENT_VERTEX_ALPHA:
|
||||
materialType = 8;
|
||||
break;
|
||||
case EMT_TRANSPARENT_REFLECTION_2_LAYER:
|
||||
materialType = 9;
|
||||
break;
|
||||
case EMT_STK_GRASS:
|
||||
materialType = 10;
|
||||
break;
|
||||
case EMT_ONETEXTURE_BLEND:
|
||||
materialType = 11;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
video::SColorf vertex_color(SColor(-1));
|
||||
float hue_change = 0.0f;
|
||||
if (Driver->getCurrentMaterial().getRenderInfo())
|
||||
{
|
||||
hue_change = Driver->getCurrentMaterial().getRenderInfo()->getHue();
|
||||
vertex_color = video::SColorf(Driver->getCurrentMaterial().getRenderInfo()->getVertexColor());
|
||||
}
|
||||
IMaterialRendererServices::setPixelShaderConstant("uHueChange", &hue_change, 1);
|
||||
IMaterialRendererServices::setPixelShaderConstant("uVertexColor", &vertex_color.r, 4);
|
||||
|
||||
IMaterialRendererServices::setPixelShaderConstant("uMaterialType", &materialType, 1);
|
||||
|
||||
/* Transform Matrices Upload */
|
||||
|
||||
core::matrix4 world = Driver->getTransform(ETS_WORLD);
|
||||
IMaterialRendererServices::setPixelShaderConstant("uWorldMatrix", world.pointer(), 16);
|
||||
|
||||
core::matrix4 worldViewProj = Driver->getTransform(video::ETS_PROJECTION);
|
||||
worldViewProj *= Driver->getTransform(video::ETS_VIEW);
|
||||
worldViewProj *= Driver->getTransform(ETS_WORLD);
|
||||
IMaterialRendererServices::setPixelShaderConstant("uMvpMatrix", worldViewProj.pointer(), 16);
|
||||
|
||||
/* Textures Upload */
|
||||
|
||||
s32 TextureUsage0 = Driver->isActiveTexture(0);
|
||||
//s32 TextureUsage1 = Driver->isActiveTexture(1);
|
||||
|
||||
IMaterialRendererServices::setPixelShaderConstant("uTextureUsage0", &TextureUsage0, 1);
|
||||
//IMaterialRendererServices::setPixelShaderConstant("uTextureUsage1", &TextureUsage1, 1);
|
||||
|
||||
const irr::core::matrix4& textureMatrix0 = Driver->getCurrentMaterial().getTextureMatrix(0);
|
||||
//core::matrix4 textureMatrix1 = Driver->getTransform(video::ETS_TEXTURE_0);
|
||||
|
||||
IMaterialRendererServices::setVertexShaderConstant("uTextureTrans0", &textureMatrix0[8], 2);
|
||||
//IMaterialRendererServices::setPixelShaderConstant("uTextureMatrix1", textureMatrix1.pointer(), 16);
|
||||
|
||||
s32 TextureUnit0 = 0;
|
||||
//s32 TextureUnit1 = 1;
|
||||
|
||||
if (second_texture)
|
||||
TextureUnit0 = 1;
|
||||
|
||||
IMaterialRendererServices::setPixelShaderConstant("uTextureUnit0", &TextureUnit0, 1);
|
||||
//IMaterialRendererServices::setPixelShaderConstant("uTextureUnit1", &TextureUnit1, 1);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user