Skip to content

Commit 8d38eb8

Browse files
committed
-
1 parent 0b99b25 commit 8d38eb8

8 files changed

Lines changed: 76 additions & 16 deletions

File tree

src/GameCamera.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,21 @@ bool GameCamera::CastRayFromScreenPoint(const glm::ivec2& screenCoordinate, cxx:
140140
return true;
141141
}
142142

143+
bool GameCamera::ProjectPointToScreen(const glm::vec3& point, glm::vec2& resultScreenPoint)
144+
{
145+
const glm::ivec4 viewport {
146+
mViewportRect.x,
147+
mViewportRect.y,
148+
mViewportRect.w,
149+
mViewportRect.h };
150+
glm::vec3 screenCoordinate = glm::project(point, mViewMatrix, mProjectionMatrix, viewport);
151+
152+
resultScreenPoint.x = (screenCoordinate.x);
153+
resultScreenPoint.y = (mViewportRect.h - 1.0f - screenCoordinate.y);
154+
155+
return true;
156+
}
157+
143158
void GameCamera::SetTopDownOrientation()
144159
{
145160
mFrontDirection = -SceneAxisY;

src/GameCamera.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ class GameCamera final
8989
// @param resultRay: Output ray info
9090
bool CastRayFromScreenPoint(const glm::ivec2& screenCoordinate, cxx::ray3d_t& resultRay);
9191

92+
// Transform world space point to screen space point, make sure to ComputeMatricesAndFrustum
93+
bool ProjectPointToScreen(const glm::vec3& point, glm::vec2& resultScreenPoint);
94+
9295
// Will swap Z and Y direction vectors
9396
void SetTopDownOrientation();
9497

src/GameDefs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ enum eSpriteDrawOrder: unsigned char
139139
eSpriteDrawOrder_CarPassenger,
140140
eSpriteDrawOrder_Car,
141141
eSpriteDrawOrder_ConvetibleCarPassenger,
142+
eSpriteDrawOrder_CarRoof,
142143
eSpriteDrawOrder_JumpingPedestrian,
143144
eSpriteDrawOrder_Trees,
144145
eSpriteDrawOrder_Projectiles,
@@ -157,6 +158,7 @@ decl_enum_strings(eSpriteDrawOrder);
157158
enum
158159
{
159160
// hud
161+
eSpriteID_Arrow_Pointer = 24,
160162
eSpriteID_Arrow_AreaDisplayLeft = 25,
161163
eSpriteID_Arrow_AreaDisplayRight = 26,
162164
eSpriteID_Arrow_VehicleDisplay = 27,

src/HUD.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,11 @@ void HUD::DrawFrame(GuiContext& guiContext)
523523
currentPanel->DrawFrame(guiContext);
524524
}
525525
}
526+
527+
if (CheckCharacterObscure())
528+
{
529+
DrawArrowAboveCharacter(guiContext);
530+
}
526531
}
527532

528533
void HUD::PushPagerMessage()
@@ -734,4 +739,45 @@ void HUD::TickAutoHidePanels()
734739

735740
++panels_iterator;
736741
}
737-
}
742+
}
743+
744+
bool HUD::CheckCharacterObscure() const
745+
{
746+
Pedestrian* pedestrian = mHumanPlayer->mCharacter;
747+
debug_assert(pedestrian);
748+
749+
const glm::vec3& worldPosition = pedestrian->mTransformSmooth.mPosition;
750+
// convert to map position
751+
glm::ivec3 mapPosition = Convert::MetersToMapUnits(worldPosition);
752+
for (int currentBlockLayer = mapPosition.y + 1; currentBlockLayer < MAP_LAYERS_COUNT; ++currentBlockLayer)
753+
{
754+
const MapBlockInfo* currBlock = gGameMap.GetBlockInfo(mapPosition.x, mapPosition.z, currentBlockLayer);
755+
if (currBlock->mFaces[eBlockFace_Lid] > 0)
756+
{
757+
int bp = 0;
758+
return true;
759+
}
760+
}
761+
return false;
762+
}
763+
764+
void HUD::DrawArrowAboveCharacter(GuiContext& guiContext)
765+
{
766+
Pedestrian* pedestrian = mHumanPlayer->mCharacter;
767+
debug_assert(pedestrian);
768+
769+
// setup arrow sprite
770+
Sprite2D arrowSprite;
771+
gSpriteManager.GetSpriteTexture(GAMEOBJECT_ID_NULL, eSpriteID_Arrow_Pointer, 0, arrowSprite);
772+
773+
arrowSprite.mScale = HUD_SPRITE_SCALE;
774+
arrowSprite.mDrawOrder = eSpriteDrawOrder_HUD_Arrow;
775+
// set rotation
776+
arrowSprite.mRotateAngle = pedestrian->mTransformSmooth.mOrientation + cxx::angle_t::from_degrees(SPRITE_ZERO_ANGLE);
777+
778+
// convert character position to screen position
779+
GameCamera& gameCamera = mHumanPlayer->mPlayerView.mCamera;
780+
gameCamera.ProjectPointToScreen(pedestrian->mTransformSmooth.mPosition, arrowSprite.mPosition);
781+
782+
guiContext.mSpriteBatch.DrawSprite(arrowSprite);
783+
}

