OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
staticmesh.cpp
Go to the documentation of this file.
1#include "staticmesh.h"
2
3#include <cassert>
4
6#include "gothic.h"
7
9 const Vertex* vert=mesh.vertices.data();
10 vbo = Resources::vbo<Vertex> (vert,mesh.vertices.size());
11 ibo = Resources::ibo<uint32_t>(mesh.indices.data(),mesh.indices.size());
12 ibo8 = Resources::ssbo(mesh.indices8.data(),mesh.indices8.size());
13
14 sub.resize(mesh.subMeshes.size());
15 for(size_t i=0;i<mesh.subMeshes.size();++i) {
16 sub[i].texName = mesh.subMeshes[i].material.texture;
17 sub[i].material = Resources::loadMaterial(mesh.subMeshes[i].material,mesh.isUsingAlphaTest);
18 sub[i].iboOffset = mesh.subMeshes[i].iboOffset;
19 sub[i].iboLength = mesh.subMeshes[i].iboLength;
20 }
21 bbox.assign(mesh.bbox());
22
23 if(Gothic::options().doRayQuery) {
24 for(size_t i=0;i<mesh.subMeshes.size();++i) {
25 sub[i].blas = Resources::blas(vbo, ibo, sub[i].iboOffset, sub[i].iboLength);
26 }
27 }
28 }
29
30const Tempest::AccelerationStructure* StaticMesh::blas(size_t iboOffset, size_t iboLen) const {
31 for(auto& i:sub)
32 if(i.iboOffset==iboOffset && i.iboLength==iboLen && !i.blas.isEmpty()) {
33 return &i.blas;
34 }
35 return nullptr;
36 }
37
38StaticMesh::StaticMesh(const Material& mat, std::vector<Resources::Vertex> cvbo, std::vector<uint32_t> cibo) {
39 assert(cvbo.size()<=PackedMesh::MaxVert);
40 assert(cibo.size()<=PackedMesh::MaxInd);
41
42 if(Gothic::options().doMeshShading || true) {
43 const size_t vert = cvbo.size();
44 const size_t prim = cibo.size()/3;
45
46 cvbo.resize(PackedMesh::MaxVert);
47 std::vector<uint8_t> ibo(PackedMesh::MaxPrim*4);
48 for(size_t i=0; i<cibo.size(); i+=3) {
49 size_t at = (i/3)*4;
50 ibo[at+0] = uint8_t(cibo[i+0]);
51 ibo[at+1] = uint8_t(cibo[i+1]);
52 ibo[at+2] = uint8_t(cibo[i+2]);
53 ibo[at+3] = 0;
54 }
55 size_t at = (PackedMesh::MaxPrim)*4 - 4;
56 ibo[at + 0] = uint8_t(0);
57 ibo[at + 1] = uint8_t(0);
58 ibo[at + 2] = uint8_t(prim);
59 ibo[at + 3] = uint8_t(vert);
60
61 ibo8 = Resources::ssbo(ibo.data(),ibo.size());
62 }
63 vbo = Resources::vbo<Vertex>(cvbo.data(),cvbo.size());
64 ibo = Resources::ibo(cibo.data(),cibo.size());
65
66 sub.resize(1);
67 for(size_t i=0;i<1;++i) {
68 sub[i].texName = "";
69 sub[i].material = mat;
70 //sub[i].iboLength = Gothic::options().doMeshShading ? PackedMesh::MaxInd : ibo.size();
71 sub[i].iboLength = PackedMesh::MaxInd;
72 if(Gothic::options().doRayQuery)
73 sub[i].blas = Resources::blas(vbo, ibo, 0, ibo.size());
74 }
75 bbox.assign(cvbo);
76 }
void assign(const Tempest::Vec3 &cen, float sizeSz)
static auto options() -> const Options &
Definition gothic.cpp:496
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< uint8_t > indices8
Definition packedmesh.h:71
std::vector< Vertex > vertices
Definition packedmesh.h:68
bool isUsingAlphaTest
Definition packedmesh.h:77
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::AccelerationStructure blas(const Tempest::VertexBuffer< V > &b, const Tempest::IndexBuffer< I > &i, size_t offset, size_t size)
Definition resources.h:130
Bounds bbox
Definition staticmesh.h:56
Tempest::VertexBuffer< Vertex > vbo
Definition staticmesh.h:50
StaticMesh(const PackedMesh &data)
Definition staticmesh.cpp:8
const Tempest::AccelerationStructure * blas(size_t iboOffset, size_t iboLen) const
Tempest::IndexBuffer< uint32_t > ibo
Definition staticmesh.h:51
Tempest::StorageBuffer ibo8
Definition staticmesh.h:52
std::vector< SubMesh > sub
Definition staticmesh.h:55