mirror of
https://git.mirrors.martin98.com/https://github.com/google/draco
synced 2025-06-04 11:25:44 +08:00
204 lines
3.3 KiB
Markdown
204 lines
3.3 KiB
Markdown
## Corners
|
|
|
|
### Next()
|
|
|
|
~~~~~
|
|
int Next(corner) {
|
|
if (corner < 0)
|
|
return corner;
|
|
return ((corner % 3) == 2) ? corner - 2 : corner + 1;
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### Previous()
|
|
|
|
~~~~~
|
|
int Previous(corner) {
|
|
if (corner < 0)
|
|
return corner;
|
|
return ((corner % 3) == 0) ? corner + 2 : corner - 1;
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### PosOpposite()
|
|
|
|
~~~~~
|
|
int PosOpposite(c) {
|
|
if (c >= opposite_corners_.size())
|
|
return -1;
|
|
return opposite_corners_[c];
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### AttrOpposite()
|
|
|
|
~~~~~
|
|
int AttrOpposite(attr, corner) {
|
|
if (IsCornerOppositeToSeamEdge(corner))
|
|
return -1;
|
|
return PosOpposite(corner);
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### Opposite()
|
|
|
|
~~~~~
|
|
int Opposite(att_dec, c) {
|
|
if (att_dec == 0 || att_dec_decoder_type[att_dec] == MESH_VERTEX_ATTRIBUTE)
|
|
return PosOpposite(c);
|
|
return AttrOpposite(att_dec - 1, c);
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### GetLeftCorner()
|
|
|
|
~~~~~
|
|
int GetLeftCorner(corner_id) {
|
|
if (corner_id < 0)
|
|
return kInvalidCornerIndex;
|
|
return PosOpposite(Previous(corner_id));
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### GetRightCorner()
|
|
|
|
~~~~~
|
|
int GetRightCorner(corner_id) {
|
|
if (corner_id < 0)
|
|
return kInvalidCornerIndex;
|
|
return PosOpposite(Next(corner_id));
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### SwingRight()
|
|
|
|
~~~~~
|
|
int SwingRight(attr_dec, corner) {
|
|
return Previous(Opposite(attr_dec, Previous(corner)));
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### SwingLeft()
|
|
|
|
~~~~~
|
|
int SwingLeft(attr_dec, corner) {
|
|
return Next(Opposite(attr_dec, Next(corner)));
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### CornerToVert()
|
|
|
|
~~~~~
|
|
int CornerToVert(att_dec, corner_id) {
|
|
CornerToVerts(att_dec, corner_id, &v, &n, &p);
|
|
return v;
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### CornerToVertsInternal()
|
|
|
|
~~~~~
|
|
void CornerToVertsInternal(ftv, corner_id, v, n, p) {
|
|
local = corner_id % 3;
|
|
face = corner_id / 3;
|
|
if (local == 0) {
|
|
v = ftv[0][face];
|
|
n = ftv[1][face];
|
|
p = ftv[2][face];
|
|
} else if (local == 1) {
|
|
v = ftv[1][face];
|
|
n = ftv[2][face];
|
|
p = ftv[0][face];
|
|
} else if (local == 2) {
|
|
v = ftv[2][face];
|
|
n = ftv[0][face];
|
|
p = ftv[1][face];
|
|
}
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### CornerToVerts()
|
|
|
|
~~~~~
|
|
void CornerToVerts(att_dec, corner_id, v, n, p) {
|
|
if (att_dec == 0) {
|
|
return CornerToVertsInternal(face_to_vertex, corner_id, v, n, p);
|
|
} else {
|
|
if (att_dec_decoder_type[att_dec] == MESH_VERTEX_ATTRIBUTE) {
|
|
return CornerToVertsInternal(face_to_vertex, corner_id, v, n, p);
|
|
} else {
|
|
return CornerToVertsInternal(attr_face_to_vertex[att_dec - 1], corner_id,
|
|
v, n, p);
|
|
}
|
|
}
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### SetOppositeCorners()
|
|
|
|
~~~~~
|
|
void SetOppositeCorners(c, opp_c) {
|
|
opposite_corners_[c] = opp_c;
|
|
opposite_corners_[opp_c] = c;
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### MapCornerToVertex()
|
|
|
|
~~~~~
|
|
void MapCornerToVertex(corner_id, vert_id) {
|
|
corner_to_vertex_map_[0][corner_id] = vert_id;
|
|
if (vert_id >= 0) {
|
|
vertex_corners_[vert_id] = corner_id;
|
|
}
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|
|
|
|
|
|
### UpdateVertexToCornerMap()
|
|
|
|
~~~~~
|
|
void UpdateVertexToCornerMap(vert) {
|
|
first_c = vertex_corners_[vert];
|
|
if (first_c < 0)
|
|
return;
|
|
act_c = SwingLeft(0, first_c);
|
|
c = first_c;
|
|
while (act_c >= 0 && act_c != first_c) {
|
|
c = act_c;
|
|
act_c = SwingLeft(0, act_c);
|
|
}
|
|
if (act_c != first_c) {
|
|
vertex_corners_[vert] = c;
|
|
}
|
|
}
|
|
~~~~~
|
|
{:.draco-syntax}
|