OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
animmesh.cpp
Go to the documentation of this file.
1#include "animmesh.h"
2#include "packedmesh.h"
3
4#include <Tempest/Log>
5
6static size_t countBones(const Resources::VertexA* v, size_t n) {
7 if(n==0)
8 return 0;
9 uint8_t ret = 0;
10 for(size_t i=0; i<n; ++i) {
11 ret = std::max(ret, v[i].boneId[0]);
12 ret = std::max(ret, v[i].boneId[1]);
13 ret = std::max(ret, v[i].boneId[2]);
14 ret = std::max(ret, v[i].boneId[3]);
15 }
16 return ret+1;
17 }
18
20 : bonesCount(countBones(mesh.verticesA.data(),mesh.verticesA.size())) {
21 vbo = Resources::vbo (mesh.verticesA.data(),mesh.verticesA.size());
22 ibo = Resources::ibo (mesh.indices.data(), mesh.indices.size());
23 ibo8 = Resources::ssbo(mesh.indices8.data(), mesh.indices8.size());
24
25 sub.resize(mesh.subMeshes.size());
26 for(size_t i=0;i<mesh.subMeshes.size();++i) {
27 sub[i].texName = mesh.subMeshes[i].material.texture;
28 sub[i].material = Resources::loadMaterial(mesh.subMeshes[i].material,true);
29 sub[i].iboOffset = mesh.subMeshes[i].iboOffset;
30 sub[i].iboSize = mesh.subMeshes[i].iboLength;
31 }
32
33 // compact similar sub-meshes. not a big deal, but helps in graphics debugging
34 size_t cnt = 1;
35 for(size_t i=1;i<mesh.subMeshes.size();++i) {
36 auto& a = sub[cnt-1];
37 auto& b = sub[i];
38 if(a.iboOffset+a.iboSize==b.iboOffset &&
39 a.texName==b.texName &&
40 a.material==b.material) {
41 a.iboSize += b.iboSize;
42 } else {
43 sub[cnt] = b;
44 ++cnt;
45 }
46 }
47 sub.resize(cnt);
48
49 bbox.assign(mesh.bbox());
50 }
static size_t countBones(const Resources::VertexA *v, size_t n)
Definition animmesh.cpp:6
AnimMesh(const PackedMesh &data)
Definition animmesh.cpp:19
Tempest::VertexBuffer< VertexA > vbo
Definition animmesh.h:24
std::vector< SubMesh > sub
Definition animmesh.h:27
Tempest::IndexBuffer< uint32_t > ibo
Definition animmesh.h:25
Bounds bbox
Definition animmesh.h:28
Tempest::StorageBuffer ibo8
Definition animmesh.h:26
void assign(const Tempest::Vec3 &cen, float sizeSz)
std::pair< Tempest::Vec3, Tempest::Vec3 > bbox() const
std::vector< SubMesh > subMeshes
Definition packedmesh.h:73
std::vector< uint32_t > indices
Definition packedmesh.h:70
std::vector< VertexA > verticesA
Definition packedmesh.h:69
std::vector< uint8_t > indices8
Definition packedmesh.h:71
static Tempest::StorageBuffer ssbo(const void *data, size_t size)
Definition resources.h:125
static Tempest::IndexBuffer< I > ibo(const I *data, size_t sz)
Definition resources.h:123
static Material loadMaterial(const zenkit::Material &src, bool enableAlphaTest)
static Tempest::VertexBuffer< V > vbo(const V *data, size_t sz)
Definition resources.h:120