Changed krmesh signature to krmesh1.0

Added support for 8 texcoord sets
This commit is contained in:
2026-06-02 23:56:08 -07:00
parent 9bf6966266
commit 0e9b15e785
5 changed files with 124 additions and 89 deletions

View File

@@ -79,6 +79,12 @@ KRPipeline::KRPipeline(KRContext& context, KrDeviceHandle deviceHandle, const KR
KRMesh::KRENGINE_ATTRIB_TANGENT, KRMesh::KRENGINE_ATTRIB_TANGENT,
KRMesh::KRENGINE_ATTRIB_TEXUVA, KRMesh::KRENGINE_ATTRIB_TEXUVA,
KRMesh::KRENGINE_ATTRIB_TEXUVB, KRMesh::KRENGINE_ATTRIB_TEXUVB,
KRMesh::KRENGINE_ATTRIB_TEXUVC,
KRMesh::KRENGINE_ATTRIB_TEXUVD,
KRMesh::KRENGINE_ATTRIB_TEXUVE,
KRMesh::KRENGINE_ATTRIB_TEXUVF,
KRMesh::KRENGINE_ATTRIB_TEXUVG,
KRMesh::KRENGINE_ATTRIB_TEXUVH,
KRMesh::KRENGINE_ATTRIB_BONEINDEXES, KRMesh::KRENGINE_ATTRIB_BONEINDEXES,
KRMesh::KRENGINE_ATTRIB_BONEWEIGHTS, KRMesh::KRENGINE_ATTRIB_BONEWEIGHTS,
KRMesh::KRENGINE_ATTRIB_VERTEX, KRMesh::KRENGINE_ATTRIB_VERTEX,
@@ -86,6 +92,12 @@ KRPipeline::KRPipeline(KRContext& context, KrDeviceHandle deviceHandle, const KR
KRMesh::KRENGINE_ATTRIB_TANGENT, KRMesh::KRENGINE_ATTRIB_TANGENT,
KRMesh::KRENGINE_ATTRIB_TEXUVA, KRMesh::KRENGINE_ATTRIB_TEXUVA,
KRMesh::KRENGINE_ATTRIB_TEXUVB, KRMesh::KRENGINE_ATTRIB_TEXUVB,
KRMesh::KRENGINE_ATTRIB_TEXUVC,
KRMesh::KRENGINE_ATTRIB_TEXUVD,
KRMesh::KRENGINE_ATTRIB_TEXUVE,
KRMesh::KRENGINE_ATTRIB_TEXUVF,
KRMesh::KRENGINE_ATTRIB_TEXUVG,
KRMesh::KRENGINE_ATTRIB_TEXUVH,
}; };
uint32_t attribute_locations[KRMesh::KRENGINE_NUM_ATTRIBUTES] = {}; uint32_t attribute_locations[KRMesh::KRENGINE_NUM_ATTRIBUTES] = {};

View File

