implemented CTrafficLights
This commit is contained in:
@ -5,8 +5,13 @@
|
||||
#include "Camera.h"
|
||||
#include "Vehicle.h"
|
||||
#include "World.h"
|
||||
#include "Lines.h" // for debug
|
||||
#include "PathFind.h"
|
||||
|
||||
bool gbShowPedPaths;
|
||||
bool gbShowCarPaths;
|
||||
bool gbShowCarPathsLinks;
|
||||
|
||||
CPathFind &ThePaths = *(CPathFind*)0x8F6754;
|
||||
|
||||
WRAPPER bool CPedPath::CalcPedRoute(uint8, CVector, CVector, CVector*, int16*, int16) { EAXJMP(0x42E680); }
|
||||
@ -466,20 +471,20 @@ CPathFind::PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoFor
|
||||
// IMPROVE: use a goto here
|
||||
// Find existing car path link
|
||||
for(k = 0; k < m_numCarPathLinks; k++){
|
||||
if(m_carPathLinks[k].dirX == tempnodes[j].dirX &&
|
||||
m_carPathLinks[k].dirY == tempnodes[j].dirY &&
|
||||
m_carPathLinks[k].posX == tempnodes[j].pos.x &&
|
||||
m_carPathLinks[k].posY == tempnodes[j].pos.y){
|
||||
if(m_carPathLinks[k].dir.x == tempnodes[j].dirX &&
|
||||
m_carPathLinks[k].dir.y == tempnodes[j].dirY &&
|
||||
m_carPathLinks[k].pos.x == tempnodes[j].pos.x &&
|
||||
m_carPathLinks[k].pos.y == tempnodes[j].pos.y){
|
||||
m_carPathConnections[m_numConnections] = k;
|
||||
k = m_numCarPathLinks;
|
||||
}
|
||||
}
|
||||
// k is m_numCarPathLinks+1 if we found one
|
||||
if(k == m_numCarPathLinks){
|
||||
m_carPathLinks[m_numCarPathLinks].dirX = tempnodes[j].dirX;
|
||||
m_carPathLinks[m_numCarPathLinks].dirY = tempnodes[j].dirY;
|
||||
m_carPathLinks[m_numCarPathLinks].posX = tempnodes[j].pos.x;
|
||||
m_carPathLinks[m_numCarPathLinks].posY = tempnodes[j].pos.y;
|
||||
m_carPathLinks[m_numCarPathLinks].dir.x = tempnodes[j].dirX;
|
||||
m_carPathLinks[m_numCarPathLinks].dir.y = tempnodes[j].dirY;
|
||||
m_carPathLinks[m_numCarPathLinks].pos.x = tempnodes[j].pos.x;
|
||||
m_carPathLinks[m_numCarPathLinks].pos.y = tempnodes[j].pos.y;
|
||||
m_carPathLinks[m_numCarPathLinks].pathNodeIndex = i;
|
||||
m_carPathLinks[m_numCarPathLinks].numLeftLanes = tempnodes[j].numLeftLanes;
|
||||
m_carPathLinks[m_numCarPathLinks].numRightLanes = tempnodes[j].numRightLanes;
|
||||
@ -529,20 +534,20 @@ CPathFind::PreparePathDataForType(uint8 type, CTempNode *tempnodes, CPathInfoFor
|
||||
// IMPROVE: use a goto here
|
||||
// Find existing car path link
|
||||
for(k = 0; k < m_numCarPathLinks; k++){
|
||||
if(m_carPathLinks[k].dirX == dx &&
|
||||
m_carPathLinks[k].dirY == dy &&
|
||||
m_carPathLinks[k].posX == posx &&
|
||||
m_carPathLinks[k].posY == posy){
|
||||
if(m_carPathLinks[k].dir.x == dx &&
|
||||
m_carPathLinks[k].dir.y == dy &&
|
||||
m_carPathLinks[k].pos.x == posx &&
|
||||
m_carPathLinks[k].pos.y == posy){
|
||||
m_carPathConnections[m_numConnections] = k;
|
||||
k = m_numCarPathLinks;
|
||||
}
|
||||
}
|
||||
// k is m_numCarPathLinks+1 if we found one
|
||||
if(k == m_numCarPathLinks){
|
||||
m_carPathLinks[m_numCarPathLinks].dirX = dx;
|
||||
m_carPathLinks[m_numCarPathLinks].dirY = dy;
|
||||
m_carPathLinks[m_numCarPathLinks].posX = posx;
|
||||
m_carPathLinks[m_numCarPathLinks].posY = posy;
|
||||
m_carPathLinks[m_numCarPathLinks].dir.x = dx;
|
||||
m_carPathLinks[m_numCarPathLinks].dir.y = dy;
|
||||
m_carPathLinks[m_numCarPathLinks].pos.x = posx;
|
||||
m_carPathLinks[m_numCarPathLinks].pos.y = posy;
|
||||
m_carPathLinks[m_numCarPathLinks].pathNodeIndex = i;
|
||||
m_carPathLinks[m_numCarPathLinks].numLeftLanes = -1;
|
||||
m_carPathLinks[m_numCarPathLinks].numRightLanes = -1;
|
||||
@ -760,8 +765,8 @@ CPathFind::SetLinksBridgeLights(float x1, float x2, float y1, float y2, bool ena
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < m_numCarPathLinks; i++)
|
||||
if(x1 < m_carPathLinks[i].posX && m_carPathLinks[i].posX < x2 &&
|
||||
y1 < m_carPathLinks[i].posY && m_carPathLinks[i].posY < y2)
|
||||
if(x1 < m_carPathLinks[i].pos.x && m_carPathLinks[i].pos.x < x2 &&
|
||||
y1 < m_carPathLinks[i].pos.y && m_carPathLinks[i].pos.y < y2)
|
||||
m_carPathLinks[i].bBridgeLights = enable;
|
||||
}
|
||||
|
||||
@ -1444,6 +1449,132 @@ CPathFind::Load(uint8 *buf, uint32 size)
|
||||
m_pathNodes[i].bBetweenLevels = false;
|
||||
}
|
||||
|
||||
void
|
||||
CPathFind::DisplayPathData(void)
|
||||
{
|
||||
// Not the function from mobm_carPathLinksile but my own!
|
||||
|
||||
int i, j, k;
|
||||
// Draw 50 units around camera
|
||||
CVector pos = TheCamera.GetPosition();
|
||||
const float maxDist = 50.0f;
|
||||
|
||||
// Render car path nodes
|
||||
if(gbShowCarPaths)
|
||||
for(i = 0; i < m_numCarPathNodes; i++){
|
||||
if((m_pathNodes[i].pos - pos).MagnitudeSqr() > SQR(maxDist))
|
||||
continue;
|
||||
|
||||
CVector n1 = m_pathNodes[i].pos;
|
||||
n1.z += 0.3f;
|
||||
|
||||
// Draw node itself
|
||||
CLines::RenderLineWithClipping(n1.x, n1.y, n1.z,
|
||||
n1.x, n1.y, n1.z + 1.0f,
|
||||
0xFFFFFFFF, 0xFFFFFFFF);
|
||||
|
||||
for(j = 0; j < m_pathNodes[i].numLinks; j++){
|
||||
k = m_connections[m_pathNodes[i].firstLink + j];
|
||||
CVector n2 = m_pathNodes[k].pos;
|
||||
n2.z += 0.3f;
|
||||
// Draw links to neighbours
|
||||
CLines::RenderLineWithClipping(n1.x, n1.y, n1.z,
|
||||
n2.x, n2.y, n2.z,
|
||||
0xFFFFFFFF, 0xFFFFFFFF);
|
||||
}
|
||||
}
|
||||
|
||||
// Render car path nodes
|
||||
if(gbShowCarPathsLinks)
|
||||
for(i = 0; i < m_numCarPathLinks; i++){
|
||||
CVector2D n1_2d = m_carPathLinks[i].pos;
|
||||
if((n1_2d - pos).MagnitudeSqr() > SQR(maxDist))
|
||||
continue;
|
||||
|
||||
int ni = m_carPathLinks[i].pathNodeIndex;
|
||||
CVector pn1 = m_pathNodes[ni].pos;
|
||||
pn1.z += 0.3f;
|
||||
CVector n1(n1_2d.x, n1_2d.y, pn1.z);
|
||||
n1.z += 0.3f;
|
||||
|
||||
// Draw car node itself
|
||||
CLines::RenderLineWithClipping(n1.x, n1.y, n1.z,
|
||||
n1.x, n1.y, n1.z + 1.0f,
|
||||
0xFFFFFFFF, 0xFFFFFFFF);
|
||||
CLines::RenderLineWithClipping(n1.x, n1.y, n1.z + 0.5f,
|
||||
n1.x+m_carPathLinks[i].dir.x, n1.y+m_carPathLinks[i].dir.y, n1.z + 0.5f,
|
||||
0xFFFFFFFF, 0xFFFFFFFF);
|
||||
|
||||
// Draw connection to car path node
|
||||
CLines::RenderLineWithClipping(n1.x, n1.y, n1.z,
|
||||
pn1.x, pn1.y, pn1.z,
|
||||
0xFF0000FF, 0xFFFFFFFF);
|
||||
|
||||
// traffic light type
|
||||
uint32 col = 0xFF;
|
||||
if((m_carPathLinks[i].trafficLightType&0x7F) == 1)
|
||||
col += 0xFF000000;
|
||||
if((m_carPathLinks[i].trafficLightType&0x7F) == 2)
|
||||
col += 0x00FF0000;
|
||||
if(m_carPathLinks[i].trafficLightType & 0x80)
|
||||
col += 0x0000FF00;
|
||||
CLines::RenderLineWithClipping(n1.x+0.2f, n1.y, n1.z,
|
||||
n1.x+0.2f, n1.y, n1.z + 1.0f,
|
||||
col, col);
|
||||
|
||||
for(j = 0; j < m_pathNodes[ni].numLinks; j++){
|
||||
k = m_carPathConnections[m_pathNodes[ni].firstLink + j];
|
||||
CVector2D n2_2d = m_carPathLinks[k].pos;
|
||||
int nk = m_carPathLinks[k].pathNodeIndex;
|
||||
CVector pn2 = m_pathNodes[nk].pos;
|
||||
pn2.z += 0.3f;
|
||||
CVector n2(n2_2d.x, n2_2d.y, pn2.z);
|
||||
n2.z += 0.3f;
|
||||
|
||||
// Draw links to neighbours
|
||||
CLines::RenderLineWithClipping(n1.x, n1.y, n1.z,
|
||||
n2.x, n2.y, n2.z,
|
||||
0xFF00FFFF, 0xFF00FFFF);
|
||||
}
|
||||
}
|
||||
|
||||
// Render ped path nodes
|
||||
if(gbShowPedPaths)
|
||||
for(i = m_numCarPathNodes; i < m_numPathNodes; i++){
|
||||
if((m_pathNodes[i].pos - pos).MagnitudeSqr() > SQR(maxDist))
|
||||
continue;
|
||||
|
||||
CVector n1 = m_pathNodes[i].pos;
|
||||
n1.z += 0.3f;
|
||||
|
||||
// Draw node itself
|
||||
CLines::RenderLineWithClipping(n1.x, n1.y, n1.z,
|
||||
n1.x, n1.y, n1.z + 1.0f,
|
||||
0xFFFFFFFF, 0xFFFFFFFF);
|
||||
|
||||
for(j = 0; j < m_pathNodes[i].numLinks; j++){
|
||||
k = m_connections[m_pathNodes[i].firstLink + j];
|
||||
CVector n2 = m_pathNodes[k].pos;
|
||||
n2.z += 0.3f;
|
||||
// Draw links to neighbours
|
||||
CLines::RenderLineWithClipping(n1.x, n1.y, n1.z,
|
||||
n2.x, n2.y, n2.z,
|
||||
0xFFFFFFFF, 0xFFFFFFFF);
|
||||
|
||||
// Draw connection flags
|
||||
CVector mid = (n1+n2)/2.0f;
|
||||
uint32 col = 0xFF;
|
||||
if(m_connectionFlags[m_pathNodes[i].firstLink + j].bCrossesRoad)
|
||||
col += 0x00FF0000;
|
||||
if(m_connectionFlags[m_pathNodes[i].firstLink + j].bTrafficLight)
|
||||
col += 0xFF000000;
|
||||
CLines::RenderLineWithClipping(mid.x, mid.y, mid.z,
|
||||
mid.x, mid.y, mid.z + 1.0f,
|
||||
col, col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
STARTPATCHES
|
||||
InjectHook(0x4294A0, &CPathFind::Init, PATCH_JUMP);
|
||||
InjectHook(0x42D580, &CPathFind::AllocatePathFindInfoMem, PATCH_JUMP);
|
||||
|
Reference in New Issue
Block a user