Added collision model code.
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user