载入中...
搜索中...
未找到
SpriteStackModel.cpp
浏览该文件的文档.
2
3#include "common/Exception.h"
4#include "image/ImageData.h"
5#include "model3d/ModelData.h"
6
7#include <simplesquirrel/simplesquirrel.hpp>
8
9#include <assimp/color4.h>
10#include <assimp/mesh.h>
11#include <assimp/vector3.h>
12
13#include <cstdint>
14#include <string>
15#include <vector>
16
17namespace eve::spritestack {
18
19std::vector<image::ImageData *> sliceModelToLayers(model3d::ModelData *model, const SliceOptions &opt) {
20 if (!model) throw eve::Exception("SpriteStack.sliceModel: null model");
21 std::vector<float> pos, nrm, rgb;
22 std::vector<uint32_t> idx;
23 const int meshCount = model->getMeshCount();
24 for (int m = 0; m < meshCount; ++m) {
25 const aiMesh *am = model->getMesh(m);
26 if (!am) continue;
27 const uint32_t base = uint32_t(pos.size() / 3);
28 for (unsigned v = 0; v < am->mNumVertices; ++v) {
29 const aiVector3D &p = am->mVertices[v];
30 pos.insert(pos.end(), {p.x, p.y, p.z});
31 if (am->mNormals) {
32 const aiVector3D &n = am->mNormals[v];
33 nrm.insert(nrm.end(), {n.x, n.y, n.z});
34 }
35 if (am->mColors[0] != nullptr) {
36 const aiColor4D &c = am->mColors[0][v];
37 rgb.insert(rgb.end(), {c.r, c.g, c.b});
38 }
39 }
40 for (unsigned f = 0; f < am->mNumFaces; ++f) {
41 const auto &face = am->mFaces[f];
42 if (face.mNumIndices != 3) continue;
43 idx.insert(idx.end(),
44 {base + face.mIndices[0], base + face.mIndices[1], base + face.mIndices[2]});
45 }
46 }
47 SliceInput in{};
48 in.posXYZ = pos.data();
49 in.nrmXYZ = nrm.empty() ? nullptr : nrm.data();
50 in.rgb = rgb.empty() ? nullptr : rgb.data();
51 in.vertexCount = int(pos.size() / 3);
52 in.indices = idx.data();
53 in.indexCount = int(idx.size());
54 return sliceMeshToLayers(in, opt);
55}
56
57std::vector<image::ImageData *> SpriteStack::sliceModel(model3d::ModelData *model, int layerCount,
58 int imageW, int imageH, const std::string &axis,
59 float thickness) {
61 options.layerCount = layerCount;
62 options.imageW = imageW;
63 options.imageH = imageH;
64 options.axis = axis;
65 options.thickness = thickness;
67}
68
70 cls.addFunc("sliceModel", &SpriteStack::sliceModel);
71}
72
73} // namespace eve::spritestack
float thickness
Definition CaveMesh.cpp:83
glm::vec4 p[6]
HSQOBJECT cls
Definition ECS.cpp:21
glm::vec3 n
Definition Grass.cpp:63
float v
std::int32_t c
int idx
float f
glm::mat4 model
const SquirrelValueOptions & options
float m[16]
EVENGINE_API_FOUNDATION public API.
Definition Exception.h:13
CPU-side decoded 3D model (Assimp scene owned via medialoader::ModelScene). Does not upload to GPU — ...
Definition ModelData.h:39
std::vector< image::ImageData * > sliceModel(model3d::ModelData *model, int layerCount, int imageW, int imageH, const std::string &axis, float thickness)
Slice model.
void exposeSpriteStackModelBindings(ssq::Class &cls)
Register sliceModel when SpriteStackModel.cpp is linked (model3d on).
EVENGINE_API_WORLD std::vector< image::ImageData * > sliceModelToLayers(model3d::ModelData *, const SliceOptions &)
Assimp-backed bake; compiled only when the model3d module is linked.
std::vector< image::ImageData * > sliceMeshToLayers(const SliceInput &input, const SliceOptions &opt)
Slice mesh to layers.
CPU triangle-mesh input used to bake horizontal RGBA sprite slices.
Definition SpriteStack.h:26
Options for baking a mesh into equal-sized RGBA sprite layers.
Definition SpriteStack.h:36