forked from mirror/openmw-tes3mp
Revert "Remove redundant allocations for NIF meshes"
This reverts commit a7c5beb7c5
.
Conflicts:
components/nif/data.cpp
components/nifbullet/bulletnifloader.cpp
components/nifosg/nifloader.cpp
This commit is contained in:
parent
6a37909ee7
commit
aa8459b5c7
6 changed files with 64 additions and 81 deletions
|
@ -1,9 +1,6 @@
|
|||
#include "data.hpp"
|
||||
#include "node.hpp"
|
||||
|
||||
#include <osg/Array>
|
||||
#include <osg/PrimitiveSet>
|
||||
|
||||
namespace Nif
|
||||
{
|
||||
void NiSkinInstance::read(NIFStream *nif)
|
||||
|
@ -40,18 +37,15 @@ void ShapeData::read(NIFStream *nif)
|
|||
{
|
||||
int verts = nif->getUShort();
|
||||
|
||||
vertices = new osg::Vec3Array;
|
||||
if(nif->getInt())
|
||||
nif->getVector3s(vertices, verts);
|
||||
|
||||
normals = new osg::Vec3Array(osg::Array::BIND_PER_VERTEX);
|
||||
if(nif->getInt())
|
||||
nif->getVector3s(normals, verts);
|
||||
|
||||
center = nif->getVector3();
|
||||
radius = nif->getFloat();
|
||||
|
||||
colors = new osg::Vec4Array(osg::Array::BIND_PER_VERTEX);
|
||||
if(nif->getInt())
|
||||
nif->getVector4s(colors, verts);
|
||||
|
||||
|
@ -65,13 +59,11 @@ void ShapeData::read(NIFStream *nif)
|
|||
uvlist.resize(uvs);
|
||||
for(int i = 0;i < uvs;i++)
|
||||
{
|
||||
osg::Vec2Array* list = uvlist[i] = new osg::Vec2Array(osg::Array::BIND_PER_VERTEX);
|
||||
nif->getVector2s(list, verts);
|
||||
|
||||
nif->getVector2s(uvlist[i], verts);
|
||||
// flip the texture coordinates to convert them to the OpenGL convention of bottom-left image origin
|
||||
for (unsigned int uv=0; uv<list->size(); ++uv)
|
||||
for (unsigned int uv=0; uv<uvlist[i].size(); ++uv)
|
||||
{
|
||||
(*list)[uv] = osg::Vec2((*list)[uv].x(), 1.f - (*list)[uv].y());
|
||||
uvlist[i][uv] = osg::Vec2f(uvlist[i][uv].x(), 1.f - uvlist[i][uv].y());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -86,7 +78,6 @@ void NiTriShapeData::read(NIFStream *nif)
|
|||
// We have three times as many vertices as triangles, so this
|
||||
// is always equal to tris*3.
|
||||
int cnt = nif->getInt();
|
||||
triangles = new osg::DrawElementsUShort(osg::PrimitiveSet::TRIANGLES);
|
||||
nif->getUShorts(triangles, cnt);
|
||||
|
||||
// Read the match list, which lists the vertices that are equal to
|
||||
|
@ -113,9 +104,8 @@ void NiAutoNormalParticlesData::read(NIFStream *nif)
|
|||
|
||||
if(nif->getInt())
|
||||
{
|
||||
int numVerts = vertices->size();
|
||||
// Particle sizes
|
||||
nif->getFloats(sizes, numVerts);
|
||||
nif->getFloats(sizes, vertices.size());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -125,9 +115,8 @@ void NiRotatingParticlesData::read(NIFStream *nif)
|
|||
|
||||
if(nif->getInt())
|
||||
{
|
||||
int numVerts = vertices->size();
|
||||
// Rotation quaternions.
|
||||
nif->getQuaternions(rotations, numVerts);
|
||||
nif->getQuaternions(rotations, vertices.size());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -246,7 +235,6 @@ void NiMorphData::read(NIFStream *nif)
|
|||
{
|
||||
mMorphs[i].mKeyFrames.reset(new FloatKeyMap);
|
||||
mMorphs[i].mKeyFrames->read(nif, true);
|
||||
mMorphs[i].mVertices = new osg::Vec3Array;
|
||||
nif->getVector3s(mMorphs[i].mVertices, vertCount);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,8 +28,6 @@
|
|||
|
||||
#include "niftypes.hpp" // Transformation
|
||||
|
||||
#include <osg/Array>
|
||||
|
||||
namespace Nif
|
||||
{
|
||||
|
||||
|
@ -37,10 +35,9 @@ namespace Nif
|
|||
class ShapeData : public Record
|
||||
{
|
||||
public:
|
||||
osg::ref_ptr<osg::Vec3Array> vertices, normals;
|
||||
osg::ref_ptr<osg::Vec4Array> colors;
|
||||
|
||||
std::vector< osg::ref_ptr<osg::Vec2Array> > uvlist;
|
||||
std::vector<osg::Vec3f> vertices, normals;
|
||||
std::vector<osg::Vec4f> colors;
|
||||
std::vector< std::vector<osg::Vec2f> > uvlist;
|
||||
osg::Vec3f center;
|
||||
float radius;
|
||||
|
||||
|
@ -51,7 +48,7 @@ class NiTriShapeData : public ShapeData
|
|||
{
|
||||
public:
|
||||
// Triangles, three vertex indices per triangle
|
||||
osg::ref_ptr<osg::DrawElementsUShort> triangles;
|
||||
std::vector<unsigned short> triangles;
|
||||
|
||||
void read(NIFStream *nif);
|
||||
};
|
||||
|
@ -190,7 +187,7 @@ struct NiMorphData : public Record
|
|||
{
|
||||
struct MorphData {
|
||||
FloatKeyMapPtr mKeyFrames;
|
||||
osg::ref_ptr<osg::Vec3Array> mVertices;
|
||||
std::vector<osg::Vec3f> mVertices;
|
||||
};
|
||||
std::vector<MorphData> mMorphs;
|
||||
|
||||
|
|
|
@ -103,11 +103,11 @@ std::string NIFStream::getVersionString()
|
|||
return result;
|
||||
}
|
||||
|
||||
void NIFStream::getUShorts(osg::VectorGLushort* vec, size_t size)
|
||||
void NIFStream::getUShorts(std::vector<unsigned short> &vec, size_t size)
|
||||
{
|
||||
vec->reserve(size);
|
||||
for(size_t i = 0;i < size;i++)
|
||||
vec->push_back(getUShort());
|
||||
vec.resize(size);
|
||||
for(size_t i = 0;i < vec.size();i++)
|
||||
vec[i] = getUShort();
|
||||
}
|
||||
void NIFStream::getFloats(std::vector<float> &vec, size_t size)
|
||||
{
|
||||
|
@ -115,23 +115,23 @@ void NIFStream::getFloats(std::vector<float> &vec, size_t size)
|
|||
for(size_t i = 0;i < vec.size();i++)
|
||||
vec[i] = getFloat();
|
||||
}
|
||||
void NIFStream::getVector2s(osg::Vec2Array* vec, size_t size)
|
||||
void NIFStream::getVector2s(std::vector<osg::Vec2f> &vec, size_t size)
|
||||
{
|
||||
vec->reserve(size);
|
||||
for(size_t i = 0;i < size;i++)
|
||||
vec->push_back(getVector2());
|
||||
vec.resize(size);
|
||||
for(size_t i = 0;i < vec.size();i++)
|
||||
vec[i] = getVector2();
|
||||
}
|
||||
void NIFStream::getVector3s(osg::Vec3Array* vec, size_t size)
|
||||
void NIFStream::getVector3s(std::vector<osg::Vec3f> &vec, size_t size)
|
||||
{
|
||||
vec->reserve(size);
|
||||
for(size_t i = 0;i < size;i++)
|
||||
vec->push_back(getVector3());
|
||||
vec.resize(size);
|
||||
for(size_t i = 0;i < vec.size();i++)
|
||||
vec[i] = getVector3();
|
||||
}
|
||||
void NIFStream::getVector4s(osg::Vec4Array* vec, size_t size)
|
||||
void NIFStream::getVector4s(std::vector<osg::Vec4f> &vec, size_t size)
|
||||
{
|
||||
vec->reserve(size);
|
||||
for(size_t i = 0;i < size;i++)
|
||||
vec->push_back(getVector4());
|
||||
vec.resize(size);
|
||||
for(size_t i = 0;i < vec.size();i++)
|
||||
vec[i] = getVector4();
|
||||
}
|
||||
void NIFStream::getQuaternions(std::vector<osg::Quat> &quat, size_t size)
|
||||
{
|
||||
|
|
|
@ -12,12 +12,9 @@
|
|||
#include <osg/Vec3f>
|
||||
#include <osg/Vec4f>
|
||||
#include <osg/Quat>
|
||||
#include <osg/Array>
|
||||
#include <osg/PrimitiveSet>
|
||||
|
||||
#include "niftypes.hpp"
|
||||
|
||||
|
||||
namespace Nif
|
||||
{
|
||||
|
||||
|
@ -62,11 +59,11 @@ public:
|
|||
///This is special since the version string doesn't start with a number, and ends with "\n"
|
||||
std::string getVersionString();
|
||||
|
||||
void getUShorts(osg::VectorGLushort* vec, size_t size);
|
||||
void getUShorts(std::vector<unsigned short> &vec, size_t size);
|
||||
void getFloats(std::vector<float> &vec, size_t size);
|
||||
void getVector2s(osg::Vec2Array* vec, size_t size);
|
||||
void getVector3s(osg::Vec3Array* vec, size_t size);
|
||||
void getVector4s(osg::Vec4Array* vec, size_t size);
|
||||
void getVector2s(std::vector<osg::Vec2f> &vec, size_t size);
|
||||
void getVector3s(std::vector<osg::Vec3f> &vec, size_t size);
|
||||
void getVector4s(std::vector<osg::Vec4f> &vec, size_t size);
|
||||
void getQuaternions(std::vector<osg::Quat> &quat, size_t size);
|
||||
};
|
||||
|
||||
|
|
|
@ -268,7 +268,7 @@ void BulletNifLoader::handleNiTriShape(const Nif::NiTriShape *shape, int flags,
|
|||
|
||||
if (shape->data.empty())
|
||||
return;
|
||||
if (shape->data->triangles->empty())
|
||||
if (shape->data->triangles.empty())
|
||||
return;
|
||||
|
||||
if (isAnimated)
|
||||
|
@ -280,14 +280,13 @@ void BulletNifLoader::handleNiTriShape(const Nif::NiTriShape *shape, int flags,
|
|||
|
||||
const Nif::NiTriShapeData *data = shape->data.getPtr();
|
||||
|
||||
childMesh->preallocateVertices(data->vertices->size());
|
||||
childMesh->preallocateIndices(data->triangles->size());
|
||||
childMesh->preallocateVertices(data->vertices.size());
|
||||
childMesh->preallocateIndices(data->triangles.size());
|
||||
|
||||
const osg::Vec3Array& vertices = *data->vertices;
|
||||
const osg::DrawElementsUShort& triangles = *data->triangles;
|
||||
const std::vector<osg::Vec3f> &vertices = data->vertices;
|
||||
const std::vector<unsigned short> &triangles = data->triangles;
|
||||
|
||||
size_t numtris = data->triangles->size();
|
||||
for(size_t i = 0;i < numtris;i+=3)
|
||||
for(size_t i = 0;i < data->triangles.size();i+=3)
|
||||
{
|
||||
osg::Vec3f b1 = vertices[triangles[i+0]];
|
||||
osg::Vec3f b2 = vertices[triangles[i+1]];
|
||||
|
@ -321,13 +320,13 @@ void BulletNifLoader::handleNiTriShape(const Nif::NiTriShape *shape, int flags,
|
|||
|
||||
// Static shape, just transform all vertices into position
|
||||
const Nif::NiTriShapeData *data = shape->data.getPtr();
|
||||
const osg::Vec3Array& vertices = *data->vertices;
|
||||
const osg::DrawElementsUShort& triangles = *data->triangles;
|
||||
const std::vector<osg::Vec3f> &vertices = data->vertices;
|
||||
const std::vector<unsigned short> &triangles = data->triangles;
|
||||
|
||||
mStaticMesh->preallocateVertices(data->vertices->size());
|
||||
mStaticMesh->preallocateIndices(data->triangles->size());
|
||||
mStaticMesh->preallocateVertices(data->vertices.size());
|
||||
mStaticMesh->preallocateIndices(data->triangles.size());
|
||||
|
||||
size_t numtris = data->triangles->size();
|
||||
size_t numtris = data->triangles.size();
|
||||
for(size_t i = 0;i < numtris;i+=3)
|
||||
{
|
||||
osg::Vec3f b1 = vertices[triangles[i+0]]*transform;
|
||||
|
|
|
@ -912,12 +912,12 @@ namespace NifOsg
|
|||
// Note this position and velocity is not correct for a particle system with absolute reference frame,
|
||||
// which can not be done in this loader since we are not attached to the scene yet. Will be fixed up post-load in the SceneManager.
|
||||
created->setVelocity(particle.velocity);
|
||||
const osg::Vec3f& position = particledata->vertices->at(particle.vertex);
|
||||
const osg::Vec3f& position = particledata->vertices.at(particle.vertex);
|
||||
created->setPosition(position);
|
||||
|
||||
osg::Vec4f partcolor (1.f,1.f,1.f,1.f);
|
||||
if (particle.vertex < int(particledata->colors->size()))
|
||||
partcolor = particledata->colors->at(particle.vertex);
|
||||
if (particle.vertex < int(particledata->colors.size()))
|
||||
partcolor = particledata->colors.at(particle.vertex);
|
||||
|
||||
float size = particledata->sizes.at(particle.vertex) * partctrl->size;
|
||||
|
||||
|
@ -1076,10 +1076,11 @@ namespace NifOsg
|
|||
{
|
||||
const Nif::NiTriShapeData* data = triShape->data.getPtr();
|
||||
|
||||
geometry->setVertexArray(data->vertices);
|
||||
|
||||
if (!data->normals->empty())
|
||||
geometry->setNormalArray(data->normals);
|
||||
{
|
||||
geometry->setVertexArray(new osg::Vec3Array(data->vertices.size(), &data->vertices[0]));
|
||||
if (!data->normals.empty())
|
||||
geometry->setNormalArray(new osg::Vec3Array(data->normals.size(), &data->normals[0]), osg::Array::BIND_PER_VERTEX);
|
||||
}
|
||||
|
||||
int textureStage = 0;
|
||||
for (std::vector<int>::const_iterator it = boundTextures.begin(); it != boundTextures.end(); ++it,++textureStage)
|
||||
|
@ -1089,18 +1090,19 @@ namespace NifOsg
|
|||
{
|
||||
std::cerr << "Warning: out of bounds UV set " << uvSet << " on TriShape \"" << triShape->name << "\" in " << mFilename << std::endl;
|
||||
if (!data->uvlist.empty())
|
||||
geometry->setTexCoordArray(textureStage, data->uvlist[0]);
|
||||
geometry->setTexCoordArray(textureStage, new osg::Vec2Array(data->uvlist[0].size(), &data->uvlist[0][0]), osg::Array::BIND_PER_VERTEX);
|
||||
continue;
|
||||
}
|
||||
|
||||
geometry->setTexCoordArray(textureStage, data->uvlist[uvSet]);
|
||||
geometry->setTexCoordArray(textureStage, new osg::Vec2Array(data->uvlist[uvSet].size(), &data->uvlist[uvSet][0]), osg::Array::BIND_PER_VERTEX);
|
||||
}
|
||||
|
||||
if (!data->colors->empty())
|
||||
geometry->setColorArray(data->colors);
|
||||
if (!data->colors.empty())
|
||||
geometry->setColorArray(new osg::Vec4Array(data->colors.size(), &data->colors[0]), osg::Array::BIND_PER_VERTEX);
|
||||
|
||||
if (!data->triangles->empty())
|
||||
geometry->addPrimitiveSet(data->triangles);
|
||||
geometry->addPrimitiveSet(new osg::DrawElementsUShort(osg::PrimitiveSet::TRIANGLES,
|
||||
data->triangles.size(),
|
||||
(unsigned short*)&data->triangles[0]));
|
||||
|
||||
// osg::Material properties are handled here for two reasons:
|
||||
// - if there are no vertex colors, we need to disable colorMode.
|
||||
|
@ -1108,7 +1110,7 @@ namespace NifOsg
|
|||
// above the actual renderable would be tedious.
|
||||
std::vector<const Nif::Property*> drawableProps;
|
||||
collectDrawableProperties(triShape, drawableProps);
|
||||
applyDrawableProperties(parentNode, drawableProps, composite, !data->colors->empty(), animflags, false);
|
||||
applyDrawableProperties(parentNode, drawableProps, composite, !data->colors.empty(), animflags, false);
|
||||
}
|
||||
|
||||
void handleTriShape(const Nif::NiTriShape* triShape, osg::Group* parentNode, SceneUtil::CompositeStateSetUpdater* composite, const std::vector<int>& boundTextures, int animflags)
|
||||
|
@ -1175,13 +1177,13 @@ namespace NifOsg
|
|||
for (unsigned int i = 1; i < morphs.size(); ++i)
|
||||
{
|
||||
osg::ref_ptr<osg::Geometry> morphTarget = new osg::Geometry;
|
||||
morphTarget->setVertexArray(morphs[i].mVertices);
|
||||
morphTarget->setVertexArray(new osg::Vec3Array(morphs[i].mVertices.size(), &morphs[i].mVertices[0]));
|
||||
morphGeom->addMorphTarget(morphTarget, 0.f);
|
||||
}
|
||||
|
||||
// build the bounding box containing all possible morph combinations
|
||||
|
||||
std::vector<osg::BoundingBox> vertBounds(morphs[0].mVertices->size());
|
||||
std::vector<osg::BoundingBox> vertBounds(morphs[0].mVertices.size());
|
||||
|
||||
// Since we don't know what combinations of morphs are being applied we need to keep track of a bounding box for each vertex.
|
||||
// The minimum/maximum of the box is the minimum/maximum offset the vertex can have from its starting position.
|
||||
|
@ -1192,19 +1194,19 @@ namespace NifOsg
|
|||
|
||||
for (unsigned int i = 1; i < morphs.size(); ++i)
|
||||
{
|
||||
for (unsigned int j=0; j<morphs[i].mVertices->size() && vertBounds.size(); ++j)
|
||||
for (unsigned int j=0; j<morphs[i].mVertices.size() && vertBounds.size(); ++j)
|
||||
{
|
||||
osg::BoundingBox& bounds = vertBounds[j];
|
||||
bounds.expandBy(bounds._max + (*morphs[i].mVertices)[j]);
|
||||
bounds.expandBy(bounds._min + (*morphs[i].mVertices)[j]);
|
||||
bounds.expandBy(bounds._max + morphs[i].mVertices[j]);
|
||||
bounds.expandBy(bounds._min + morphs[i].mVertices[j]);
|
||||
}
|
||||
}
|
||||
|
||||
osg::BoundingBox box;
|
||||
for (unsigned int i=0; i<vertBounds.size(); ++i)
|
||||
{
|
||||
vertBounds[i]._max += (*morphs[0].mVertices)[i];
|
||||
vertBounds[i]._min += (*morphs[0].mVertices)[i];
|
||||
vertBounds[i]._max += morphs[0].mVertices[i];
|
||||
vertBounds[i]._min += morphs[0].mVertices[i];
|
||||
box.expandBy(vertBounds[i]);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue