mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
Auto disable billboards for 3D models (#579)
This commit is contained in:
parent
16e78ee36a
commit
f1e216649d
2 changed files with 29 additions and 2 deletions
|
|
@ -141,6 +141,30 @@ void DynOS_Vtx_Load(BinFile *aFile, GfxData *aGfxData) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Billboard check
|
||||||
|
if (!(_Node->mFlags & GRAPH_EXTRA_FORCE_3D)) {
|
||||||
|
Vec3f pn = { 0, 0, 0 };
|
||||||
|
for (u32 i = 2; i < _Node->mSize; ++i) {
|
||||||
|
Vec3f p0; vec3f_copy(p0, _Node->mData[i - 2].v.ob);
|
||||||
|
Vec3f p1; vec3f_copy(p1, _Node->mData[i - 1].v.ob);
|
||||||
|
Vec3f p2; vec3f_copy(p2, _Node->mData[i - 0].v.ob);
|
||||||
|
Vec3f v0; vec3f_dif(v0, p0, p1);
|
||||||
|
Vec3f v1; vec3f_dif(v1, p1, p2);
|
||||||
|
Vec3f vn; vec3f_cross(vn, v0, v1);
|
||||||
|
if (vn[0] != 0.f || vn[1] != 0.f || vn[2] != 0.f) { // skip zero normals
|
||||||
|
vec3f_normalize(vn);
|
||||||
|
if (pn[0] != 0.f || pn[1] != 0.f || pn[2] != 0.f) { // don't compare to zero normal
|
||||||
|
f32 dot = vec3f_dot(vn, pn);
|
||||||
|
if (dot < 0.9f) { // Points don't form a plane -> no billboard
|
||||||
|
_Node->mFlags |= GRAPH_EXTRA_FORCE_3D;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vec3f_copy(pn, vn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Append
|
// Append
|
||||||
aGfxData->mVertices.Add(_Node);
|
aGfxData->mVertices.Add(_Node);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -54,8 +54,11 @@ static void DynOS_Pack_ActivateActor(s32 aPackIndex, Pair<const char *, GfxData
|
||||||
actorGfx.mGraphNode = graphNode;
|
actorGfx.mGraphNode = graphNode;
|
||||||
actorGfx.mPackIndex = aPackIndex;
|
actorGfx.mPackIndex = aPackIndex;
|
||||||
|
|
||||||
if (geoNode->mFlags & GRAPH_EXTRA_FORCE_3D) {
|
for (const auto &vtxNode : aGfxData->mVertices) {
|
||||||
|
if (vtxNode->mFlags & GRAPH_EXTRA_FORCE_3D) {
|
||||||
actorGfx.mGraphNode->extraFlags |= GRAPH_EXTRA_FORCE_3D;
|
actorGfx.mGraphNode->extraFlags |= GRAPH_EXTRA_FORCE_3D;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DynOS_Actor_Valid(georef, actorGfx);
|
DynOS_Actor_Valid(georef, actorGfx);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue