71 lines
1.6 KiB
C++
71 lines
1.6 KiB
C++
#pragma once
|
|
#include <cstdint>
|
|
|
|
#include "Deer/Path.h"
|
|
#include "DeerRender/Render/VertexArray.h"
|
|
|
|
namespace Deer {
|
|
// The real position is the axis divided by 256, the model precition is 1 / 256.0f
|
|
struct VertexPosition {
|
|
int16_t x;
|
|
int16_t y;
|
|
int16_t z;
|
|
|
|
VertexPosition() = default;
|
|
VertexPosition(int16_t _x, int16_t _y, int16_t _z)
|
|
: x(_x), y(_y), z(_z) {}
|
|
};
|
|
|
|
// Vertex normal is represented with a number fromn [-64,64], and then its
|
|
// divided by 64 to know the decimal number
|
|
struct VertexNormal {
|
|
int8_t x = 0;
|
|
int8_t y = 0;
|
|
int8_t z = 0;
|
|
|
|
VertexNormal() = default;
|
|
VertexNormal(int8_t _x, int8_t _y, int8_t _z) : x(_x), y(_y), z(_z) {}
|
|
};
|
|
|
|
struct MeshData {
|
|
uint16_t vertexCount = 0;
|
|
VertexPosition* vertexPositionsData = nullptr;
|
|
VertexNormal* vertexNormalData = nullptr;
|
|
|
|
uint16_t indexCount = 0;
|
|
uint16_t* indexData = nullptr;
|
|
|
|
MeshData() = default;
|
|
~MeshData() {
|
|
delete[] vertexPositionsData;
|
|
delete[] vertexNormalData;
|
|
delete[] indexData;
|
|
}
|
|
MeshData(const MeshData&) = delete;
|
|
MeshData& operator=(const MeshData&) = delete;
|
|
|
|
void freeData() {
|
|
delete[] vertexPositionsData;
|
|
vertexPositionsData = nullptr;
|
|
delete[] vertexNormalData;
|
|
vertexNormalData = nullptr;
|
|
delete[] indexData;
|
|
indexData = nullptr;
|
|
vertexCount = 0;
|
|
indexCount = 0;
|
|
}
|
|
};
|
|
|
|
namespace Mesh {
|
|
Ref<VertexArray> loadModelToGPU(const MeshData&);
|
|
}
|
|
|
|
namespace DataStore {
|
|
void saveModel(const MeshData&, const Path& name);
|
|
void loadModel(MeshData&, const Path& name);
|
|
|
|
void saveBinModel(const MeshData&, const Path& name);
|
|
|
|
void createExampleMeshData();
|
|
} // namespace DataStore
|
|
} // namespace Deer
|