@@ -287,11 +287,11 @@ KRMesh* KRResource::LoadObj(KRContext& context, const std::string& path)
iVertex += 2; iVertex += 2;
mi.vertices.push_back(firstFaceVertex); mi.vertices.push_back(firstFaceVertex);
mi.uva.push_back(firstFaceUva); mi.uv[0].push_back(firstFaceUva);
mi.normals.push_back(firstFaceNormal); mi.normals.push_back(firstFaceNormal);
mi.vertices.push_back(prevFaceVertex); mi.vertices.push_back(prevFaceVertex);
mi.uva.push_back(prevFaceUva); mi.uv[0].push_back(prevFaceUva);
mi.normals.push_back(prevFaceNormal); mi.normals.push_back(prevFaceNormal);
} }
Vector3 vertex = indexed_vertices[pFace[iFaceVertex * 3 + 1]]; Vector3 vertex = indexed_vertices[pFace[iFaceVertex * 3 + 1]];
@@ -305,7 +305,7 @@ KRMesh* KRResource::LoadObj(KRContext& context, const std::string& path)
} }
mi.vertices.push_back(vertex); mi.vertices.push_back(vertex);
mi.uva.push_back(new_uva); mi.uv[0].push_back(new_uva);
mi.normals.push_back(normal); mi.normals.push_back(normal);
if (iFaceVertex == 0) { if (iFaceVertex == 0) {

View File

@@ -528,8 +528,7 @@ void KRMesh::LoadData(const KRMesh::mesh_info& mi, bool calculate_normals, bool
bool use_short_vertexes = false; bool use_short_vertexes = false;
bool use_short_normals = true; bool use_short_normals = true;
bool use_short_tangents = true; bool use_short_tangents = true;
bool use_short_uva = true; bool use_short_uv[8] = { true, true, true, true, true, true, true, true };
bool use_short_uvb = true;
if (use_short_vertexes) { if (use_short_vertexes) {
for (std::vector<Vector3>::const_iterator itr = mi.vertices.begin(); itr != mi.vertices.end(); itr++) { for (std::vector<Vector3>::const_iterator itr = mi.vertices.begin(); itr != mi.vertices.end(); itr++) {
@@ -539,18 +538,22 @@ void KRMesh::LoadData(const KRMesh::mesh_info& mi, bool calculate_normals, bool
} }
} }
if (use_short_uva) { for (int set = 0; set < 8; set++) {
for (std::vector<Vector2>::const_iterator itr = mi.uva.begin(); itr != mi.uva.end(); itr++) { if (use_short_uv[set]) {
for (std::vector<Vector2>::const_iterator itr = mi.uv[set].begin(); itr != mi.uv[set].end(); itr++) {
if (fabsf((*itr).x) > 1.0f || fabsf((*itr).y) > 1.0f) { if (fabsf((*itr).x) > 1.0f || fabsf((*itr).y) > 1.0f) {
use_short_uva = false; use_short_uv[set] = false;
break;
} }
} }
} }
if (use_short_uvb) { if (use_short_uv[set]) {
for (std::vector<Vector2>::const_iterator itr = mi.uvb.begin(); itr != mi.uvb.end(); itr++) { for (std::vector<Vector2>::const_iterator itr = mi.uv[set].begin(); itr != mi.uv[set].end(); itr++) {
if (fabsf((*itr).x) > 1.0f || fabsf((*itr).y) > 1.0f) { if (fabsf((*itr).x) > 1.0f || fabsf((*itr).y) > 1.0f) {
use_short_uvb = false; use_short_uv[set] = false;
break;
}
} }
} }
} }
@@ -577,18 +580,20 @@ void KRMesh::LoadData(const KRMesh::mesh_info& mi, bool calculate_normals, bool
vertex_attrib_flags += (1 << KRENGINE_ATTRIB_TANGENT); vertex_attrib_flags += (1 << KRENGINE_ATTRIB_TANGENT);
} }
} }
if (mi.uva.size()) { for (int set = 0; set < 8; set++) {
if (use_short_uva) { if (mi.uv[set].size()) {
vertex_attrib_flags += (1 << KRENGINE_ATTRIB_TEXUVA_SHORT); if (use_short_uv[set]) {
vertex_attrib_flags += (1 << (KRENGINE_ATTRIB_TEXUVA_SHORT + set));
} else { } else {
vertex_attrib_flags += (1 << KRENGINE_ATTRIB_TEXUVA); vertex_attrib_flags += (1 << (KRENGINE_ATTRIB_TEXUVA + set));
} }
} }
if (mi.uvb.size()) { if (mi.uv[set].size()) {
if (use_short_uvb) { if (use_short_uv[set]) {
vertex_attrib_flags += (1 << KRENGINE_ATTRIB_TEXUVB_SHORT); vertex_attrib_flags += (1 << (KRENGINE_ATTRIB_TEXUVB_SHORT + set));
} else { } else {
vertex_attrib_flags += (1 << KRENGINE_ATTRIB_TEXUVB); vertex_attrib_flags += (1 << (KRENGINE_ATTRIB_TEXUVB + set));
}
} }
} }
if (mi.bone_names.size()) { if (mi.bone_names.size()) {
@@ -614,7 +619,7 @@ void KRMesh::LoadData(const KRMesh::mesh_info& mi, bool calculate_normals, bool
pHeader->index_count = (__int32_t)index_count; pHeader->index_count = (__int32_t)index_count;
pHeader->index_base_count = (__int32_t)index_base_count; pHeader->index_base_count = (__int32_t)index_base_count;
pHeader->model_format = (__int32_t)mi.format; pHeader->model_format = (__int32_t)mi.format;
strcpy(pHeader->szTag, "KROBJPACK1.2 "); strcpy(pHeader->szTag, "KRMESH1.0 ");
updateAttributeOffsets(); updateAttributeOffsets();
pack_material* pPackMaterials = (pack_material*)(pHeader + 1); pack_material* pPackMaterials = (pack_material*)(pHeader + 1);
@@ -653,11 +658,10 @@ void KRMesh::LoadData(const KRMesh::mesh_info& mi, bool calculate_normals, bool
} else { } else {
m_extents.encapsulate(source_vertex); m_extents.encapsulate(source_vertex);
} }
if ((int)mi.uva.size() > iVertex) { for (int set = 0; set < 8; set++) {
setVertexUVA(iVertex, mi.uva[iVertex]); if ((int)mi.uv[set].size() > iVertex) {
setVertexUV(set, iVertex, mi.uv[set][iVertex]);
} }
if ((int)mi.uvb.size() > iVertex) {
setVertexUVB(iVertex, mi.uvb[iVertex]);
} }
if ((int)mi.normals.size() > iVertex) { if ((int)mi.normals.size() > iVertex) {
setVertexNormal(iVertex, Vector3::Normalize(mi.normals[iVertex])); setVertexNormal(iVertex, Vector3::Normalize(mi.normals[iVertex]));
@@ -712,9 +716,9 @@ void KRMesh::LoadData(const KRMesh::mesh_info& mi, bool calculate_normals, bool
Vector3 first_tangent = getVertexTangent(iVertex); Vector3 first_tangent = getVertexTangent(iVertex);
if (first_tangent.x == 0.0f && first_tangent.y == 0.0f && first_tangent.z == 0.0f) { if (first_tangent.x == 0.0f && first_tangent.y == 0.0f && first_tangent.z == 0.0f) {
Vector2 uv0 = getVertexUVA(iVertex); Vector2 uv0 = getVertexUV(0, iVertex);
Vector2 uv1 = getVertexUVA(iVertex + 1); Vector2 uv1 = getVertexUV(0, iVertex + 1);
Vector2 uv2 = getVertexUVA(iVertex + 2); Vector2 uv2 = getVertexUV(0, iVertex + 2);
Vector2 st1 = Vector2::Create(uv1.x - uv0.x, uv1.y - uv0.y); Vector2 st1 = Vector2::Create(uv1.x - uv0.x, uv1.y - uv0.y);
Vector2 st2 = Vector2::Create(uv2.x - uv0.x, uv2.y - uv0.y); Vector2 st2 = Vector2::Create(uv2.x - uv0.x, uv2.y - uv0.y);
@@ -899,25 +903,13 @@ Vector3 KRMesh::getVertexTangent(int index) const
} }
} }
Vector2 KRMesh::getVertexUVA(int index) const Vector2 KRMesh::getVertexUV(int set, int index) const
{ {
if (has_vertex_attribute(KRENGINE_ATTRIB_TEXUVA_SHORT)) { if (has_vertex_attribute((vertex_attrib_t)(KRENGINE_ATTRIB_TEXUVA_SHORT + set))) {
short* v = (short*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_TEXUVA_SHORT]); short* v = (short*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_TEXUVA_SHORT + set]);
return Vector2::Create((float)v[0] / 32767.0f, (float)v[1] / 32767.0f); return Vector2::Create((float)v[0] / 32767.0f, (float)v[1] / 32767.0f);
} else if (has_vertex_attribute(KRENGINE_ATTRIB_TEXUVA)) { } else if (has_vertex_attribute((vertex_attrib_t)(KRENGINE_ATTRIB_TEXUVA + set))) {
return Vector2::Create((float*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_TEXUVA])); return Vector2::Create((float*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_TEXUVA + set]));
} else {
return Vector2::Zero();
}
}
Vector2 KRMesh::getVertexUVB(int index) const
{
if (has_vertex_attribute(KRENGINE_ATTRIB_TEXUVB_SHORT)) {
short* v = (short*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_TEXUVB_SHORT]);
return Vector2::Create((float)v[0] / 32767.0f, (float)v[1] / 32767.0f);
} else if (has_vertex_attribute(KRENGINE_ATTRIB_TEXUVB)) {
return Vector2::Create((float*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_TEXUVB]));
} else { } else {
return Vector2::Zero(); return Vector2::Zero();
} }
@@ -968,33 +960,20 @@ void KRMesh::setVertexTangent(int index, const Vector3& v)
} }
} }
void KRMesh::setVertexUVA(int index, const Vector2& v) void KRMesh::setVertexUV(int set, int index, const Vector2& v)
{ {
if (has_vertex_attribute(KRENGINE_ATTRIB_TEXUVA_SHORT)) { if (has_vertex_attribute((vertex_attrib_t)((KRENGINE_ATTRIB_TEXUVA_SHORT + set))))
short* vert = (short*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_TEXUVA_SHORT]); {
short* vert = (short*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_TEXUVA_SHORT + set]);
vert[0] = (short)(v.x * 32767.0f); vert[0] = (short)(v.x * 32767.0f);
vert[1] = (short)(v.y * 32767.0f); vert[1] = (short)(v.y * 32767.0f);
} else if (has_vertex_attribute(KRENGINE_ATTRIB_TEXUVA)) { } else if (has_vertex_attribute((vertex_attrib_t)(KRENGINE_ATTRIB_TEXUVA + set))) {
float* vert = (float*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_TEXUVA]); float* vert = (float*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_TEXUVA + set]);
vert[0] = v.x; vert[0] = v.x;
vert[1] = v.y; vert[1] = v.y;
} }
} }
void KRMesh::setVertexUVB(int index, const Vector2& v)
{
if (has_vertex_attribute(KRENGINE_ATTRIB_TEXUVB_SHORT)) {
short* vert = (short*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_TEXUVB_SHORT]);
vert[0] = (short)(v.x * 32767.0f);
vert[1] = (short)(v.y * 32767.0f);
} else if (has_vertex_attribute(KRENGINE_ATTRIB_TEXUVB)) {
float* vert = (float*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_TEXUVB]);
vert[0] = v.x;
vert[1] = v.y;
}
}
int KRMesh::getBoneIndex(int index, int weight_index) const int KRMesh::getBoneIndex(int index, int weight_index) const
{ {
unsigned char* vert = (unsigned char*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_BONEINDEXES]); unsigned char* vert = (unsigned char*)(getVertexData(index) + m_vertex_attribute_offset[KRENGINE_ATTRIB_BONEINDEXES]);
@@ -1037,6 +1016,24 @@ size_t KRMesh::VertexSizeForAttributes(__int32_t vertex_attrib_flags)
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVB)) { if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVB)) {
data_size += sizeof(float) * 2; data_size += sizeof(float) * 2;
} }
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVC)) {
data_size += sizeof(float) * 2;
}
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVD)) {
data_size += sizeof(float) * 2;
}
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVE)) {
data_size += sizeof(float) * 2;
}
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVF)) {
data_size += sizeof(float) * 2;
}
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVG)) {
data_size += sizeof(float) * 2;
}
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVH)) {
data_size += sizeof(float) * 2;
}
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_BONEINDEXES)) { if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_BONEINDEXES)) {
data_size += 4; // 4 bytes data_size += 4; // 4 bytes
} }
@@ -1058,6 +1055,24 @@ size_t KRMesh::VertexSizeForAttributes(__int32_t vertex_attrib_flags)
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVB_SHORT)) { if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVB_SHORT)) {
data_size += sizeof(short) * 2; data_size += sizeof(short) * 2;
} }
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVC_SHORT)) {
data_size += sizeof(short) * 2;
}
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVD_SHORT)) {
data_size += sizeof(short) * 2;
}
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVE_SHORT)) {
data_size += sizeof(short) * 2;
}
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVF_SHORT)) {
data_size += sizeof(short) * 2;
}
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVG_SHORT)) {
data_size += sizeof(short) * 2;
}
if (has_vertex_attribute(vertex_attrib_flags, KRENGINE_ATTRIB_TEXUVH_SHORT)) {
data_size += sizeof(short) * 2;
}
return data_size; return data_size;
} }
@@ -1364,8 +1379,10 @@ void KRMesh::convertToIndexed()
for (int i = 0; i < vertex_count; i++) { for (int i = 0; i < vertex_count; i++) {
Vector3 vertex_position = getVertexPosition(source_index); Vector3 vertex_position = getVertexPosition(source_index);
Vector2 vertex_uva = getVertexUVA(source_index); Vector2 vertex_uv[8];
Vector2 vertex_uvb = getVertexUVB(source_index); for (int set = 0; set < 8; set++) {
vertex_uv[set] = getVertexUV(set, source_index);
}
Vector3 vertex_normal = getVertexNormal(source_index); Vector3 vertex_normal = getVertexNormal(source_index);
Vector3 vertex_tangent = getVertexTangent(source_index); Vector3 vertex_tangent = getVertexTangent(source_index);
std::vector<int> vertex_bone_indexes; std::vector<int> vertex_bone_indexes;
@@ -1446,11 +1463,10 @@ void KRMesh::convertToIndexed()
if (has_vertex_attribute(KRENGINE_ATTRIB_TANGENT) || has_vertex_attribute(KRENGINE_ATTRIB_TANGENT_SHORT)) { if (has_vertex_attribute(KRENGINE_ATTRIB_TANGENT) || has_vertex_attribute(KRENGINE_ATTRIB_TANGENT_SHORT)) {
mi.tangents.push_back(vertex_tangent); mi.tangents.push_back(vertex_tangent);
} }
if (has_vertex_attribute(KRENGINE_ATTRIB_TEXUVA) || has_vertex_attribute(KRENGINE_ATTRIB_TEXUVA_SHORT)) { for (int set = 0; set < 8; set++) {
mi.uva.push_back(vertex_uva); if (has_vertex_attribute((vertex_attrib_t)(KRENGINE_ATTRIB_TEXUVA + set)) || has_vertex_attribute((vertex_attrib_t)(KRENGINE_ATTRIB_TEXUVA_SHORT + set))) {
mi.uv[set].push_back(vertex_uv[set]);
} }
if (has_vertex_attribute(KRENGINE_ATTRIB_TEXUVB) || has_vertex_attribute(KRENGINE_ATTRIB_TEXUVB_SHORT)) {
mi.uvb.push_back(vertex_uvb);
} }
if (has_vertex_attribute(KRENGINE_ATTRIB_BONEINDEXES)) { if (has_vertex_attribute(KRENGINE_ATTRIB_BONEINDEXES)) {
mi.bone_indexes.push_back(vertex_bone_indexes); mi.bone_indexes.push_back(vertex_bone_indexes);

View File

@@ -89,6 +89,12 @@ public:
KRENGINE_ATTRIB_TANGENT, KRENGINE_ATTRIB_TANGENT,
KRENGINE_ATTRIB_TEXUVA, KRENGINE_ATTRIB_TEXUVA,
KRENGINE_ATTRIB_TEXUVB, KRENGINE_ATTRIB_TEXUVB,
KRENGINE_ATTRIB_TEXUVC,
KRENGINE_ATTRIB_TEXUVD,
KRENGINE_ATTRIB_TEXUVE,
KRENGINE_ATTRIB_TEXUVF,
KRENGINE_ATTRIB_TEXUVG,
KRENGINE_ATTRIB_TEXUVH,
KRENGINE_ATTRIB_BONEINDEXES, KRENGINE_ATTRIB_BONEINDEXES,
KRENGINE_ATTRIB_BONEWEIGHTS, KRENGINE_ATTRIB_BONEWEIGHTS,
KRENGINE_ATTRIB_VERTEX_SHORT, KRENGINE_ATTRIB_VERTEX_SHORT,
@@ -96,19 +102,22 @@ public:
KRENGINE_ATTRIB_TANGENT_SHORT, KRENGINE_ATTRIB_TANGENT_SHORT,
KRENGINE_ATTRIB_TEXUVA_SHORT, KRENGINE_ATTRIB_TEXUVA_SHORT,
KRENGINE_ATTRIB_TEXUVB_SHORT, KRENGINE_ATTRIB_TEXUVB_SHORT,
KRENGINE_ATTRIB_TEXUVC_SHORT,
KRENGINE_ATTRIB_TEXUVD_SHORT,
KRENGINE_ATTRIB_TEXUVE_SHORT,
KRENGINE_ATTRIB_TEXUVF_SHORT,
KRENGINE_ATTRIB_TEXUVG_SHORT,
KRENGINE_ATTRIB_TEXUVH_SHORT,
KRENGINE_NUM_ATTRIBUTES KRENGINE_NUM_ATTRIBUTES
} vertex_attrib_t; } vertex_attrib_t;
typedef struct typedef struct
{ {
ModelFormat format; ModelFormat format;
std::vector<hydra::Vector3> vertices; std::vector<hydra::Vector3> vertices;
std::vector<__uint16_t> vertex_indexes; std::vector<__uint16_t> vertex_indexes;
std::vector<std::pair<int, int> > vertex_index_bases; std::vector<std::pair<int, int> > vertex_index_bases;
std::vector<hydra::Vector2> uva; std::vector<hydra::Vector2> uv[8];
std::vector<hydra::Vector2> uvb;
std::vector<hydra::Vector3> normals; std::vector<hydra::Vector3> normals;
std::vector<hydra::Vector3> tangents; std::vector<hydra::Vector3> tangents;
std::vector<int> submesh_starts; std::vector<int> submesh_starts;
@@ -206,16 +215,14 @@ public:
hydra::Vector3 getVertexPosition(int index) const; hydra::Vector3 getVertexPosition(int index) const;
hydra::Vector3 getVertexNormal(int index) const; hydra::Vector3 getVertexNormal(int index) const;
hydra::Vector3 getVertexTangent(int index) const; hydra::Vector3 getVertexTangent(int index) const;
hydra::Vector2 getVertexUVA(int index) const; hydra::Vector2 getVertexUV(int set, int index) const;
hydra::Vector2 getVertexUVB(int index) const;
int getBoneIndex(int index, int weight_index) const; int getBoneIndex(int index, int weight_index) const;
float getBoneWeight(int index, int weight_index) const; float getBoneWeight(int index, int weight_index) const;
void setVertexPosition(int index, const hydra::Vector3& v); void setVertexPosition(int index, const hydra::Vector3& v);
void setVertexNormal(int index, const hydra::Vector3& v); void setVertexNormal(int index, const hydra::Vector3& v);
void setVertexTangent(int index, const hydra::Vector3& v); void setVertexTangent(int index, const hydra::Vector3& v);
void setVertexUVA(int index, const hydra::Vector2& v); void setVertexUV(int set, int index, const hydra::Vector2& v);
void setVertexUVB(int index, const hydra::Vector2& v);
void setBoneIndex(int index, int weight_index, int bone_index); void setBoneIndex(int index, int weight_index, int bone_index);
void setBoneWeight(int index, int weight_index, float bone_weight); void setBoneWeight(int index, int weight_index, float bone_weight);

View File

@@ -44,10 +44,10 @@ KRMeshQuad::KRMeshQuad(KRContext& context) : KRMesh(context, "__quad")
mi.vertices.push_back(Vector3::Create(-1.0f, 1.0f, 0.0f)); mi.vertices.push_back(Vector3::Create(-1.0f, 1.0f, 0.0f));
mi.vertices.push_back(Vector3::Create(1.0f, 1.0f, 0.0f)); mi.vertices.push_back(Vector3::Create(1.0f, 1.0f, 0.0f));
mi.uva.push_back(Vector2::Create(0.0f, 0.0f)); mi.uv[0].push_back(Vector2::Create(0.0f, 0.0f));
mi.uva.push_back(Vector2::Create(1.0f, 0.0f)); mi.uv[0].push_back(Vector2::Create(1.0f, 0.0f));
mi.uva.push_back(Vector2::Create(0.0f, 1.0f)); mi.uv[0].push_back(Vector2::Create(0.0f, 1.0f));
mi.uva.push_back(Vector2::Create(1.0f, 1.0f)); mi.uv[0].push_back(Vector2::Create(1.0f, 1.0f));
mi.submesh_starts.push_back(0); mi.submesh_starts.push_back(0);