[Scummvm-git-logs] scummvm master -> a4781543e2c0b1fe8eadd418a8743457df3256d4
aquadran
noreply at scummvm.org
Thu Oct 17 08:53:50 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:
a4781543e2 WINTERMUTE: Synced code with original and fixed produce view matrix
Commit: a4781543e2c0b1fe8eadd418a8743457df3256d4
https://github.com/scummvm/scummvm/commit/a4781543e2c0b1fe8eadd418a8743457df3256d4
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2024-10-17T10:53:43+02:00
Commit Message:
WINTERMUTE: Synced code with original and fixed produce view matrix
Changed paths:
engines/wintermute/ad/ad_actor_3dx.cpp
engines/wintermute/ad/ad_scene_geometry.cpp
engines/wintermute/base/gfx/3dcamera.cpp
engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
engines/wintermute/base/gfx/xmodel.cpp
engines/wintermute/base/gfx/xmodel.h
diff --git a/engines/wintermute/ad/ad_actor_3dx.cpp b/engines/wintermute/ad/ad_actor_3dx.cpp
index 8ba7ac48c20..d96ff0d4a30 100644
--- a/engines/wintermute/ad/ad_actor_3dx.cpp
+++ b/engines/wintermute/ad/ad_actor_3dx.cpp
@@ -404,7 +404,6 @@ bool AdActor3DX::display() {
_gameRef->_renderer3D->setSpriteBlendMode(_blendMode);
_gameRef->_renderer3D->setWorldTransform(_worldMatrix);
- _xmodel->_lastWorldMat = _worldMatrix;
bool res = _xmodel->render();
@@ -458,8 +457,6 @@ bool AdActor3DX::renderModel() {
return false;
}
- _xmodel->_lastWorldMat = _worldMatrix;
-
displayAttachments(false);
return res;
}
@@ -470,7 +467,7 @@ bool AdActor3DX::displayShadowVolume() {
return false;
}
- //_gameRef->_renderer3D->setWorldTransform(_worldMatrix);
+ _gameRef->_renderer3D->setWorldTransform(_worldMatrix);
Math::Vector3d lightVector = Math::Vector3d(_shadowLightPos.x() * _scale3D,
_shadowLightPos.y() * _scale3D,
@@ -512,7 +509,8 @@ bool AdActor3DX::displayShadowVolume() {
at->displayShadowVol(viewMat, lightVector, extrusionDepth, true);
}
- _gameRef->_renderer3D->setWorldTransform(_worldMatrix);
+ // restore model's world matrix and render the shadow volume
+ _gameRef->_renderer3D->setWorldTransform(origWorld);
getShadowVolume()->renderToStencilBuffer();
@@ -558,10 +556,11 @@ bool AdActor3DX::displayAttachments(bool registerObjects) {
Math::Matrix4 viewMat;
viewMat.setData(*boneMat);
+
at->displayAttachable(viewMat, registerObjects);
}
- //_gameRef->_renderer3D->setWorldTransform(origView);
+ _gameRef->_renderer3D->setWorldTransform(origView);
return true;
}
diff --git a/engines/wintermute/ad/ad_scene_geometry.cpp b/engines/wintermute/ad/ad_scene_geometry.cpp
index a8b3de4a8ef..6bae8c2b777 100644
--- a/engines/wintermute/ad/ad_scene_geometry.cpp
+++ b/engines/wintermute/ad/ad_scene_geometry.cpp
@@ -359,9 +359,9 @@ bool AdSceneGeometry::storeDrawingParams() {
_drawingViewport = _gameRef->_renderer3D->getViewPort();
// store values
- //_gameRef->_renderer3D->getWorldTransform(_lastWorldMat);
- //_gameRef->_renderer3D->getViewTransform(_lastViewMat);
- //_gameRef->_renderer3D->getProjectionTransform(_lastProjMat);
+ _gameRef->_renderer3D->getWorldTransform(_lastWorldMat);
+ _gameRef->_renderer3D->getViewTransform(_lastViewMat);
+ _gameRef->_renderer3D->getProjectionTransform(_lastProjMat);
AdScene *scene = ((AdGame *)_gameRef)->_scene;
@@ -634,7 +634,7 @@ bool AdSceneGeometry::convert2Dto3DTolerant(int x, int y, Math::Vector3d *pos) {
bool AdSceneGeometry::convert2Dto3D(int x, int y, Math::Vector3d *pos) {
if (!_lastValuesInitialized) {
_drawingViewport = _gameRef->_renderer3D->getViewPort();
- //_gameRef->_renderer3D->getProjectionTransform(&_lastProjMat);
+ _gameRef->_renderer3D->getProjectionTransform(_lastProjMat);
}
float resWidth, resHeight;
@@ -655,9 +655,18 @@ bool AdSceneGeometry::convert2Dto3D(int x, int y, Math::Vector3d *pos) {
Math::Vector3d vPickRayDir;
Math::Vector3d vPickRayOrig;
- Math::Ray rayScene = _gameRef->_renderer3D->rayIntoScene(x, y);
- vPickRayDir = rayScene.getDirection();
- vPickRayOrig = rayScene.getOrigin();
+ // Compute the vector of the pick ray in screen space
+ Math::Vector3d vec((((2.0f * x) / _drawingViewport.width()) - 1) / _lastProjMat(0, 0),
+ -(((2.0f * y) / _drawingViewport.height()) - 1) / _lastProjMat(1, 1),
+ -1.0f);
+
+ Math::Matrix4 m = _viewMatrix;
+ m.inverse();
+ m.transpose();
+ m.transform(&vec, false);
+
+ vPickRayDir = vec;
+ vPickRayOrig = m.getPosition();
bool intFound = false;
diff --git a/engines/wintermute/base/gfx/3dcamera.cpp b/engines/wintermute/base/gfx/3dcamera.cpp
index 3f3edfad01a..8b132627752 100644
--- a/engines/wintermute/base/gfx/3dcamera.cpp
+++ b/engines/wintermute/base/gfx/3dcamera.cpp
@@ -54,15 +54,19 @@ Camera3D::~Camera3D() {
//////////////////////////////////////////////////////////////////////////
bool Camera3D::getViewMatrix(Math::Matrix4 *viewMatrix) {
- Math::Vector3d up = Math::Vector3d(0.0f, 1.0f, 0.0f);
+ DXVector3 up = DXVector3(0.0f, 1.0f, 0.0f);
if (_bank != 0) {
- Math::Matrix4 rotZ;
- rotZ.buildAroundZ(Math::Angle(_bank).getRadians());
- rotZ.transform(&up, false);
+ DXMatrix rot;
+ DXMatrixRotationZ(&rot, degToRad(_bank));
+ DXVec3TransformCoord(&up, &up, &rot);
}
- *viewMatrix = Math::makeLookAtMatrix(_position, _target, up);
+ DXVector3 position = DXVector3(_position.getData());
+ DXVector3 target = DXVector3(_target.getData());
+ DXMatrix view = DXMatrix(viewMatrix->getData());
+ DXMatrixLookAtRH(&view, &position, &target, &up);
+ viewMatrix->setData(view);
return true;
}
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index cd29cde502c..83852b39b6b 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -232,7 +232,7 @@ BaseImage *BaseRenderOpenGL3D::takeScreenshot() {
#endif
surface->create(_viewportRect.width(), _viewportRect.height(), format);
- glReadPixels(_viewportRect.left, g_system->getHeight() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
+ glReadPixels(_viewportRect.left, _viewportRect.height() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
GL_RGBA, GL_UNSIGNED_BYTE, surface->getPixels());
flipVertical(surface);
Graphics::Surface *converted = surface->convertTo(getPixelFormat());
@@ -532,11 +532,6 @@ bool BaseRenderOpenGL3D::setup3D(Camera3D *camera, bool force) {
if (_camera) {
Math::Matrix4 viewMatrix;
_camera->getViewMatrix(&viewMatrix);
-
- Math::Matrix4 cameraTranslate;
- cameraTranslate.setPosition(-_camera->_position);
- cameraTranslate.transpose();
- viewMatrix = cameraTranslate * viewMatrix;
setViewTransform(viewMatrix);
_fov = _camera->_fov;
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 09c7ad508fb..6998411abdd 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -344,7 +344,7 @@ BaseImage *BaseRenderOpenGL3DShader::takeScreenshot() {
#endif
surface->create(_viewportRect.width(), _viewportRect.height(), format);
- glReadPixels(_viewportRect.left, g_system->getHeight() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
+ glReadPixels(_viewportRect.left, _viewportRect.height() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
GL_RGBA, GL_UNSIGNED_BYTE, surface->getPixels());
flipVertical(surface);
Graphics::Surface *converted = surface->convertTo(getPixelFormat());
@@ -662,10 +662,6 @@ bool BaseRenderOpenGL3DShader::setup3D(Camera3D *camera, bool force) {
if (_camera) {
Math::Matrix4 viewMatrix;
_camera->getViewMatrix(&viewMatrix);
- Math::Matrix4 cameraTranslate;
- cameraTranslate.setPosition(-_camera->_position);
- cameraTranslate.transpose();
- viewMatrix = cameraTranslate * viewMatrix;
setViewTransform(viewMatrix);
_fov = _camera->_fov;
diff --git a/engines/wintermute/base/gfx/xmodel.cpp b/engines/wintermute/base/gfx/xmodel.cpp
index 0dcb833cf98..f8991ca15b4 100644
--- a/engines/wintermute/base/gfx/xmodel.cpp
+++ b/engines/wintermute/base/gfx/xmodel.cpp
@@ -478,9 +478,9 @@ bool XModel::render() {
bool res = _rootFrame->render(this);
// remember matrices for object picking purposes
- //_gameRef->_renderer3D->getWorldTransform(_lastWorldMat);
- //_gameRef->_renderer3D->getWorldTransform(_lastViewMat);
- //_gameRef->_renderer3D->getWorldTransform(_lastProjMat);
+ _gameRef->_renderer3D->getWorldTransform(_lastWorldMat);
+ _gameRef->_renderer3D->getWorldTransform(_lastViewMat);
+ _gameRef->_renderer3D->getWorldTransform(_lastProjMat);
// remember scene offset
Rect32 rc;
diff --git a/engines/wintermute/base/gfx/xmodel.h b/engines/wintermute/base/gfx/xmodel.h
index e4907dd2257..46f84aef45f 100644
--- a/engines/wintermute/base/gfx/xmodel.h
+++ b/engines/wintermute/base/gfx/xmodel.h
@@ -145,7 +145,6 @@ public:
static bool loadName(BaseNamedObject *obj, XFileData *data);
static bool loadName(Common::String &targetStr, XFileData *data);
- Math::Matrix4 _lastWorldMat;
Rect32 _boundingRect;
BaseObject *_owner;
@@ -179,6 +178,7 @@ private:
void updateBoundingRect();
void static inline updateRect(Rect32 *rc, Math::Vector3d vec);
Rect32 _drawingViewport;
+ Math::Matrix4 _lastWorldMat;
Math::Matrix4 _lastViewMat;
Math::Matrix4 _lastProjMat;
int32 _lastOffsetX;
More information about the Scummvm-git-logs
mailing list