src/HUD.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,15 @@ class HUD final: public cxx::noncopyable
205205
void ArrangePanelsHorz(const Rect& bounds, eHUDPanelAlign panelsAlign, int spacing, const std::initializer_list<HUDPanel*>& panels);
206206
void ArrangePanelsVert(const Rect& bounds, eHUDPanelAlign panelsAlign, int spacing, const std::initializer_list<HUDPanel*>& panels);
207207

208+
void DrawArrowAboveCharacter(GuiContext& guiContext);
209+
208210
// Manager auto-hide panels
209211
void ShowAutoHidePanel(HUDPanel* panel, float showDuration);
210212
void TickAutoHidePanels();
211213

214+
// Test whether character is hidden by solid geometry
215+
bool CheckCharacterObscure() const;
216+
212217
private:
213218
HumanPlayer* mHumanPlayer = nullptr;
214219

src/Vehicle.cpp

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -799,13 +799,12 @@ void Vehicle::SetBurnEffectActive(bool activate)
799799
{
800800
debug_assert(mFireEffect == nullptr);
801801
GameObjectInfo& objectInfo = gGameMap.mStyleData.mObjects[GameObjectType_Fire1];
802-
mFireEffect = gGameObjectsManager.CreateDecoration(
803-
mPhysicsBody->GetPosition(),
804-
mPhysicsBody->GetOrientation(), &objectInfo);
802+
mFireEffect = gGameObjectsManager.CreateDecoration(mTransform.mPosition, mTransform.mOrientation, &objectInfo);
805803
debug_assert(mFireEffect);
806804
if (mFireEffect)
807805
{
808806
mFireEffect->SetLifeDuration(0);
807+
mFireEffect->SetDrawOrder(eSpriteDrawOrder_CarRoof);
809808
AttachObject(mFireEffect);
810809
}
811810
mBurnStartTime = gTimeManager.mGameTime;
@@ -969,22 +968,12 @@ float Vehicle::GetCurrentSpeed() const
969968
return 0.0f;
970969
}
971970

972-
void Vehicle::SetDrawOrder(eSpriteDrawOrder drawOrder)
973-
{
974-
if (mFireEffect)
975-
{
976-
mFireEffect->SetDrawOrder(drawOrder);
977-
}
978-
979-
mDrawSprite.mDrawOrder = drawOrder;
980-
}
981971

982972
void Vehicle::SetupCarSprite()
983973
{
984974
int remapClut = mRemapIndex == NO_REMAP ? 0 : (mCarInfo->mRemapsBaseIndex + mRemapIndex);
985975
gSpriteManager.GetSpriteTexture(mObjectID, mSpriteIndex, remapClut, GetSpriteDeltas(), mDrawSprite);
986-
987-
SetDrawOrder(eSpriteDrawOrder_Car);
976+
mDrawSprite.mDrawOrder = eSpriteDrawOrder_Car;
988977
RefreshDrawSprite();
989978
}
990979

src/Vehicle.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ class Vehicle final: public GameObject, public SpriteAnimListener
128128
void UpdateDamageFromRailways();
129129

130130
void SetupCarSprite();
131-
void SetDrawOrder(eSpriteDrawOrder drawOrder);
132131

133132
SpriteDeltaBits GetSpriteDeltas() const;
134133

src/enums_impl.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,7 @@ impl_enum_strings(eSpriteDrawOrder)
609609
{eSpriteDrawOrder_CarPassenger, "carPassenger"},
610610
{eSpriteDrawOrder_Car, "car"},
611611
{eSpriteDrawOrder_ConvetibleCarPassenger, "convertibleCarPassenger"},
612+
{eSpriteDrawOrder_CarRoof, "carRoof"},
612613
{eSpriteDrawOrder_JumpingPedestrian, "jumpingPedestrian"},
613614
{eSpriteDrawOrder_Trees, "trees"},
614615
{eSpriteDrawOrder_Projectiles, "projectiles"},

0 commit comments

Comments
 (0)