Merge branch 'master' of github.com:supertuxkart/stk-code

This commit is contained in:
hiker 2014-10-17 12:04:04 +11:00
commit 383cbef14d
2 changed files with 45 additions and 22 deletions

View File

@ -2,7 +2,7 @@
<stkgui> <stkgui>
<div x="5%" y="5%" width="90%" height="90%" layout="vertical-row" > <div x="5%" y="5%" width="90%" height="90%" layout="vertical-row" >
<header id="title" width="80%" text="Race Setup" align="center" text_align="center" /> <header id="title" width="100%" text="Race Setup" align="center" text_align="center" />
<spacer height="2%" width="1"/> <spacer height="2%" width="1"/>

View File

@ -22,6 +22,8 @@
#include <IMeshBuffer.h> #include <IMeshBuffer.h>
#include "utils/log.hpp" #include "utils/log.hpp"
#include "graphics/irr_driver.hpp" #include "graphics/irr_driver.hpp"
#include "modes/world.hpp"
#include "tracks/track.hpp"
void MeshTools::minMax3D(scene::IMesh* mesh, Vec3 *min, Vec3 *max) { void MeshTools::minMax3D(scene::IMesh* mesh, Vec3 *min, Vec3 *max) {
@ -325,7 +327,8 @@ bool MeshTools::isNormalMap(scene::IMeshBuffer* mb)
{ {
if (!irr_driver->isGLSL()) if (!irr_driver->isGLSL())
return false; return false;
return (mb->getMaterial().MaterialType == irr_driver->getShader(ES_NORMAL_MAP)); return (mb->getMaterial().MaterialType == irr_driver->getShader(ES_NORMAL_MAP) &&
mb->getVertexType() != video::EVT_TANGENTS);
} }
// Copied from irrlicht // Copied from irrlicht
@ -385,28 +388,28 @@ scene::IMesh* MeshTools::createMeshWithTangents(scene::IMesh* mesh, bool(*predic
{ {
switch (vType) switch (vType)
{ {
case video::EVT_STANDARD: case video::EVT_STANDARD:
{ {
const video::S3DVertex* v = const video::S3DVertex* v =
(const video::S3DVertex*)original->getVertices(); (const video::S3DVertex*)original->getVertices();
vNew = video::S3DVertexTangents( vNew = video::S3DVertexTangents(
v[idx[i]].Pos, v[idx[i]].Normal, v[idx[i]].Color, v[idx[i]].TCoords); v[idx[i]].Pos, v[idx[i]].Normal, v[idx[i]].Color, v[idx[i]].TCoords);
} }
break; break;
case video::EVT_2TCOORDS: case video::EVT_2TCOORDS:
{ {
const video::S3DVertex2TCoords* v = const video::S3DVertex2TCoords* v =
(const video::S3DVertex2TCoords*)original->getVertices(); (const video::S3DVertex2TCoords*)original->getVertices();
vNew = video::S3DVertexTangents( vNew = video::S3DVertexTangents(
v[idx[i]].Pos, v[idx[i]].Normal, v[idx[i]].Color, v[idx[i]].TCoords); v[idx[i]].Pos, v[idx[i]].Normal, v[idx[i]].Color, v[idx[i]].TCoords);
} }
break; break;
case video::EVT_TANGENTS: case video::EVT_TANGENTS:
{ {
const video::S3DVertexTangents* v = const video::S3DVertexTangents* v =
(const video::S3DVertexTangents*)original->getVertices(); (const video::S3DVertexTangents*)original->getVertices();
vNew = v[idx[i]]; vNew = v[idx[i]];
} }
break; break;
} }
core::map<video::S3DVertexTangents, int>::Node* n = vertMap.find(vNew); core::map<video::S3DVertexTangents, int>::Node* n = vertMap.find(vNew);
@ -435,8 +438,28 @@ scene::IMesh* MeshTools::createMeshWithTangents(scene::IMesh* mesh, bool(*predic
if (calculateTangents) if (calculateTangents)
recalculateTangents(clone, recalculateNormals, smooth, angleWeighted); recalculateTangents(clone, recalculateNormals, smooth, angleWeighted);
int mbcount = clone->getMeshBufferCount();
for (int i = 0; i < mbcount; i++)
{
scene::IMeshBuffer* mb = clone->getMeshBuffer(i);
for (int t = 0; t < video::MATERIAL_MAX_TEXTURES; t++)
{
video::ITexture* texture = mb->getMaterial().TextureLayer[t].Texture;
if (texture != NULL)
texture->grab();
}
}
scene::IMeshCache* meshCache = irr_driver->getSceneManager()->getMeshCache();
io::SNamedPath path = meshCache->getMeshName(mesh);
irr_driver->removeMeshFromCache(mesh); irr_driver->removeMeshFromCache(mesh);
scene::SAnimatedMesh* amesh = new scene::SAnimatedMesh(clone);
meshCache->addMesh(path, amesh);
World::getWorld()->getTrack()->addCachedMesh(amesh);
return clone; return clone;
} }