[Scummvm-git-logs] scummvm master -> f67f8b678e90bc453a44e6c4531e99f1d2d8080a
aquadran
noreply at scummvm.org
Fri Oct 11 20:52:47 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
f67f8b678e WINTERMUTE: sync angle code with original
Commit: f67f8b678e90bc453a44e6c4531e99f1d2d8080a
https://github.com/scummvm/scummvm/commit/f67f8b678e90bc453a44e6c4531e99f1d2d8080a
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2024-10-11T22:52:42+02:00
Commit Message:
WINTERMUTE: sync angle code with original
Changed paths:
engines/wintermute/ad/ad_actor_3dx.cpp
engines/wintermute/ad/ad_actor_3dx.h
engines/wintermute/ad/ad_scene_geometry.cpp
engines/wintermute/base/base_object.cpp
engines/wintermute/base/base_object.h
engines/wintermute/base/base_persistence_manager.cpp
engines/wintermute/base/base_persistence_manager.h
engines/wintermute/base/gfx/3dcamera.cpp
engines/wintermute/base/gfx/base_renderer3d.cpp
engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
engines/wintermute/math/math_util.h
diff --git a/engines/wintermute/ad/ad_actor_3dx.cpp b/engines/wintermute/ad/ad_actor_3dx.cpp
index 45000826419..01a6c4765a2 100644
--- a/engines/wintermute/ad/ad_actor_3dx.cpp
+++ b/engines/wintermute/ad/ad_actor_3dx.cpp
@@ -48,11 +48,13 @@
#include "engines/wintermute/base/gfx/3dshadow_volume.h"
#include "engines/wintermute/base/gfx/opengl/base_render_opengl3d.h"
#include "engines/wintermute/base/gfx/xmodel.h"
+#include "engines/wintermute/base/gfx/xmath.h"
#include "engines/wintermute/base/particles/part_emitter.h"
#include "engines/wintermute/base/scriptables/script.h"
#include "engines/wintermute/base/scriptables/script_stack.h"
#include "engines/wintermute/base/scriptables/script_value.h"
#include "engines/wintermute/base/sound/base_sound.h"
+#include "engines/wintermute/math/math_util.h"
#include "engines/wintermute/utils/path_util.h"
#include "engines/wintermute/utils/utils.h"
@@ -173,13 +175,13 @@ bool AdActor3DX::update() {
if (_directTurnMode == DIRECT_TURN_CW) {
// we have a right handed coordinate system now, so we subtract
_angle -= turnVel * (float)_gameRef->_deltaTime / 1000.f;
- _angle.normalize(0.0f);
+ _angle = BaseUtils::normalizeAngle(_angle);
}
if (_directTurnMode == DIRECT_TURN_CCW) {
// we have a right handed coordinate system now, so we add
_angle += turnVel * (float)_gameRef->_deltaTime / 1000.f;
- _angle.normalize(0.0f);
+ _angle = BaseUtils::normalizeAngle(_angle);
}
float walkVel = _directWalkVelocity == 0.0f ? _velocity : _directWalkVelocity;
@@ -187,14 +189,14 @@ bool AdActor3DX::update() {
if (_directWalkMode == DIRECT_WALK_FW) {
// we add the direction vector since in a right handed coordinate system
// angles turn counter-clockwise (wme uses a left handed coordinate system, so there it's a subtraction)
- newPos.x() += sinf(_angle.getRadians()) * walkVel * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
- newPos.z() += cosf(_angle.getRadians()) * walkVel * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
+ newPos.x() += sinf(degToRad(_angle)) * walkVel * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
+ newPos.z() += cosf(degToRad(_angle)) * walkVel * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
}
if (_directWalkMode == DIRECT_WALK_BK) {
// but here we subtract
- newPos.x() -= sinf(_angle.getRadians()) * walkVel * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
- newPos.z() -= cosf(_angle.getRadians()) * walkVel * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
+ newPos.x() -= sinf(degToRad(_angle)) * walkVel * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
+ newPos.z() -= cosf(degToRad(_angle)) * walkVel * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
}
AdScene *scene = ((AdGame *)_gameRef)->_scene;
@@ -626,8 +628,8 @@ void AdActor3DX::getNextStep3D() {
Math::Vector3d newPos = _posVector;
// we add the direction vector since in a right handed coordinate system
// angles turn counter-clockwise (wme uses a left handed coordinate system, so there it's a subtraction)
- newPos.x() += sinf(_targetAngle.getRadians()) * _velocity * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
- newPos.z() += cosf(_targetAngle.getRadians()) * _velocity * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
+ newPos.x() += sinf(degToRad(_targetAngle)) * _velocity * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
+ newPos.z() += cosf(degToRad(_targetAngle)) * _velocity * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
Math::Vector3d origVec, newVec;
Math::Vector3d *currentPos = _path3D->getCurrent();
@@ -665,9 +667,9 @@ void AdActor3DX::initLine3D(Math::Vector3d startPt, Math::Vector3d endPt, bool f
// wme subtracted 90 dregrees from the angle, so that the angle zero points downwards
// and the angle 90 goes left
// now we have a right handed coordinate system, so we add 90 degrees instead
- turnTo(Math::rad2deg(-atan2(endPt.z() - startPt.z(), endPt.x() - startPt.x())) + 90);
+ turnTo(radToDeg(-atan2(endPt.z() - startPt.z(), endPt.x() - startPt.x())) + 90);
} else {
- _turningLeft = prepareTurn(Math::rad2deg(-atan2(endPt.z() - startPt.z(), endPt.x() - startPt.x())) + 90);
+ _turningLeft = prepareTurn(radToDeg(-atan2(endPt.z() - startPt.z(), endPt.x() - startPt.x())) + 90);
}
}
@@ -688,8 +690,8 @@ void AdActor3DX::getNextStep2D() {
Math::Vector3d newPos = _posVector;
// we add the direction vector since in a right handed coordinate system
// angles turn counter-clockwise (wme uses a left handed coordinate system, so there it's a subtraction)
- newPos.x() += sinf(_targetAngle.getRadians()) * _velocity * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
- newPos.z() += cosf(_targetAngle.getRadians()) * _velocity * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
+ newPos.x() += sinf(degToRad(_targetAngle)) * _velocity * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
+ newPos.z() += cosf(degToRad(_targetAngle)) * _velocity * _scale3D * (float)_gameRef->_deltaTime / 1000.f;
Math::Vector3d currentPoint;
adGame->_scene->_sceneGeometry->convert2Dto3DTolerant(_path2D->getCurrent()->x,
@@ -758,11 +760,11 @@ void AdActor3DX::followPath2D() {
}
//////////////////////////////////////////////////////////////////////////
-bool AdActor3DX::prepareTurn(Math::Angle targetAngle) {
+bool AdActor3DX::prepareTurn(float targetAngle) {
bool turnLeft;
- _angle.normalize(0.0f);
- targetAngle.normalize(0.0f);
+ _angle = BaseUtils::normalizeAngle(_angle);
+ targetAngle = BaseUtils::normalizeAngle(targetAngle);
if (_angle == targetAngle) {
_targetAngle = _angle;
@@ -771,9 +773,9 @@ bool AdActor3DX::prepareTurn(Math::Angle targetAngle) {
float delta1, delta2, delta3, delta;
- delta1 = (targetAngle - _angle).getDegrees();
- delta2 = (targetAngle + 360 - _angle).getDegrees();
- delta3 = (targetAngle - 360 - _angle).getDegrees();
+ delta1 = targetAngle - _angle;
+ delta2 = targetAngle + 360 - _angle;
+ delta3 = targetAngle - 360 - _angle;
delta1 = (fabs(delta1) <= fabs(delta2)) ? delta1 : delta2;
delta = (fabs(delta1) <= fabs(delta3)) ? delta1 : delta3;
@@ -800,7 +802,7 @@ bool AdActor3DX::turnToStep(float velocity) {
// done turning?
if (_angle == _targetAngle) {
- _angle.normalize(0.0f);
+ _angle = BaseUtils::normalizeAngle(_angle);
_targetAngle = _angle;
return true;
} else {
@@ -952,7 +954,7 @@ bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
float tmpAngle;
parser.scanStr((char *)params, "%f", &tmpAngle);
_angle = tmpAngle;
- _angle.normalize(0.0f);
+ BaseUtils::normalizeAngle(_angle);
break;
case TOKEN_SHADOW_SIZE:
@@ -1647,7 +1649,7 @@ bool AdActor3DX::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisSta
BaseObject *obj = (BaseObject *)val->getNative();
Math::Vector3d objPos;
((AdGame *)_gameRef)->_scene->_sceneGeometry->convert2Dto3D(obj->_posX, obj->_posY, &objPos);
- angle = Math::rad2deg(-atan2(objPos.z() - _posVector.z(), objPos.x() - _posVector.x())) + 90;
+ angle = radToDeg(-atan2(objPos.z() - _posVector.z(), objPos.x() - _posVector.x())) + 90;
} else {
// otherwise turn to direction
dir = val->getInt();
@@ -2074,7 +2076,7 @@ ScValue *AdActor3DX::scGetProperty(const Common::String &name) {
// DirectionAngle / DirAngle
//////////////////////////////////////////////////////////////////////////
else if (name == "DirectionAngle" || name == "DirAngle") {
- _scValue->setFloat(_angle.getDegrees());
+ _scValue->setFloat(_angle);
return _scValue;
}
@@ -2082,7 +2084,7 @@ ScValue *AdActor3DX::scGetProperty(const Common::String &name) {
// Direction
//////////////////////////////////////////////////////////////////////////
else if (name == "Direction") {
- _scValue->setInt(angleToDir(_angle.getDegrees()));
+ _scValue->setInt(angleToDir(_angle));
return _scValue;
}
@@ -2193,7 +2195,7 @@ bool AdActor3DX::scSetProperty(const char *name, ScValue *value) {
//////////////////////////////////////////////////////////////////////////
else if (strcmp(name, "DirectionAngle") == 0 || strcmp(name, "DirAngle") == 0) {
_angle = value->getFloat();
- _angle.normalize(0.0f);
+ BaseUtils::normalizeAngle(_angle);
return true;
}
diff --git a/engines/wintermute/ad/ad_actor_3dx.h b/engines/wintermute/ad/ad_actor_3dx.h
index 63c09d57e63..20541e33f73 100644
--- a/engines/wintermute/ad/ad_actor_3dx.h
+++ b/engines/wintermute/ad/ad_actor_3dx.h
@@ -97,7 +97,7 @@ public:
bool turnTo(float angle);
Math::Vector3d _targetPoint3D;
BasePoint *_targetPoint2D;
- Math::Angle _targetAngle;
+ float _targetAngle;
bool display() override;
bool update() override;
AdActor3DX(BaseGame *inGame);
@@ -122,7 +122,7 @@ private:
bool parseEffect(byte *buffer);
BaseArray<AdAttach3DX *> _attachments;
bool turnToStep(float velocity);
- bool prepareTurn(Math::Angle targetAngle);
+ bool prepareTurn(float targetAngle);
bool mergeAnimations(const char *filename);
bool mergeAnimations2(const char *filename);
bool unloadAnimation(const char *animName);
diff --git a/engines/wintermute/ad/ad_scene_geometry.cpp b/engines/wintermute/ad/ad_scene_geometry.cpp
index 7345f262beb..6af0c269d03 100644
--- a/engines/wintermute/ad/ad_scene_geometry.cpp
+++ b/engines/wintermute/ad/ad_scene_geometry.cpp
@@ -395,8 +395,8 @@ bool AdSceneGeometry::storeDrawingParams() {
//////////////////////////////////////////////////////////////////////////
bool AdSceneGeometry::render(bool render) {
- // store values
- // StoreDrawingParams();
+ // store values
+ // storeDrawingParams();
if (render) {
_gameRef->_renderer3D->renderSceneGeometry(_planes, _blocks, _generics, _lights, getActiveCamera());
}
@@ -454,9 +454,6 @@ float AdSceneGeometry::getHeightAt(Math::Vector3d pos, float tolerance, bool *in
//////////////////////////////////////////////////////////////////////////
bool AdSceneGeometry::directPathExists(Math::Vector3d *p1, Math::Vector3d *p2) {
- // pretty sure this stuff can be somewhat simplified by factoring it out
- // into some functions but let's leave this to a later point
-
// test walkplanes
for (uint i = 0; i < _planes.size(); i++) {
for (int j = 0; j < _planes[i]->_mesh->faceCount(); j++) {
diff --git a/engines/wintermute/base/base_object.cpp b/engines/wintermute/base/base_object.cpp
index 19dfff6f5a1..2563e9a97f7 100644
--- a/engines/wintermute/base/base_object.cpp
+++ b/engines/wintermute/base/base_object.cpp
@@ -1378,8 +1378,9 @@ bool BaseObject::getMatrix(Math::Matrix4 *modelMatrix, Math::Vector3d *posVect)
scale(1, 1) = _scale3D;
scale(2, 2) = _scale3D;
- float sinOfAngle = _angle.getSine();
- float cosOfAngle = _angle.getCosine();
+ Math::Angle angle = _angle;
+ float sinOfAngle = angle.getSine();
+ float cosOfAngle = angle.getCosine();
Math::Matrix4 rotation;
rotation.setToIdentity();
rotation(0, 0) = cosOfAngle;
diff --git a/engines/wintermute/base/base_object.h b/engines/wintermute/base/base_object.h
index fe8a84daf9c..e13606654f0 100644
--- a/engines/wintermute/base/base_object.h
+++ b/engines/wintermute/base/base_object.h
@@ -30,6 +30,7 @@
#include "engines/wintermute/base/base_script_holder.h"
+#include "engines/wintermute/base/gfx/xmath.h"
#include "engines/wintermute/persistent.h"
#include "common/events.h"
#include "graphics/transform_struct.h"
@@ -145,7 +146,7 @@ public:
bool _nonIntMouseEvents;
#ifdef ENABLE_WME3D
- Math::Angle _angle;
+ float _angle;
XModel *_xmodel;
XModel *_shadowModel;
Math::Matrix4 _worldMatrix;
diff --git a/engines/wintermute/base/base_persistence_manager.cpp b/engines/wintermute/base/base_persistence_manager.cpp
index cad2ff7e31a..7355de42f09 100644
--- a/engines/wintermute/base/base_persistence_manager.cpp
+++ b/engines/wintermute/base/base_persistence_manager.cpp
@@ -880,9 +880,9 @@ bool BasePersistenceManager::transferMatrix4(const char *name, Math::Matrix4 *va
}
}
-bool BasePersistenceManager::transferAngle(const char *name, Math::Angle *val) {
+bool BasePersistenceManager::transferAngle(const char *name, float *val) {
if (_saving) {
- putFloat(val->getDegrees());
+ putFloat(*val);
if (_saveStream->err()) {
return STATUS_FAILED;
diff --git a/engines/wintermute/base/base_persistence_manager.h b/engines/wintermute/base/base_persistence_manager.h
index 031feb99a0e..351d482497c 100644
--- a/engines/wintermute/base/base_persistence_manager.h
+++ b/engines/wintermute/base/base_persistence_manager.h
@@ -100,7 +100,7 @@ public:
#ifdef ENABLE_WME3D
bool transferVector3d(const char *name, Math::Vector3d *val);
bool transferMatrix4(const char *name, Math::Matrix4 *val);
- bool transferAngle(const char *name, Math::Angle *val);
+ bool transferAngle(const char *name, float *val);
#endif
BasePersistenceManager(const Common::String &savePrefix = "", bool deleteSingleton = false);
virtual ~BasePersistenceManager();
diff --git a/engines/wintermute/base/gfx/3dcamera.cpp b/engines/wintermute/base/gfx/3dcamera.cpp
index 82740720b03..82edf0ccefd 100644
--- a/engines/wintermute/base/gfx/3dcamera.cpp
+++ b/engines/wintermute/base/gfx/3dcamera.cpp
@@ -44,7 +44,7 @@ Camera3D::Camera3D(BaseGame *inGame) : BaseNamedObject(inGame) {
_position = Math::Vector3d(0.0f, 0.0f, 0.0f);
_target = Math::Vector3d(0.0f, 0.0f, 0.0f);
_bank = 0.0f;
- _fov = _origFov = Math::Angle(45.0f).getRadians();
+ _fov = _origFov = degToRad(45.0f);
_nearClipPlane = _farClipPlane = -1.0f;
}
@@ -69,9 +69,9 @@ bool Camera3D::loadFrom3DS(Common::MemoryReadStream &fileStream) {
float lens = fileStream.readFloatLE();
if (lens > 0.0f) {
- _fov = Math::Angle(1900.0f / lens).getRadians();
+ _fov = degToRad(1900.0f / lens);
} else {
- _fov = Math::Angle(45.0f).getRadians();
+ _fov = degToRad(45.0f);
}
_origFov = _fov;
diff --git a/engines/wintermute/base/gfx/base_renderer3d.cpp b/engines/wintermute/base/gfx/base_renderer3d.cpp
index af9bdb71b95..292903fe7f5 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.cpp
+++ b/engines/wintermute/base/gfx/base_renderer3d.cpp
@@ -30,7 +30,7 @@ BaseRenderer3D::BaseRenderer3D(Wintermute::BaseGame *inGame) : BaseRenderer(inGa
_camera = nullptr;
_state = RSTATE_NONE;
- _fov = M_PI / 4;
+ _fov = (float)M_PI / 4;
_nearClipPlane = DEFAULT_NEAR_PLANE;
_farClipPlane = DEFAULT_FAR_PLANE;
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index 30c56d89adf..79c61ff11f6 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -174,8 +174,9 @@ void BaseRenderOpenGL3D::displayShadow(BaseObject *object, const Math::Vector3d
scale(1, 1) = 1.0f;
scale(2, 2) = object->_shadowSize * object->_scale3D;
- float sinOfAngle = object->_angle.getSine();
- float cosOfAngle = object->_angle.getCosine();
+ Math::Angle angle = object->_angle;
+ float sinOfAngle = angle.getSine();
+ float cosOfAngle = angle.getCosine();
Math::Matrix4 rotation;
rotation.setToIdentity();
rotation(0, 0) = cosOfAngle;
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
index 45abaefaa39..dad038af730 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -57,9 +57,7 @@ struct SpriteVertexShader {
float a;
};
-BaseRenderOpenGL3DShader::BaseRenderOpenGL3DShader(BaseGame *inGame)
- : BaseRenderer3D(inGame), _flatShadowMaskShader(nullptr) {
- (void)_spriteBatchMode; // silence warning
+BaseRenderOpenGL3DShader::BaseRenderOpenGL3DShader(BaseGame *inGame) : BaseRenderer3D(inGame) {
}
BaseRenderOpenGL3DShader::~BaseRenderOpenGL3DShader() {
diff --git a/engines/wintermute/math/math_util.h b/engines/wintermute/math/math_util.h
index 22bff66b239..b4cce1d799b 100644
--- a/engines/wintermute/math/math_util.h
+++ b/engines/wintermute/math/math_util.h
@@ -41,6 +41,11 @@ public:
};
#ifdef ENABLE_WME3D
+
+#define DX_PI ((float)3.141592654)
+#define degToRad(_val) (_val * DX_PI * (1.0f / 180.0f))
+#define radToDeg(_val) (_val * (180.0f / DX_PI))
+
bool lineIntersectsTriangle(const Math::Vector3d &origin, const Math::Vector3d &direction,
const Math::Vector3d &v0, const Math::Vector3d &v1, const Math::Vector3d &v2,
float &t, float &u, float &v);
More information about the Scummvm-git-logs
mailing list