105#if (OPTIMIZE_PLANEEQ_RAM)
110#if (OPTIMIZE_VNORM_RAM)
290 if ((polycount != 0) && (vertcount != 0)) {
299#if (!OPTIMIZE_VNORM_RAM)
349 strcpy(
MeshName->Get_Array(),newname);
394 strcpy(
UserText->Get_Array(),usertext);
458 for (
int poly_counter = 0; poly_counter <
PolyCount; poly_counter++) {
460 tri.
V[0] = &(loc[ polys[poly_counter][0] ]);
461 tri.
V[1] = &(loc[ polys[poly_counter][1] ]);
462 tri.
V[2] = &(loc[ polys[poly_counter][2] ]);
463 tri.
N = (
Vector3*)&(norms[poly_counter]);
466 apt.
Add(poly_counter);
489 CullTree->Generate_APT(local_box, apt);
498 for (
int poly_counter = 0; poly_counter <
PolyCount; poly_counter++) {
500 tri.
V[0] = &(loc[ polys[poly_counter][0] ]);
501 tri.
V[1] = &(loc[ polys[poly_counter][1] ]);
502 tri.
V[2] = &(loc[ polys[poly_counter][2] ]);
503 tri.
N = (
Vector3*)&(norms[poly_counter]);
506 apt.
Add(poly_counter);
528 CullTree->Generate_APT(local_box, viewdir,apt);
537 for (
int poly_counter = 0; poly_counter <
PolyCount; poly_counter++) {
539 tri.
V[0] = &(loc[ polys[poly_counter][0] ]);
540 tri.
V[1] = &(loc[ polys[poly_counter][1] ]);
541 tri.
V[2] = &(loc[ polys[poly_counter][2] ]);
542 tri.
N = (
Vector3*)&(norms[poly_counter]);
546 apt.
Add(poly_counter);
575 for (
int poly_counter=0; poly_counter <
PolyCount; poly_counter++) {
577 tri.
V[0] = &(world_vertex_locs[ polys[poly_counter][0] ]);
578 tri.
V[1] = &(world_vertex_locs[ polys[poly_counter][1] ]);
579 tri.
V[2] = &(world_vertex_locs[ polys[poly_counter][2] ]);
584 static const Vector3 dummy_vec(0.0f, 0.0f, 1.0f);
588 apt.
Add(poly_counter);
622 for (
int axis_dir = 0; axis_dir < 6; axis_dir++) {
627 if (intersections & 0x01) {
681 hit =
CullTree->Cast_AABox(boxtest);
707 hit =
CullTree->Cast_OBBox(boxtest);
733 hit =
CullTree->Intersect_OBBox(boxtest);
767 if ((transform[0][0] == 1.0f) && (transform[1][1] == 1.0f)) {
771 }
else if ((transform[0][1] == -1.0f) && (transform[1][0] == 1.0f)) {
776 }
else if ((transform[0][0] == -1.0f) && (transform[1][1] == -1.0f)) {
781 }
else if ((transform[0][1] == 1.0f) && (transform[1][0] == -1.0f)) {
834 unsigned char & flags)
838 count =
CullTree->Cast_Semi_Infinite_Axis_Aligned_Ray(start_point, axis_dir, flags);
851 static const int axis_r[6] = { 0, 0, 1, 1, 2, 2 };
852 static const int axis_1[6] = { 1, 1, 2, 2, 0, 0 };
853 static const int axis_2[6] = { 2, 2, 0, 0, 1, 1 };
854 static const int direction[6] = { 1, 0, 1, 0, 1, 0 };
866 for (
int poly_counter=0; poly_counter < poly_count; poly_counter++) {
868 const Vector3 &v0 = loc[ polyverts[poly_counter][0] ];
869 const Vector3 &v1 = loc[ polyverts[poly_counter][1] ];
870 const Vector3 &v2 = loc[ polyverts[poly_counter][2] ];
871 const Vector4 &tri_plane = plane[poly_counter];
875 tri_plane, start_point, axis_r[axis_dir], axis_1[axis_dir], axis_2[axis_dir],
876 direction[axis_dir], flags);
904 return CullTree->Cast_AABox(newbox);
1010 hit =
CullTree->Cast_AABox(newbox);
1046#ifndef COMPUTE_NORMALS
1055 tri.
V[0] = &(loc[ polyverts[srtri][0] ]);
1056 tri.
V[1] = &(loc[ polyverts[srtri][1] ]);
1057 tri.
V[2] = &(loc[ polyverts[srtri][2] ]);
1059#ifdef COMPUTE_NORMALS
1064 tri.
N = (
Vector3 *)&(norms[srtri]);
1095#ifndef COMPUTE_NORMALS
1106 tri.
V[0] = &(loc[ polyverts[srtri][0] ]);
1107 tri.
V[1] = &(loc[ polyverts[srtri][1] ]);
1108 tri.
V[2] = &(loc[ polyverts[srtri][2] ]);
1110#ifdef COMPUTE_NORMALS
1115 tri.
N = (
Vector3 *)&(norms[srtri]);
1154#ifndef COMPUTE_NORMALS
1160 tri.
V[0] = &(loc[ polyverts[srtri][0] ]);
1161 tri.
V[1] = &(loc[ polyverts[srtri][1] ]);
1162 tri.
V[2] = &(loc[ polyverts[srtri][2] ]);
1164#ifdef COMPUTE_NORMALS
1169 tri.
N = (
Vector3 *)&(norms[srtri]);
1180 if (polyhit != -1) {
1212#ifndef COMPUTE_NORMALS
1218 tri.
V[0] = &(loc[ polyverts[srtri][0] ]);
1219 tri.
V[1] = &(loc[ polyverts[srtri][1] ]);
1220 tri.
V[2] = &(loc[ polyverts[srtri][2] ]);
1222#ifdef COMPUTE_NORMALS
1227 tri.
N = (
Vector3 *)&(norms[srtri]);
1238 if (polyhit != -1) {
1267 for(
int pidx = 0; pidx <
PolyCount; pidx++)
1270 const Vector3 & p0= vert[poly[pidx][0]];
1315 for(
int pidx = 0; pidx <
PolyCount; pidx++) {
1317 vnorm[poly[pidx].
I].
X += peq[pidx].
X;
1318 vnorm[poly[pidx].
I].
Y += peq[pidx].
Y;
1319 vnorm[poly[pidx].
I].
Z += peq[pidx].
Z;
1321 vnorm[poly[pidx].
J].
X += peq[pidx].
X;
1322 vnorm[poly[pidx].
J].
Y += peq[pidx].
Y;
1323 vnorm[poly[pidx].
J].
Z += peq[pidx].
Z;
1325 vnorm[poly[pidx].
K].
X += peq[pidx].
X;
1326 vnorm[poly[pidx].
K].
Y += peq[pidx].
Y;
1327 vnorm[poly[pidx].
K].
Z += peq[pidx].
Z;
1334 for (
int pidx = 0; pidx <
PolyCount; pidx++) {
1336 vnorm[shadeIx[poly[pidx].
I]].
X += peq[pidx].
X;
1337 vnorm[shadeIx[poly[pidx].
I]].
Y += peq[pidx].
Y;
1338 vnorm[shadeIx[poly[pidx].
I]].
Z += peq[pidx].
Z;
1340 vnorm[shadeIx[poly[pidx].
J]].
X += peq[pidx].
X;
1341 vnorm[shadeIx[poly[pidx].
J]].
Y += peq[pidx].
Y;
1342 vnorm[shadeIx[poly[pidx].
J]].
Z += peq[pidx].
Z;
1344 vnorm[shadeIx[poly[pidx].
K]].
X += peq[pidx].
X;
1345 vnorm[shadeIx[poly[pidx].
K]].
Y += peq[pidx].
Y;
1346 vnorm[shadeIx[poly[pidx].
K]].
Z += peq[pidx].
Z;
1351 for (
unsigned vidx = 0; vidx < (unsigned)
VertexCount; vidx ++) {
1352 if (shadeIx[vidx] == vidx) {
1355 vnorm[vidx] = vnorm[shadeIx[vidx]];
1391 if (verts ==
NULL) {
1392 verts =
Vertex->Get_Array();
1419#if (OPTIMIZE_VNORM_RAM)
1421 return &(_VNormArray[0]);
1443#if (OPTIMIZE_VNORM_RAM)
1470#if (OPTIMIZE_PLANEEQ_RAM)
1471 _PlaneEQArray.Uninitialised_Grow(
PolyCount);
1472 return &(_PlaneEQArray[0]);
1499#if (OPTIMIZE_PLANEEQ_RAM)
1531 set_plane->
Set(verts[poly.
I],verts[poly.
J],verts[poly.
K]);
1590 WWDEBUG_SAY((
"Old format mesh mesh, no longer supported.\n"));
1609 namelen += strlen(header.
MeshName);
1614 memset(tmpname,0,namelen);
1618 strcat(tmpname,
".");
1641 switch (geometry_type)
1830 mdlnorms[i].
Set(norm.
X,norm.
Y,norm.
Z);
1875 peq[i].
W = -tri.
Dist;
1917 if (cload.
Read(
UserText->Get_Array(),textlen) != textlen) {
1977 shade_index[i] = si;
2020 max = (sc.
X > sc.
Y) ? sc.
X : sc.
Y;
2025 if (sc.
X != sc.
Y || sc.
Y != sc.
Z) {
2069#if (OPTIMIZE_VNORMS)
2076 for (vi = 0; vi < vertex_count;) {
2082 int idx=bonelink[vi];
2084 for (cnt = vi; cnt < vertex_count; cnt++) {
2085 if (idx!=bonelink[cnt]) {
2107 for (
int vi = 0; vi < vertex_count;) {
2108 int idx=bonelink[vi];
2113 for (
int cnt = vi; cnt < vertex_count; cnt++)
if (idx!=bonelink[cnt])
break;
#define W3D_MESH_FLAG_GEOMETRY_TYPE_MASK
#define W3D_MESH_FLAG_TWO_SIDED
#define W3D_MESH_FLAG_COLLISION_TYPE_SHIFT
#define W3D_MESH_FLAG_CAST_SHADOW
@ W3D_CHUNK_VERTEX_SHADE_INDICES
@ W3D_CHUNK_MESH_USER_TEXT
@ W3D_CHUNK_VERTEX_NORMALS
@ W3D_CHUNK_VERTEX_INFLUENCES
#define W3D_MESH_FLAG_GEOMETRY_TYPE_NORMAL
#define W3D_MESH_FLAG_COLLISION_TYPE_MASK
#define W3D_MAKE_VERSION(major, minor)
#define W3D_MESH_FLAG_GEOMETRY_TYPE_SKIN
#define W3D_MESH_FLAG_GEOMETRY_TYPE_CAMERA_ALIGNED
#define W3D_MESH_FLAG_GEOMETRY_TYPE_CAMERA_ORIENTED
@ W3D_CHUNK_SURRENDER_NORMALS
void Build_AABTree(int polycount, TriIndex *polys, int vertcount, Vector3 *verts)
void Set_Mesh(MeshGeometryClass *mesh)
void Translate(const Vector3 &translation)
void Rotate(ROTATION_TYPE rotation)
void Get_View_Matrix(Matrix3D *set_tm)
void Get_Projection_Matrix(Matrix4x4 *set_tm)
uint32 Cur_Chunk_Length()
uint32 Read(void *buf, uint32 nbytes)
static bool Collide(const LineSegClass &line, const AAPlaneClass &plane, CastResultStruct *result)
static bool Intersection_Test(const AABoxClass &box, const TriClass &tri)
CastResultStruct * Result
WWINLINE const Matrix3D & Get_Transform(int pivot) const
WWINLINE void Set_Translation(const Vector3 &t)
Vector3 Rotate_Vector(const Vector3 &vect) const
void Get_Orthogonal_Inverse(Matrix3D &set_inverse) const
static WWINLINE void Transform_Vector(const Matrix3D &tm, const Vector3 &in, Vector3 *out)
WWINLINE Vector3 Get_Translation(void) const
WW3DErrorType read_vertex_shade_indices(ChunkLoadClass &cload)
uint32 * get_shade_indices(bool create=true)
void Get_Bounding_Sphere(SphereClass *set_sphere)
ShareBufferClass< uint8 > * PolySurfaceType
void Reset_Geometry(int polycount, int vertcount)
ShareBufferClass< uint16 > * VertexBoneLink
WW3DErrorType read_vertex_influences(ChunkLoadClass &cload)
virtual void Compute_Plane_Equations(Vector4 *array)
ShareBufferClass< char > * UserText
void Generate_Skin_APT(const OBBoxClass &world_box, SimpleDynVecClass< uint32 > &apt, const Vector3 *world_vertex_locs)
bool cast_aabox_brute_force(AABoxCollisionTestClass &boxtest)
bool Intersect_OBBox(OBBoxIntersectionTestClass &boxtest)
ShareBufferClass< Vector3 > * Vertex
ShareBufferClass< uint32 > * VertexShadeIdx
void get_deformed_screenspace_vertices(Vector4 *dst_vert, const RenderInfoClass &rinfo, const Matrix3D &mesh_tm, const HTreeClass *htree)
bool cast_ray_brute_force(RayCollisionTestClass &raytest)
virtual void Compute_Bounds(Vector3 *verts)
WW3DErrorType read_vertex_normals(ChunkLoadClass &cload)
virtual WW3DErrorType Load_W3D(ChunkLoadClass &cload)
ShareBufferClass< Vector4 > * PlaneEq
const Vector3 * Get_Vertex_Normal_Array(void)
bool cast_obbox_brute_force(OBBoxCollisionTestClass &boxtest)
bool Cast_World_Space_AABox(AABoxCollisionTestClass &boxtest, const Matrix3D &transform)
bool Contains(const Vector3 &point)
int Get_Vertex_Count(void) const
bool Cast_AABox(AABoxCollisionTestClass &boxtest)
virtual ~MeshGeometryClass(void)
const char * Get_Name(void) const
void Compute_Plane(int pidx, PlaneClass *set_plane) const
TriIndex * get_polys(void)
const TriIndex * Get_Polygon_Array(void)
ShareBufferClass< Vector3 > * VertexNorm
MeshGeometryClass & operator=(const MeshGeometryClass &that)
bool Cast_OBBox(OBBoxCollisionTestClass &boxtest)
WW3DErrorType read_user_text(ChunkLoadClass &cload)
WW3DErrorType read_vertices(ChunkLoadClass &cload)
bool Cast_Ray(RayCollisionTestClass &raytest)
uint16 * get_bone_links(bool create=true)
virtual void Compute_Vertex_Normals(Vector3 *array)
Vector4 * get_planes(bool create=true)
uint8 * Get_Poly_Surface_Type_Array(void)
ShareBufferClass< TriIndex > * Poly
void Scale(const Vector3 &sc)
Vector3 * Get_Vertex_Array(void)
WW3DErrorType read_chunks(ChunkLoadClass &cload)
bool intersect_obbox_brute_force(OBBoxIntersectionTestClass &localtest)
int cast_semi_infinite_axis_aligned_ray(const Vector3 &start_point, int axis_dir, unsigned char &flags)
void Generate_Rigid_APT(const Vector3 &view_dir, SimpleDynVecClass< uint32 > &apt)
void Generate_Culling_Tree(void)
void Set_Flag(FlagsType flag, bool onoff)
bool cast_aabox_z270(AABoxCollisionTestClass &boxtest, const Vector3 &trans)
ShareBufferClass< char > * MeshName
bool cast_aabox_z90(AABoxCollisionTestClass &boxtest, const Vector3 &trans)
WW3DErrorType read_aabtree(ChunkLoadClass &cload)
void Set_Name(const char *newname)
void Set_User_Text(char *usertext)
int Get_Polygon_Count(void) const
bool cast_aabox_z180(AABoxCollisionTestClass &boxtest, const Vector3 &trans)
const char * Get_User_Text(void)
void get_deformed_vertices(Vector3 *dst_vert, Vector3 *dst_norm, const HTreeClass *htree)
uint8 Get_Poly_Surface_Type(int poly_index) const
void Get_Bounding_Box(AABoxClass *set_box)
Vector3 BoundSphereCenter
WW3DErrorType read_triangles(ChunkLoadClass &cload)
int Get_Flag(FlagsType flag)
const uint32 * Get_Vertex_Shade_Index_Array(bool create=true)
Vector3 * get_vert_normals(void)
const Vector4 * Get_Plane_Array(bool create=true)
bool cast_aabox_identity(AABoxCollisionTestClass &boxtest, const Vector3 &trans)
void Set(float a, float b, float c, float d)
bool Add(T const &object, int new_size_hint=0)
static WWINLINE float Dot_Product(const Vector3 &a, const Vector3 &b)
static WWINLINE void Subtract(const Vector3 &a, const Vector3 &b, Vector3 *c)
static WWINLINE void Cross_Product(const Vector3 &a, const Vector3 &b, Vector3 *result)
WWINLINE void Set(float x, float y, float z)
WWINLINE void Set(float x, float y, float z, float w)
static void Normalize(Vector3 *dst, const int count)
static void Transform(Vector3 *dst, const Vector3 *src, const Matrix3D &matrix, const int count)
static void Clear(Vector3 *dst, const int count)
static void MinMax(Vector3 *src, Vector3 &min, Vector3 &max, const int count)
#define REF_PTR_RELEASE(x)
#define REF_PTR_SET(dst, src)
bool Cast_Semi_Infinite_Axis_Aligned_Ray_To_Triangle(const Vector3 &tri_point0, const Vector3 &tri_point1, const Vector3 &tri_point2, const Vector4 &tri_plane, const Vector3 &ray_start, int axis_r, int axis_1, int axis_2, int direction, unsigned char &flags)
@ TRI_RAYCAST_FLAG_START_IN_TRI
@ TRI_RAYCAST_FLAG_HIT_EDGE
#define WWMEMLOG(category)