55 for (int32_t i = 0; i < 4; ++i)
65 rot_matrix[0] =
Cos(angle); rot_matrix[1] = -
Sin(angle);
66 rot_matrix[2] = -rot_matrix[1]; rot_matrix[3] = rot_matrix[0];
71 for (int32_t cnt = 0; cnt <
VtxNum; cnt++)
73 int32_t old_x =
VtxX[cnt];
74 int32_t old_y =
VtxY[cnt];
75 VtxX[cnt] =
fixtoi(rot_matrix[0] * old_x + rot_matrix[1] * old_y);
76 VtxY[cnt] =
fixtoi(rot_matrix[2] * old_x + rot_matrix[3] * old_y);
81 int32_t new_x =
fixtoi(rot_matrix[0] *
x + rot_matrix[1] *
y);
82 int32_t new_y =
fixtoi(rot_matrix[2] *
x + rot_matrix[3] *
y);
85 if (rot_matrix[0] > 0)
87 if (rot_matrix[1] > 0)
89 new_wdt =
fixtoi(rot_matrix[0] *
Wdt + rot_matrix[1] *
Hgt);
90 new_hgt =
fixtoi(rot_matrix[1] *
Wdt + rot_matrix[0] *
Hgt);
96 new_wdt =
fixtoi(rot_matrix[0] *
Wdt - rot_matrix[1] *
Hgt);
97 new_hgt =
fixtoi(- rot_matrix[1] *
Wdt + rot_matrix[0] *
Hgt);
104 if (rot_matrix[1] > 0)
106 new_wdt =
fixtoi(- rot_matrix[0] *
Wdt + rot_matrix[1] *
Hgt);
107 new_hgt =
fixtoi(rot_matrix[1] *
Wdt - rot_matrix[0] *
Hgt);
113 new_wdt =
fixtoi(- rot_matrix[0] *
Wdt - rot_matrix[1] *
Hgt);
114 new_hgt =
fixtoi(- rot_matrix[1] *
Wdt - rot_matrix[0] *
Hgt);
128 for (int32_t i = 0; i < 4; ++i)
137 static inline int32_t ScaledByCon(int32_t value, int32_t con)
144 x = ScaledByCon(
x, iCon);
145 y = ScaledByCon(
y, iCon);
146 Wdt = ScaledByCon(
Wdt, iCon);
147 Hgt = ScaledByCon(
Hgt, iCon);
150 for (int32_t i = 0; i <
VtxNum; i++)
152 VtxX[i] = ScaledByCon(
VtxX[i], iCon);
153 VtxY[i] = ScaledByCon(
VtxY[i], iCon);
160 y = ScaledByCon(
y, iCon);
161 Hgt = ScaledByCon(
Hgt, iCon);
164 for (int32_t i = 0; i <
VtxNum; i++)
166 VtxY[i] = ScaledByCon(
VtxY[i], iCon);
177 for (int32_t i = 0; i <
VtxNum; i++)
180 if (
VtxX[i] < rRect.
x)
186 else if (
VtxX[i] > rRect.
x + rRect.
Wdt)
191 if (
VtxY[i] < rRect.
y)
197 else if (
VtxY[i] > rRect.
y + rRect.
Hgt)
203 rRect.
Hgt += rRect.
y -
y;
207 inline bool C4Shape::CheckTouchableMaterial(int32_t x, int32_t y, int32_t vtx_i, int32_t ydir,
const C4DensityProvider &rDensityProvider)
241 bool increase_distance =
true;
242 bool any_contact =
false;
249 for (
int i = 0; i <
VtxNum; ++i)
254 int32_t ax = testx +
VtxX[i];
255 int32_t ay = testy +
VtxY[i];
256 if (CheckTouchableMaterial(ax, ay, i))
262 if (CheckTouchableMaterial(ax + xcd, ay + ycd, i, ycd))
283 testx = cx - (testx - cx);
284 testy = cy - (testy - cy);
285 if (increase_distance)
290 increase_distance = !increase_distance;
304 if ((
VtxX[cvtx] == tx) && (
VtxY[cvtx] == ty))
325 for (
int irange = 4; irange <= 12; irange += 4)
327 for (cix = ix - irange / 2; cix <= ix + irange; cix += irange)
329 for (ciy = iy - irange / 2; ciy <= iy + irange; ciy += irange)
382 if (!Inside<int32_t>(index_position, 0,
VtxNum))
387 for (int32_t i =
VtxNum; i > index_position; i--)
392 VtxX[index_position] = tx;
393 VtxY[index_position] = ty;
400 if (!Inside<int32_t>(index_position, 0,
VtxNum - 1))
404 for (int32_t i = index_position; i + 1 <
VtxNum; i++)
418 for (int32_t i = 0; i <
VtxNum; i++)
422 if (CheckTouchableMaterial(at_x +
VtxX[i], at_y +
VtxY[i], i))
442 for (int32_t vertex = 0; vertex <
VtxNum; vertex++)
448 int32_t
x = at_x +
VtxX[vertex];
449 int32_t
y = at_y +
VtxY[vertex];
452 if (CheckTouchableMaterial(
x,
y, vertex, collide_halfvehic? 1:0))
464 if (border_hack_contacts)
466 if (
x == 0 && CheckTouchableMaterial(
x - 1,
y, vertex))
484 for (int32_t i = 0; i <
VtxNum; i++)
493 if (CheckTouchableMaterial(
x +
VtxX[i],
y +
VtxY[i] + 1, i))
501 if (CheckTouchableMaterial(
x +
VtxX[i] - 1,
y +
VtxY[i], i))
505 if (CheckTouchableMaterial(
x +
VtxX[i] + 1,
y +
VtxY[i], i))
516 if (!Inside<int32_t>(iVertex, 0,
VtxNum - 1))
520 return VtxX[iVertex];
525 if (!Inside<int32_t>(iVertex, 0,
VtxNum - 1))
529 return VtxY[iVertex];
541 C4Shape &vertices_from = (copy_vertices_from_self ? *this : source);
552 *((
C4Rect *)
this) = source;
562 for (int32_t i = 0; i <
VtxNum; i++)
566 if (iMax == -1 ||
VtxY[i] <
VtxY[iMax])
578 for (int32_t i = 0; i <
VtxNum; i++)
605 int32_t contact_bits = 0;
608 if (!Inside<int32_t>(iVertex, 0,
VtxNum - 1))
616 dwCheckMask =
VtxCNAT[iVertex];
627 if (dwCheckMask &
CNAT_Center)
if (CheckTouchableMaterial(tx, ty , iVertex, 0, rDensityProvider)) contact_bits |=
CNAT_Center;
628 if (dwCheckMask &
CNAT_Left)
if (CheckTouchableMaterial(tx-1, ty, iVertex, 0, rDensityProvider)) contact_bits |=
CNAT_Left;
629 if (dwCheckMask &
CNAT_Right)
if (CheckTouchableMaterial(tx+1, ty, iVertex, 0, rDensityProvider)) contact_bits |=
CNAT_Right;
630 if (dwCheckMask &
CNAT_Top)
if (CheckTouchableMaterial(tx, ty-1, iVertex, 0, rDensityProvider)) contact_bits |=
CNAT_Top;
631 if (dwCheckMask &
CNAT_Bottom)
if (CheckTouchableMaterial(tx, ty+1, iVertex, 1, rDensityProvider)) contact_bits |=
CNAT_Bottom;
668 bool fRuntime = !!default_shape;
672 default_shape = &default_def_shape;
const BYTE CNAT_NoCollision
const BYTE CNAT_PhaseHalfVehicle
const BYTE CNAT_MultiAttach
bool PathFree(int32_t x1, int32_t y1, int32_t x2, int32_t y2)
bool PathFreeIgnoreVehicle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t *ix, int32_t *iy)
int32_t GBackMat(int32_t x, int32_t y)
int32_t GBackDensity(int32_t x, int32_t y)
bool IsMCHalfVehicle(BYTE mat)
C4Real Cos(const C4Real &fAngle)
int fixtoi(const C4Fixed &x)
C4Real Sin(const C4Real &fAngle)
void AddDbgRec(C4RecordChunkType eType, const void *pData, int iSize)
C4DensityProvider DefaultDensityProvider
std::enable_if< std::is_nothrow_default_constructible< T >::value >::type InplaceReconstruct(T *obj)
StdArrayDefaultArrayAdapt< T, D > mkArrayAdaptDMA(T(&array)[size], const D &rDefault)
StdArrayDefaultArrayAdapt< T, D, M > mkArrayAdaptDMAM(T(&array)[size], const D &rDefault, const M &map)
StdArrayDefaultArrayAdapt< T, D > mkArrayAdaptDefArr(T *pArray, size_t iSize, const D &rDefault)
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
virtual int32_t GetDensity(int32_t x, int32_t y) const
BYTE GetPix(int32_t x, int32_t y) const
bool AddVertex(int32_t iX, int32_t iY)
bool InsertVertex(int32_t iPos, int32_t tx, int32_t ty)
int32_t GetVertexY(int32_t iVertex)
void Stretch(int32_t iCon, bool bUpdateVertices)
int32_t VtxContactMat[C4D_MaxVertex]
bool CheckContact(int32_t cx, int32_t cy)
int32_t GetVertexX(int32_t iVertex)
void Jolt(int32_t iCon, bool bUpdateVertices)
void CopyFrom(C4Shape rFrom, bool bCpyVertices, bool fCopyVerticesFromSelf)
void CreateOwnOriginalCopy(C4Shape &rFrom)
bool ContactCheck(int32_t cx, int32_t cy, uint32_t *border_hack_contacts=nullptr, bool collide_halfvehic=false)
int32_t VtxCNAT[C4D_MaxVertex]
void GetVertexOutline(C4Rect &rRect)
int32_t VtxContactCNAT[C4D_MaxVertex]
int32_t VtxFriction[C4D_MaxVertex]
bool RemoveVertex(int32_t iPos)
void Rotate(C4Real Angle, bool bUpdateVertices)
bool CheckScaleToWalk(int x, int y)
int32_t GetVertexContact(int32_t iVtx, DWORD dwCheckMask, int32_t tx, int32_t ty, const C4DensityProvider &rDensityProvider=DefaultDensityProvider)
int32_t VtxY[C4D_MaxVertex]
void CompileFunc(StdCompiler *pComp, const C4Shape *default_shape)
bool Attach(int32_t &cx, int32_t &cy, BYTE cnat_pos)
int32_t VtxX[C4D_MaxVertex]
int32_t GetBottomVertex()
bool LineConnect(int32_t tx, int32_t ty, int32_t cvtx, int32_t ld, int32_t oldx, int32_t oldy)
void Value(const T &rStruct)