From 1b67a09bb90ab7ab9fe0cf88e444943d37eeaeff Mon Sep 17 00:00:00 2001
From: D-AIRY <admin@ds-servers.com>
Date: Sun, 22 Dec 2024 00:45:23 +0300
Subject: [PATCH] make XPET_POINTCOORD relative

---
 build/demos/levels/demo_ladder/demo_ladder.ent |  6 +++---
 source/game/FuncLadder.cpp                     | 17 ++++++-----------
 source/game/FuncLadder.h                       |  3 +--
 source/terrax/mainWindow.cpp                   |  5 +++--
 4 files changed, 13 insertions(+), 18 deletions(-)

diff --git a/build/demos/levels/demo_ladder/demo_ladder.ent b/build/demos/levels/demo_ladder/demo_ladder.ent
index 25b90276a..f762571a8 100644
--- a/build/demos/levels/demo_ladder/demo_ladder.ent
+++ b/build/demos/levels/demo_ladder/demo_ladder.ent
@@ -68,7 +68,7 @@ name =
 model = 
 is_static = 1
 glow_color_ref = 
-glow_color = 0.000000 0.000000 0.000000
+glow_color = 0.000000 0.273974 0.827866
 flags = 0
 classname = prop_static
 auto_physbox = 1
@@ -130,10 +130,10 @@ OnTurnOn =
 OnTurnOff = 
 
 [{F7FAD41B-4168-41D2-9E82-51DA455F22B6}]
-up_point = 12.860000 5.000000 10.004517
+up_point = 0.000000 4.000000 0.000001
 rotation = 0.000000 0.000000 0.000000 1.000000
 parent = 
-origin = 12.858377 1.000000 10.004519
+origin = 12.849999 1.000000 9.999999
 name = 
 flags = 0
 classname = func_ladder
diff --git a/source/game/FuncLadder.cpp b/source/game/FuncLadder.cpp
index d8e859d99..e6dd9e1ba 100644
--- a/source/game/FuncLadder.cpp
+++ b/source/game/FuncLadder.cpp
@@ -52,7 +52,6 @@ CFuncLadder::~CFuncLadder()
 
 void CFuncLadder::setUpPoint(const float3 &vUp)
 {
-	m_isUpSet = true;
 	m_vUpPoint = vUp;
 
 	initPhysics();
@@ -82,11 +81,7 @@ void CFuncLadder::createPhysBody()
 void CFuncLadder::setPos(const float3 &pos)
 {
 	BaseClass::setPos(pos);
-	if(!m_isUpSet)
-	{
-		m_vUpPoint = (float3)(pos + float3(0.0f, 2.0f, 0.0f));
-		initPhysics();
-	}
+	initPhysics();
 	SAFE_CALL(m_pGhostObject, setPosition, pos);
 }
 
@@ -131,7 +126,7 @@ void CFuncLadder::initPhysics()
 	//TODO: сделать обработку ситуации когда m_vUpPoint ниже getPos
 	mem_release(m_pCollideShape);
 
-	float3 vDelta = m_vUpPoint - getPos();
+	float3 vDelta = getOrient() * m_vUpPoint;
 	SMAABB aabb = getBound();
 	float3 vMinDelta, vMaxDelta;
 
@@ -201,16 +196,16 @@ void CFuncLadder::renderEditor(bool is3D, bool bRenderSelection, IXGizmoRenderer
 
 		SMAABB aabb = getBound();
 		pRenderer->drawAABB(aabb + getPos());
-		pRenderer->drawAABB(aabb + m_vUpPoint);
+		pRenderer->drawAABB(aabb + getUpPos());
 		pRenderer->jumpTo(getPos());
-		pRenderer->lineTo(m_vUpPoint);
+		pRenderer->lineTo(getUpPos());
 	}
 }
 
 void CFuncLadder::getMinMax(float3 *min, float3 *max)
 {
 	SMAABB aabb = getBound();
-	aabb = SMAABBConvex(aabb, aabb + (getUpPos() - getPos()));
+	aabb = SMAABBConvex(aabb, aabb + getUpPos() - getPos());
 
 	if(min)
 	{
@@ -367,7 +362,7 @@ void CFuncLadder::onUse(CBaseEntity *pUser)
 
 float3 CFuncLadder::getUpPos()
 {
-	return(m_vUpPoint);
+	return(getOrient() * m_vUpPoint + getPos());
 }
 
 void CFuncLadder::connectToLadder(CBaseEntity *pEntity)
diff --git a/source/game/FuncLadder.h b/source/game/FuncLadder.h
index 520bae843..5ea6f958b 100644
--- a/source/game/FuncLadder.h
+++ b/source/game/FuncLadder.h
@@ -67,8 +67,7 @@ private:
 	SMAABB getBound();
 
 private:
-	float3_t m_vUpPoint;
-	bool m_isUpSet = false;
+	float3_t m_vUpPoint = float3_t(0.0f, 2.0f, 0.0f);
 	bool m_isEnabled = false;
 
 	output_t m_onPlayerGetOn;
diff --git a/source/terrax/mainWindow.cpp b/source/terrax/mainWindow.cpp
index 6996e46fb..2b9b8270d 100644
--- a/source/terrax/mainWindow.cpp
+++ b/source/terrax/mainWindow.cpp
@@ -4532,15 +4532,16 @@ XDECLARE_PROP_GIZMO(Radius, void XMETHODCALLTYPE onChange(float fNewRadius, IXEd
 XDECLARE_PROP_GIZMO(Handle, void XMETHODCALLTYPE moveTo(const float3 &vNewPos, IXEditorGizmoHandle *pGizmo) override
 {
 	pGizmo->setPos(vNewPos);
+	float3_t vTmp = m_pObj->getOrient().Conjugate() * (vNewPos - m_pObj->getPos());
 	char tmp[64];
-	sprintf(tmp, "%f %f %f", vNewPos.x, vNewPos.y, vNewPos.z);
+	sprintf(tmp, "%f %f %f", vTmp.x, vTmp.y, vTmp.z);
 	m_pCommand->setKV(m_field.szKey, tmp);
 }, void init()
 {
 	float3_t vec;
 	if(sscanf(m_pObj->getKV(m_field.szKey), "%f %f %f", &vec.x, &vec.y, &vec.z))
 	{
-		m_pGizmo->setPos(vec);
+		m_pGizmo->setPos(m_pObj->getOrient() * vec + m_pObj->getPos());
 	}
 });
 
-- 
GitLab