Files
FC1/Editor/Brush/BrushPlane.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

160 lines
3.5 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2002.
// -------------------------------------------------------------------------
// File name: brushplane.cpp
// Version: v1.00
// Created: 9/7/2002 by Timur.
// Compilers: Visual Studio.NET
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "BrushPlane.h"
#include "BrushPoly.h"
// Local variables.
namespace
{
Vec3d s_baseAxis[] =
{
Vec3d(0,0,1), Vec3d(1,0,0), Vec3d(0,-1,0), Vec3d(1,0,0), Vec3d(0,-1,0), // floor
Vec3d(0,0,-1), Vec3d(1,0,0), Vec3d(0,-1,0), Vec3d(1,0,0), Vec3d(0,-1,0), // ceiling
Vec3d(1,0,0), Vec3d(0,1,0), Vec3d(0,0,-1), Vec3d(0,1,0), Vec3d(0,0,-1), // west wall
Vec3d(-1,0,0), Vec3d(0,1,0), Vec3d(0,0,-1), Vec3d(0,1,0), Vec3d(0,0,-1), // east wall
Vec3d(0,1,0), Vec3d(1,0,0), Vec3d(0,0,-1), Vec3d(1,0,0), Vec3d(0,0,-1), // south wall
Vec3d(0,-1,0), Vec3d(1,0,0), Vec3d(0,0,-1), Vec3d(1,0,0), Vec3d(0,0,-1) // north wall
};
}
#define PLANE_NORMAL_EPSILON 0.0001f
#define PLANE_DIST_EPSILON 0.001f
//////////////////////////////////////////////////////////////////////////
//
// SBrushPlane implementation
//
//////////////////////////////////////////////////////////////////////////
int SBrushPlane::Equal(SBrushPlane *b, int flip)
{
Vec3d norm;
float dst;
if (flip)
{
norm[0] = -b->normal[0];
norm[1] = -b->normal[1];
norm[2] = -b->normal[2];
dst = -b->dist;
}
else
{
norm[0] = b->normal[0];
norm[1] = b->normal[1];
norm[2] = b->normal[2];
dst = b->dist;
}
if (fabs(norm[0]-normal[0]) < PLANE_NORMAL_EPSILON &&
fabs(norm[1]-normal[1]) < PLANE_NORMAL_EPSILON &&
fabs(norm[2]-normal[2]) < PLANE_NORMAL_EPSILON &&
fabs(dst-dist) < PLANE_DIST_EPSILON)
return true;
return false;
}
//////////////////////////////////////////////////////////////////////////
void SBrushPlane::CalcTextureAxis(Vec3d& xv, Vec3d& yv, bool bTex)
{
int bestaxis;
float dot,best;
int i;
best = 0;
bestaxis = 0;
for (i=0 ; i<6 ; i++)
{
dot = normal | s_baseAxis[i*5];
if (dot > best)
{
best = dot;
bestaxis = i;
}
}
if (bTex)
{
xv = s_baseAxis[bestaxis*5+1];
yv = s_baseAxis[bestaxis*5+2];
}
else
{
xv = s_baseAxis[bestaxis*5+3];
yv = s_baseAxis[bestaxis*5+4];
}
}
//////////////////////////////////////////////////////////////////////////
SBrushPoly *SBrushPlane::CreatePoly()
{
int i, x;
float max, v;
Vec3d org, vright, vup;
SBrushPoly *p;
max = -99999;
x = -1;
for (i=0 ; i<3; i++)
{
v = (float)fabs(normal[i]);
if (v > max)
{
x = i;
max = v;
}
}
if (x==-1)
{
CLogFile::WriteLine("Error: SBrushPlane::CreatePoly: no axis found");
return NULL;
}
vup(0,0,0);
if (x != 2)
vup = Vec3d(0,0,1);
else
vup = Vec3d(1,0,0);
v = vup | normal;
vup += normal * -v;
vup.Normalize();
org = normal * dist;
vright = vup ^ normal;
vup *= 32768.0f;
vright *= 32768.0f;
// project a really big axis aligned box onto the plane
p = new SBrushPoly(4);
p->m_Pts[0].xyz = org - vright;
p->m_Pts[0].xyz += vup;
p->m_Pts[1].xyz = org + vright;
p->m_Pts[1].xyz += vup;
p->m_Pts[2].xyz = org + vright;
p->m_Pts[2].xyz -= vup;
p->m_Pts[3].xyz = org - vright;
p->m_Pts[3].xyz -= vup;
return p;
}