Files
tech5/source/engine/cm/jobs/polygonmodel/polygonmodeldata.h
T
2026-08-09 01:29:43 -07:00

46 lines
1.6 KiB
C++

#pragma once
#include "cm/collisiontypes.h"
#include "cm/jobs/polygonmodel/polygonmodel_inline.h"
inline int CM_EdgeIndex(const std::uint16_t edgeReference) {
return edgeReference & 0x7FFF;
}
inline int CM_EdgeStartVertex(const cm_edge_t& edge,
const std::uint16_t edgeReference) {
return edge.vertexNum[edgeReference >> 15];
}
inline int CM_EdgeEndVertex(const cm_edge_t& edge,
const std::uint16_t edgeReference) {
return edge.vertexNum[(edgeReference >> 15) ^ 1];
}
// Recovered from engine/cm/jobs/polygonmodel/polygonmodeldata.h.
inline void CM_GetPolygonPlane(const cm_subModelPtrs_t& subModel,
const cm_polygon_t& polygon, idPlane& plane) {
const std::uint16_t firstReference =
subModel.polygonEdges[polygon.firstEdge];
const std::uint16_t secondReference =
subModel.polygonEdges[polygon.firstEdge + 1];
const cm_edge_t& firstEdge =
subModel.edges[CM_EdgeIndex(firstReference)];
const cm_edge_t& secondEdge =
subModel.edges[CM_EdgeIndex(secondReference)];
const idVec3& firstPoint =
subModel.vertices[CM_EdgeStartVertex(firstEdge, firstReference)].p;
const idVec3& sharedPoint =
subModel.vertices[CM_EdgeStartVertex(secondEdge, secondReference)].p;
const idVec3& secondPoint =
subModel.vertices[CM_EdgeEndVertex(secondEdge, secondReference)].p;
idVec3 normal = (secondPoint - sharedPoint).Cross(
firstPoint - sharedPoint);
normal.NormalizeFast();
plane.a = normal.x;
plane.b = normal.y;
plane.c = normal.z;
plane.d = -normal.Dot(sharedPoint);
}