reman3/Rayman_X/cpa/tempgrp/ITF/devvp3d.cpp

3132 lines
96 KiB
C++
Raw Blame History

/*=========================================================================
* DEVVP3D.cpp : Implementation of ViewPort 3D.
* This is a part of the PCA project.
*
* Version 1.0
* Creation date 17/07/96
* Revision date
*
*
* (c) Ubi Studios 1996
*=======================================================================*/
#include "stdafx.h"
#include "acp_base.h"
#include "geo.h"
#include "incgli.h"
#include "tex.h"
#include "col.h"
#define HieFriend
#include "spo.h"
#include "lst.hpp"
#include "itf/DEVVp3D.hpp"
#include "itf/CPADD.hpp"
#include "itf/devmul3d.hpp"
#include "itf/camdllb.hpp"
#include "itf/CPAProj.hpp"
#include "itf/CPACont.hpp"
#include "itf/CPAConst.hpp"
#include "itf/CPAInter.hpp"
#include "itf/CPAMWorl.hpp"
#include "itf/StdDLLID.h"
#include "DEVTimer.hpp"
#include "acp_driver.h"
static long MouseSprite[] = { 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,
0x00000000,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,0x00000000,
0x00000000,0xFFFFFFFF,0x00000000,0xFFFFFFFF,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0xFFFFFFFF,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000};
ACP_tdxHandleOfMaterial g_hMouseMaterial ;
//CPA2 Gabi Dumitrascu 98/07/13
ACP_tdxHandleOfMaterial g_hNormalMouseMaterial ;
ACP_tdxHandleOfMaterial g_hDragMouseMaterial ;
BOOL g_bDragDropActivate = FALSE;
//End CPA2 Gabi Dumitrascu 98/07/13
ACP_tdxHandleOfTexture p_stTextureBar1;
ACP_tdxHandleOfTexture p_stTextureBar2;
static BOOL g_bOnce = FALSE;
static BOOL g_bLButtonDown;
static UINT g_Flags;
#define C_PI 3.14159265
#define M_GetCameraDLL(Camera) ((CPA_CameraDLLBase*) (Camera)->GetEditor())
//CPA2 Corneliu Babiuc 13-05-98
//definition of constant for keyboard action
//************************ WARNING!!! *********************************
//these constant must be also defined in cpaproj.cpp file as they are!!!
//I didn't put them in a .hpp file in order to not modify the public files or a project
// object drawing flags
#define KA_CancelAllDrawingFlags 10
#define KA_IgnoreDrawingFlags 11
#define KA_NormalObject 12
#define KA_GridedObject 13
#define KA_WiredObject 14
// object parameters
#define KA_ShowObjectAxis 20
#define KA_BVObject 22
// centers
#define KA_ShowMainCenters 25
#define KA_ShowAllCenters 26
#define KA_ShowNoCenter 27
// world drawing flags
#define KA_NormalWorld 30
#define KA_GridedWorld 31
#define KA_WiredWorld 32
// world display mode
#define KA_WorldSectors 40
#define KA_VisibleSectors 41
#define KA_CurrentSector 42
#define KA_CollisionMap 43
// bounding volumes
#define KA_SectorsBV 50
#define KA_ActorsBV 51
#define KA_ObjectsBV 52
#define KA_NoBV 53
// colors
#define KA_SelectBackgroundColor 55
// selection
#define KA_CancelSelection 60
#define KA_FullSelection 61
#define KA_DeltaSelection 62
#define KA_FixedDepthPyramid 63
#define KA_RealTimePyramid 64
// status bar
#define KA_DisplayInstanceInfo 70
#define KA_DisplayInstanceToCam 71
#define KA_DisplayCameraInfo 72
#define KA_DisplayDistance 73
// options
#define KA_ScaleEditorObjects 80
#define KA_ShowNoAxis 81
#define KA_ShowAxisLeft 82
#define KA_ShowAxisRight 83
#define KA_Borders 100
#define KA_ComputeCenters 110
#define KA_ForceMousePos 120
//CPA2 Gabi Dumitrascu 98/06/29
#define EDGE_TOLERANCE 1
#define RIGHT_EDGE_TOLERANCE 1
#define TOP_TOLERANCE 10
#define VOODOO_WIDTH 640
#define VOODOO_HEIGHT 480
//End CPA2 Gabi Dumitrascu 98/06/29
#ifdef USE_DIRECTX
extern "C"
{
#include "gliglou\multidrv\inc\dllinter.h"
}
#endif
//END CPA2 Corneliu Babiuc 19-05-98
IMPLEMENT_DYNCREATE(DEV_ViewPort3D, CWnd)
BEGIN_MESSAGE_MAP(DEV_ViewPort3D, DEV_ViewPort)
//{{AFX_MSG_MAP(DEV_ViewPort3D)
ON_WM_CREATE()
ON_WM_DESTROY()
#ifdef ACTIVE_EDITOR
ON_WM_KEYDOWN()
ON_WM_KEYUP()
// CPA2 Corneliu Babiuc (Alt Key) 14-05-98
ON_WM_SYSKEYDOWN()
ON_WM_SYSKEYUP()
// END CPA2 Corneliu Babiuc (Alt Key) 14-05-98
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP() // CPA_Ed_1 FS
ON_WM_MOUSEMOVE()
//CPA2 Gabi Dumitrascu 98/07/13
ON_WM_NCMOUSEMOVE()
ON_WM_NCHITTEST()
ON_WM_KILLFOCUS()
ON_WM_SETFOCUS()
//End CPA2 Gabi Dumitrascu 98/07/13
ON_WM_SETFOCUS()
ON_MESSAGE(WM_DRAGDROP_LOOSEFOCUS, OnDragDropLooseFocus)
ON_MESSAGE(WM_DRAGDROP_GAINFOCUS, OnDragDropGainFocus)
ON_MESSAGE(WM_DRAGDROP_MOVE, OnDragDropMove)
ON_MESSAGE(WM_DRAGDROP_END, OnDragDropEnd)
ON_WM_TIMER()
#endif // ACTIVE_EDITOR
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//==========================================================================
DEV_ViewPort3D::DEV_ViewPort3D()
{
m_Attributes3D.p_stCam = NULL;
#ifdef ACTIVE_EDITOR
m_p_oCamera = NULL;
m_p_oCameraSO = NULL;
m_p_oCameraInterface = NULL;
m_uiLastMouseState = 0;
m_bWasInSecondScreen = FALSE;
m_bIsVerticalSwap = FALSE;
#endif // ACTIVE_EDITOR
}
DEV_ViewPort3D::~DEV_ViewPort3D()
{
#ifdef ACTIVE_EDITOR
//CPA2 Gabi Dumitrascu 98/07/09
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen ())
mfn_vChangeCursorFrom2To1 (CPoint (1, 1), eSwapRight);
//End CPA2 Gabi Dumitrascu 98/07/09
#endif // ACTIVE_EDITOR
}
//==========================================================================
void DEV_ViewPort3D::CreateViewPort(void * device, GLD_tdhDevice DisplayDevice)
{
RECT r;
GLD_tdstViewportAttributes stViewportAttr;
m_hDisplayDevice = DisplayDevice;
((CWnd*)device)->GetClientRect(&r);
Create(NULL, (LPCTSTR) "ViewPort",
WS_OVERLAPPED | WS_CLIPSIBLINGS | WS_VISIBLE | WS_CHILD,
CRect(r), (CWnd*)device, 1);
// The Viewport take all the device client zone.
//ANNECY CB
stViewportAttr.dwWidthInPercent = 100;
stViewportAttr.dwHeightInPercent = 100;
stViewportAttr.dwClipTopInPercent = 0;
stViewportAttr.dwClipBottomInPercent = 100;
stViewportAttr.dwClipLeftInPercent = 0;
stViewportAttr.dwClipRightInPercent = 100;
stViewportAttr.iOffsetPosX = 0;
stViewportAttr.iOffsetPosY = 0;
//ENDANNECY
if (!GLD_bCreateViewport(m_hDisplayDevice, &stViewportAttr, &m_hDisplayViewport))
{
ASSERT(0);
}
if (!GLD_bGiveSpecificAttributesToViewport(m_hDisplayDevice, m_hDisplayViewport, (void *)&m_Attributes3D))
{
ASSERT(0);
}
}
GLI_tdxHandleToCamera DEV_ViewPort3D::GetEngineCamera()
{
return m_Attributes3D.p_stCam;
}
//==========================================================================
int DEV_ViewPort3D::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (DEV_ViewPort::OnCreate(lpCreateStruct) == -1)
return -1;
#ifdef ACTIVE_EDITOR
DD_eAddReference(GetSafeHwnd(), "Evt_Editor", C_ucModel, FALSE);
#endif
return 0;
}
//==========================================================================
void DEV_ViewPort3D::OnDestroy()
{
#ifdef ACTIVE_EDITOR
if (GetParentMultiDevice()->mbOnDestroy == FALSE)
{
// if there's a camera, destroy it !!!
if (m_p_oCameraInterface)
m_p_oCameraInterface->DestroyCamera(m_p_oCameraSO);
}
m_p_oCameraInterface = NULL;
m_p_oCameraSO = NULL;
m_p_oCamera = NULL;
DD_eDelReference(GetSafeHwnd());
#endif //ACTIVE_EDITOR
}
#ifdef ACTIVE_EDITOR
//=========================================================================
// Change the current camera
// return the old camera
//=========================================================================
CPA_SuperObject *DEV_ViewPort3D::ChangeCamera(CPA_SuperObject *p_oCameraSO, BOOL bWithPrevCam)
{
CPA_CameraSlots *p_oCamSlots;
CPA_SuperObject *p_oOldCameraSO;
CPA_BaseObject *p_oOldCamera;
CPA_BaseObject *p_oCamera;
p_oCamSlots = ((DEV_MultiDevice3D*)(GetDevice()->GetWindowParent()))->GetWorld()->GetCameraSlots();
p_oOldCameraSO = m_p_oCameraSO;
p_oOldCamera = m_p_oCamera;
// if there was a camera in this viewport, check prevcamtip
if (p_oOldCamera != NULL)
{
// if the prevcam is active for this world :
if (bWithPrevCam && p_oCamSlots->IsPrevCamTipActive())
{
// save the old camera in the reserved slot
p_oCamSlots->SaveCameraInSlot(p_oCamSlots->GetPrevCamSlot(),"Previous Camera",p_oOldCamera,MakeACopy);
}
// and disactivate this camera
M_GetCameraDLL(p_oOldCamera)->Disactivate(p_oOldCamera);
}
if (p_oCameraSO != NULL)
{
p_oCamera = p_oCameraSO->GetObject();
ASSERT(p_oCamera != NULL);
// cannot put a camera that is already active
ASSERT(!(M_GetCameraDLL(p_oCamera)->IsActive(p_oCamera)));
m_p_oCamera = p_oCamera;
m_p_oCameraSO = p_oCameraSO;
m_p_oCameraInterface = M_GetCameraDLL(p_oCamera);
m_p_oCameraInterface->Activate(m_p_oCamera,this,(GetParentDialogBar()),CPoint(598,-1));
}
else
{
m_p_oCamera = NULL;
m_p_oCameraSO = NULL;
m_p_oCameraInterface = NULL;
}
return p_oOldCameraSO;
}
//=========================================================================
// INIT LIGHTS IN VIEWPORT
// Main function of drawing in edit mode
// This function is called for each display viewport
//=========================================================================
void DEV_ViewPort3D::fn_vInitLightsInViewport (GLD_tdxHandleToViewportAttributes _hVpt, GLI_tdxHandleToLight _hLight, CPA_MainWorld *pMainWorld)
{
long lIndex;
// clear lights
GLI_vClearListOfLightInViewport(_hVpt);
m_lCurrentLights = 0;
// ambiant light (if no local light)
if ((pMainWorld->m_lNbLocalLights == 0)&&(pMainWorld->m_lNbDynamicLights == 0))
{
GLI_vAddLightToViewport(_hVpt,_hLight);
m_a_tdxhArrayOfLights[m_lCurrentLights].hLight = _hLight;
GLI_xGetLightState(_hLight, &m_a_tdxhArrayOfLights[m_lCurrentLights].lInitialState);
m_lCurrentLights++;
}
// local lights
for (lIndex = 0; lIndex < pMainWorld->m_lNbLocalLights; lIndex++)
{
GLI_vAddLightToViewport(_hVpt, pMainWorld->m_a_tdxhArrayOfLocalLights[lIndex]);
m_a_tdxhArrayOfLights[m_lCurrentLights].hLight = pMainWorld->m_a_tdxhArrayOfLocalLights[lIndex];
GLI_xGetLightState(pMainWorld->m_a_tdxhArrayOfLocalLights[lIndex], &m_a_tdxhArrayOfLights[m_lCurrentLights].lInitialState);
m_lCurrentLights++;
}
// dynamic lights
for (lIndex = 0; lIndex < pMainWorld->m_lNbDynamicLights; lIndex++)
{
GLI_vAddLightToViewport(_hVpt,pMainWorld->m_a_tdxhArrayOfDynamicLights[lIndex]);
m_a_tdxhArrayOfLights[m_lCurrentLights].hLight = pMainWorld->m_a_tdxhArrayOfDynamicLights[lIndex];
GLI_xGetLightState(pMainWorld->m_a_tdxhArrayOfDynamicLights[lIndex], &m_a_tdxhArrayOfLights[m_lCurrentLights].lInitialState);
m_lCurrentLights++;
}
}
//=========================================================================
// DRAWOBJECT
// Main function of drawing in edit mode
// This function is called for each display viewport
//=========================================================================
void DEV_ViewPort3D::DrawObject(GLI_tdxHandleToLight hLight, HIE_tdxHandleToSuperObject hObject)
{
GLD_tdstViewportAttributes stViewportAttr;
BOOL bEnabledWrite;
if (!GetParentMultiDevice3D()->IsActive())
return;
if (!GLD_bClearViewport(m_hDisplayDevice, m_hDisplayViewport))
{
ASSERT(0);
}
GLI_xClearViewingList();
if (!GLD_bRequestWriteToViewport(m_hDisplayDevice, m_hDisplayViewport, &stViewportAttr, &bEnabledWrite))
{
ASSERT(0);
}
if (bEnabledWrite)
{
if(hObject)
{
fn_vInitLightsInViewport
(
(struct GLD_tdstViewportAttributes_ *)&stViewportAttr,
hLight,
GetParentMultiDevice3D()->GetInterface()->GetMainWorld()
);
HIE_fn_vInitMatrixStack();
HIE_fn_bInitCameraMatrixStack((struct GLD_tdstViewportAttributes_ *)&stViewportAttr);
HIE_fn_vSendSuperObjectToViewport((struct GLD_tdstViewportAttributes_ *)&stViewportAttr, hObject, GLI_C_lAllIsEnable&(GLI_C_lIsNotDrawCollideInformation^0xffffffff));
}
// Call editor method to draw special object in viewport
if (m_p_oCamera)
m_p_oCamera->GetEditor()->fn_vAddObjectsToDraw(&stViewportAttr, hLight, this);
if(GetParentContact())
GetParentContact()->fn_vAddObjectsToDraw(&stViewportAttr, hLight, this);
if(hObject)
GLI_xSendListToViewport(&stViewportAttr);
if (!GLD_bWriteToViewportFinished(m_hDisplayDevice, m_hDisplayViewport))
{
ASSERT(0);
}
// Call editor method to draw special object in viewport
if(GetParentContact())
GetParentContact()->fn_vAddObjectsToDraw2(&stViewportAttr, NULL);
}
}
//=========================================================================
// DRAWOBJECT
// Main function of drawing in edit mode
// This function is called for each display viewport
//=========================================================================
void DEV_ViewPort3D::DrawEditorObject(GLI_tdxHandleToLight hLight, CPA_SuperObject *pRoot)
{
GLD_tdstViewportAttributes stViewportAttr;
BOOL bEnabledWrite;
if (!GetParentMultiDevice3D()->IsActive())
return;
// clear all
if (!GLD_bClearViewport(m_hDisplayDevice, m_hDisplayViewport))
{
ASSERT(0);
}
// if gli has not been initialized, I can't draw !!!
if (GLI_xIsGliInit() == 0)
return;
GLI_xClearViewingList();
// request write
if (!GLD_bRequestWriteToViewport(m_hDisplayDevice, m_hDisplayViewport, &stViewportAttr, &bEnabledWrite))
{
ASSERT(0);
}
// draw world
if (bEnabledWrite)
{
if(GetParentContact())
GetParentContact()->fn_vBeforeDrawingWorld(&stViewportAttr, hLight, this);
if(pRoot)
{
CPA_Interface *pInterface = pRoot->GetEditor()->GetInterface();
pInterface->GetSpecificInterface()->fn_vDisplayWorld (this,
(struct GLD_tdstViewportAttributes_ *)&stViewportAttr, hLight, pRoot);
}
// Call editor method to draw special object in viewport
if (m_p_oCamera)
m_p_oCamera->GetEditor()->fn_vAddObjectsToDraw(&stViewportAttr, hLight, this);
if(GetParentContact())
GetParentContact()->fn_vAddObjectsToDraw(&stViewportAttr, hLight, this);
if(pRoot)
GLI_xSendListToViewport(&stViewportAttr);
if (!GLD_bWriteToViewportFinished(m_hDisplayDevice, m_hDisplayViewport))
{
ASSERT(0);
}
if(GetParentContact())
GetParentContact()->GetInterface()->fn_vDrawSuperObjectsCenters(&stViewportAttr);
// Call editor method to draw special object in viewport
if(GetParentContact())
GetParentContact()->fn_vAddObjectsToDraw2(&stViewportAttr, NULL);
}
// draw mouse if fullscreen
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen())
{
if(!g_bOnce)
{
//CPA2 Gabi Dumitrascu 98/07/13
GLI_xCreateMaterial(&g_hNormalMouseMaterial);
GLI_xLoadTexture(&p_stTextureBar1, NULL,"curseur_nz.tga", 0, 0);
if (p_stTextureBar1)
TEX_vSetTextureQualityLevel(p_stTextureBar1,(char)TEX_C_QHIGH); // eventuellement
GLI_xCreateMaterial(&g_hDragMouseMaterial);
GLI_xLoadTexture(&p_stTextureBar2, NULL,"curseur_nz_drag.tga", 0, 0);
if (p_stTextureBar2)
TEX_vSetTextureQualityLevel(p_stTextureBar2,(char)TEX_C_QHIGH); // eventuellement
// si les textures ne sont pas deja chargees
GLI_vEndofGeometricLoad();
GLI_xSetMaterialTexture(g_hNormalMouseMaterial,p_stTextureBar1);
GLI_xSetMaterialTexture(g_hDragMouseMaterial,p_stTextureBar2);
g_hMouseMaterial = g_hNormalMouseMaterial;
//End CPA2 Gabi Dumitrascu 98/07/13
g_bOnce = TRUE;
}
//CPA2 Gabi Dumitrascu 98/07/13
g_hMouseMaterial = g_bDragDropActivate? g_hDragMouseMaterial : g_hNormalMouseMaterial;
//End CPA2 Gabi Dumitrascu 98/07/13
DetectMouseSwap(TRUE, &stViewportAttr);
}
//CPA2 Gabi Dumitrascu 98/07/13
else if (!IsCursorInFirstScreen ())
{
POINT ptMouse;
GetCursorPos (&ptMouse);
mfn_vChangeCursorFrom2To1 (CPoint (ptMouse), eSwapRight);
}
//End CPA2 Gabi Dumitrascu 98/07/13
}
//=========================================================================
// DETECTMOUSESWAP
// Called to detect the swap between 2 screens
//=========================================================================
void DEV_ViewPort3D::DetectMouseSwap (BOOL bDrawCursor, GLD_tdstViewportAttributes *p_stViewportAttr)
{
POINT stPoint;
CPoint oPoint;
CRect oScreenViewRect;
GetCursorPos(&stPoint);
oPoint = CPoint(stPoint);
oScreenViewRect.right -= 4;
oScreenViewRect.bottom -= 4;
if (GetParentContact()->GetInterface()->fn_bGetAutomaticSwap () && !IsCursorInFirstScreen ())
{
oScreenViewRect.top = 0;
oScreenViewRect.left = 0;
oScreenViewRect.right = GetSystemMetrics (SM_CXFULLSCREEN);
oScreenViewRect.bottom = GetSystemMetrics (SM_CYFULLSCREEN);
}
else
GetWindowRect(oScreenViewRect);
//CPA2 Gabi Dumitrascu 98/06/26
if (GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
BOOL bChangeCursorFrom1To2 = FALSE;
BOOL bChangeCursorFrom2To1 = FALSE;
int xLeft = oPoint.x - oScreenViewRect.left;
int yTop = oPoint.y - oScreenViewRect.top;
int xRight = oScreenViewRect.right - oPoint.x;
int yBottom = oScreenViewRect.bottom - oPoint.y;
const int nScreenWidth = GetSystemMetrics (SM_CXFULLSCREEN);
tdeForceSwap eForceSwap = GetParentContact()->GetInterface()->fn_eGetForceSwap();
tdeForceSwap eSwapMode = eSwapRight;
// Mode Right Swap
if (eForceSwap == eSwapRight || eForceSwap == eSwapBoth)
{
// cursor pos on the left edge of the screen
if (xLeft <= EDGE_TOLERANCE && !IsCursorInFirstScreen () && !m_bObjectIsMoving)
{
bChangeCursorFrom2To1 = TRUE;
eSwapMode = eSwapRight;
}
// cursor pos on the right edge of the screen
else if (xRight <= EDGE_TOLERANCE && IsCursorInFirstScreen ())
{
bChangeCursorFrom1To2 = TRUE;
eSwapMode = eSwapRight;
}
}
// Mode Left Swap
if (eForceSwap == eSwapLeft || eForceSwap == eSwapBoth)
{
// cursor pos on the left edge of the screen
if (xRight <= EDGE_TOLERANCE && !IsCursorInFirstScreen () && !m_bObjectIsMoving)
{
bChangeCursorFrom2To1 = TRUE;
eSwapMode = eSwapLeft;
}
// cursor pos on the right edge of the screen
else if (/*xLeft*/oPoint.x <= EDGE_TOLERANCE && IsCursorInFirstScreen ())
{
bChangeCursorFrom1To2 = TRUE;
eSwapMode = eSwapLeft;
}
}
// For Top Limit
if (!IsCursorInFirstScreen () && !m_bObjectIsMoving && yTop <= EDGE_TOLERANCE)
{
bChangeCursorFrom2To1 = TRUE;
m_bIsVerticalSwap = TRUE;
}
// For Bottom Limit
if (!IsCursorInFirstScreen () && !m_bObjectIsMoving && yBottom <= EDGE_TOLERANCE)
SetCursorPos(oPoint.x, oScreenViewRect.bottom + EDGE_TOLERANCE + 1);
if (bChangeCursorFrom1To2)
mfn_vChangeCursorFrom1To2 (oPoint, eSwapMode);
else if (bChangeCursorFrom2To1)
mfn_vChangeCursorFrom2To1 (oPoint, eSwapMode, m_bIsVerticalSwap);
}
if (bDrawCursor)
{
if (oPoint.x >= oScreenViewRect.left && oPoint.x <= oScreenViewRect.right &&
oPoint.y >= oScreenViewRect.top && oPoint.y <= oScreenViewRect.bottom)
{
CPoint oScreen;
oScreen.x = oScreenViewRect.right;
oScreen.y = oPoint.y;
//CPA2 Gabi Dumitrascu 98/06/26
if (GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
if (!IsCursorInFirstScreen ())
{
//End CPA2 Gabi Dumitrascu 98/06/26
ScreenToClient(&oPoint);
ClientToVoodooFullScreen(oPoint);
// adjust width to screen size
ScreenToClient(&oScreen);
ClientToVoodooFullScreen(oScreen);
float xWidth = ((oScreen.x - oPoint.x) <= 16.0f) ? (oScreen.x - oPoint.x) : 16.0f;
GLI_vDraw2DSprite(p_stViewportAttr, (float)oPoint.x, oPoint.x + xWidth, (float)oPoint.y, oPoint.y + 16.0f, g_hMouseMaterial);
//VLNG4
GLI_xSendListToViewport(p_stViewportAttr);
//EVL
//CPA2 Gabi Dumitrascu 98/06/26
}
}
else
{
ScreenToClient(&oPoint);
ClientToVoodooFullScreen(oPoint);
// adjust width to screen size
ScreenToClient(&oScreen);
ClientToVoodooFullScreen(oScreen);
float xWidth = ((oScreen.x - oPoint.x) <= 16.0f) ? (oScreen.x - oPoint.x) : 16.0f;
GLI_vDraw2DSprite(p_stViewportAttr, (float)oPoint.x, oPoint.x + xWidth, (float)oPoint.y, oPoint.y + 16.0f, g_hMouseMaterial);
//VLNG4
GLI_xSendListToViewport(p_stViewportAttr);
//EVL
}
//End CPA2 Gabi Dumitrascu 98/06/26
}
}
}
#endif // ACTIVE_EDITOR
//===========================================================================
//
// MOUSE
//
//===========================================================================
#ifdef ACTIVE_EDITOR
// JT
// Init and close the mouse session
void DEV_ViewPort3D::InitMouseMove (MTH3D_tdstVector *stMousePos3D, GLI_tdst2DVertex* stMousePos2D)
{
m_stMousePos = *stMousePos3D; // We keep in memory the 3D position of the mouse
GetParentContact()->GetInterface()->SetMovePlaneCenter(&m_stMousePos);
GLI_vInitDeplacement(m_hDisplayDevice, m_hDisplayViewport, stMousePos2D, stMousePos3D);
if (GetParentContact())
{
GetParentContact()->GetInterface()->fn_vEnterObjectMouseMoveMode();
m_oLastCursorScreenPos = CPoint((int) stMousePos2D->xX, (int) stMousePos2D->xY);
}
else
GetParentContact()->GetInterface()->fn_vLeaveObjectMouseMoveMode();
}
void DEV_ViewPort3D::DoneMouseMove (void)
{
}
//=========================================================================
// make the camera follow the moved object (called only when an object is)
// being moved with the mouse)
// Author : Benoit Germmain
// 24/02/97 Modification: corrected a bug forcing the scroll of the camera
// if the moved object was already in the outer limit of the viewport
//=========================================================================
void DEV_ViewPort3D::m_vFakeMouseMove(CPoint oScreenMousePoint)
{
GLI_tdst2DVertex stMouseScreenCoords;
tdstMousePos stMousePos;
GLI_tdst2DVertex stNewMouseScreenCoords, stOldMouseScreenCoords;
MTH3D_tdstVector stMouseInduced3DMove;
const short c_wMaxBorderPercent = 100;
const short c_wScrollBorderPercent = c_wMaxBorderPercent * 90 / 100;
//BOOL bRemoveMouseMessages = TRUE;
m_bObjectIsMoving = FALSE;
//get the current screen client area of the viewport
CRect oScreenViewRect;
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
oScreenViewRect.top = 0;
oScreenViewRect.left = 0;
oScreenViewRect.right = GetSystemMetrics (SM_CXFULLSCREEN);
oScreenViewRect.bottom = GetSystemMetrics (SM_CYFULLSCREEN);
}
else
GetWindowRect(oScreenViewRect);
//make the rest of the code believe the cursor is always inside the client boundaries
//if we are moving an object (or trying to, at least)
if ( GetParentContact()->GetInterface()->fn_bGetObjectMouseMoveMode() )
{
oScreenMousePoint.x = max(oScreenMousePoint.x, oScreenViewRect.left);
oScreenMousePoint.x = min(oScreenMousePoint.x, oScreenViewRect.right);
oScreenMousePoint.y = max(oScreenMousePoint.y, oScreenViewRect.top);
oScreenMousePoint.y = min(oScreenMousePoint.y, oScreenViewRect.bottom);
}
//get the position in client coordinates
CPoint oClientMousePoint = oScreenMousePoint;
ScreenToClient(&oClientMousePoint);
//get the position in client voodoo coordinates
CPoint oVoodooMousePoint = oClientMousePoint;
#ifndef USE_DIRECTX
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
#endif
ClientToVoodoo(oVoodooMousePoint);
//get the relative client area
CRect oClientViewRect(oScreenViewRect);
oClientViewRect.OffsetRect(-oScreenViewRect.left, -oScreenViewRect.top);
//##########################################################
//here the current cursor position is inside the client area
//##########################################################
//fill the stMousePos structure
stMousePos.stPos = oScreenMousePoint;
stMousePos.stPos3D = m_stMousePos;
stMouseScreenCoords.xX = GLI_M_LongToValue(oVoodooMousePoint.x);
stMouseScreenCoords.xY = GLI_M_LongToValue(oVoodooMousePoint.y);
stMousePos. stPos2D.xX = GLI_M_LongToValue(oVoodooMousePoint.x);
stMousePos. stPos2D.xY = GLI_M_LongToValue(oVoodooMousePoint.y);
if ( !GLI_bGetVecteurDeplacement(&stMouseScreenCoords, &stMouseInduced3DMove) ) // no object is moved
{
if(GetParentContact())
GetParentContact()->_OnMouseMove(0, &stMousePos, NULL);
if(m_p_oCameraInterface)
m_p_oCameraInterface->SendMouseMoveToCamera(m_p_oCamera,0, &stMousePos, NULL);
//keep the cursor at the current position when we are back
if (M_bFullScreenEditor())
{
GetParentMultiDevice3D()->DrawEditorObject();
}
return;
}
//##################################################
//here and object is picked and moved with the mouse
//##################################################
// the camera is used to move or rotate an object: make the cursor follow the object
// ALX
// The mouse move is constrained into a specific plane selected by SetPlaneForMouseMove
// if the object moved out of the depth autoscroll zone, translate the camera of the object's movement
// get too far or too close
MTH3D_tdstVector stDepthAutoScroll;
BOOL bDepthAutoScroll;
if ( bDepthAutoScroll = ComputeMouseMoveIntoPlane(&stMouseInduced3DMove, &stMouseInduced3DMove) )
stDepthAutoScroll = stMouseInduced3DMove;
else
MTH3D_M_vNullVector(&stDepthAutoScroll);
//move faster is the cursor is in the autoscroll area
int iCurX, iCurY;
iCurX = (oClientMousePoint.x - oClientViewRect.right / 2) * (c_wMaxBorderPercent * 2) / oClientViewRect.right;
iCurY = (oClientMousePoint.y - oClientViewRect.bottom / 2) * (c_wMaxBorderPercent * 2) / oClientViewRect.bottom;
if ( abs(iCurX) >= c_wScrollBorderPercent || abs(iCurY) >= c_wScrollBorderPercent )
{
if ( int iScrollSpeed = min(c_wMaxBorderPercent, max(abs(iCurY), abs(iCurX))) - c_wScrollBorderPercent )
{
if (!MTH3D_M_bIsNullVector(&stMouseInduced3DMove))
MTH3D_M_vNormalizeVector(&stMouseInduced3DMove, &stMouseInduced3DMove);
MTH3D_M_vMulScalarVector(&stMouseInduced3DMove, iScrollSpeed * iScrollSpeed / (float) 2.0 / c_wMaxBorderPercent, &stMouseInduced3DMove);
}
}
// Send the 3D vector to the frame base.
if
(
!GetParentContact() // the given mouse pos is *before* the movement!
|| !GetParentContact()->_OnMouseMove(m_uiLastMouseState, &stMousePos, &stMouseInduced3DMove)
) //the object did not move, so we dont have to continue...
{
//SetCursorPos(m_oLastCursorScreenPos.x, m_oLastCursorScreenPos.y);
if (M_bFullScreenEditor())
{
GetParentMultiDevice3D()->DrawEditorObject();
}
return;
}
m_bObjectIsMoving = TRUE;
if ( !GetParentContact()->GetInterface()->fn_bGetObjectMouseMoveMode() )
{
//SetCursorPos(m_oLastCursorScreenPos.x, m_oLastCursorScreenPos.y);
if (M_bFullScreenEditor())
{
GetParentMultiDevice3D()->DrawEditorObject();
}
return;
}
//TODO-B: if the moved object is the current camera target, untarget the camera immediately ?
//########################################################
//here we want the camera to follow the object being moved
//########################################################
// we update the 3D-position of the mouse, but after keeping the original position
MTH3D_tdstVector stMousePosBeforeMove = m_stMousePos;
MTH3D_M_vAddVector(&m_stMousePos, &stMousePosBeforeMove, &stMouseInduced3DMove);
// with the 3D-position, we compute the new 2D-position of the mouse
Convert3dTo2d(&stOldMouseScreenCoords, &stMousePosBeforeMove);
Convert3dTo2d(&stNewMouseScreenCoords, &m_stMousePos);
// make the camera follow the movement if the cursor gets close to a border of the viewport
// and if the cursor moves towards the same border... //bbb 24/02/97
// move the viewrect in the mouse position coordinates, ie the viewrect itself.
//get the initial client position of the moved object -> of the cursor
CPoint oClientInitialMousePos((int) stOldMouseScreenCoords.xX, (int) stOldMouseScreenCoords.xY);
//get the resulting client position of the moved object -> of the cursor
CPoint oClientResultingMousePos((int) stNewMouseScreenCoords.xX, (int) stNewMouseScreenCoords.xY);
//if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
VoodooToClient(oClientInitialMousePos);
//if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
VoodooToClient(oClientResultingMousePos);
// specific for 2nd screen
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
ClientToScreen(&oClientInitialMousePos);
ClientToScreen(&oClientResultingMousePos);
}
//compute the offset percentage of the old cursor pos relatively to the center of the viewport
int iStartX, iStartY;
iStartX = (oClientInitialMousePos.x - oClientViewRect.right / 2) * (c_wMaxBorderPercent * 2) / oClientViewRect.right;
iStartY = (oClientInitialMousePos.y - oClientViewRect.bottom / 2) * (c_wMaxBorderPercent * 2) / oClientViewRect.bottom;
//compute the offset percentage of the new cursor pos relatively to the center of the viewport
int iEndX, iEndY;
iEndX = (oClientResultingMousePos.x - oClientViewRect.right / 2) * (c_wMaxBorderPercent * 2) / oClientViewRect.right;
iEndY = (oClientResultingMousePos.y - oClientViewRect.bottom / 2) * (c_wMaxBorderPercent * 2) / oClientViewRect.bottom;
//do not move the camera if not far enough from the center, or if the designer moved
//towards the center of the viewport
const short c_wNotPushed = 0;
const short c_wPushedLeft = 1;
const short c_wPushedTop = 2;
const short c_wPushedRight = 4;
const short c_wPushedBottom = 8;
const short c_wPushVertical = c_wPushedTop + c_wPushedBottom;
const short c_wPushHorizontal = c_wPushedLeft + c_wPushedRight;
short wPushDir = c_wNotPushed;
float fRatioX = 1.0, fRatioY = 1.0;
//now we want the camera to move only so that the anchor will land at the border of the screen
//the autoscroll area of the viewport: the ratio to reduce the 3D movement is the
//penetration depth into the autoscroll area divided by the total movement percentage
if ( (iEndX <= -c_wScrollBorderPercent) && ((iEndX - iStartX) < 0) )
{
wPushDir += c_wPushedLeft;
fRatioX = abs(c_wScrollBorderPercent - abs(iEndX)) / (float) abs(iEndX - iStartX); // < 1
}
else if ( (iEndX >= c_wScrollBorderPercent) && ((iEndX - iStartX) > 0) )
{
wPushDir += c_wPushedRight;
fRatioX = abs(c_wScrollBorderPercent - abs(iEndX)) / (float) abs(iEndX - iStartX); // < 1
}
if ( (iEndY <= -c_wScrollBorderPercent) && ((iEndY - iStartY) < 0) )
{
wPushDir += c_wPushedTop;
fRatioY = abs(c_wScrollBorderPercent - abs(iEndY)) / (float) abs(iEndY - iStartY); // < 1
}
else if ( (iEndY >= c_wScrollBorderPercent) && ((iEndY - iStartY) > 0) )
{
wPushDir += c_wPushedBottom;
fRatioY = abs(c_wScrollBorderPercent - abs(iEndY)) / (float) abs(iEndY - iStartY); // < 1
}
CPA_CameraCoords oCoords;
if ( wPushDir ) //if the camera is pushed to keep the object in the viewport
{
//convert the vector into camera coordinates
if ( m_p_oCameraInterface )
m_p_oCameraInterface->WorldToCameraCoordinates_Vector(m_p_oCamera, stMouseInduced3DMove);
//zero the axis that is not pushed
if ( !(wPushDir & c_wPushHorizontal) ) //we do not push horizontal
stMouseInduced3DMove.xX = 0.0;
if ( !(wPushDir & c_wPushVertical) ) //we do not push vertical
stMouseInduced3DMove.xY = 0.0;
//
//scale the vector
MTH3D_M_vMulScalarVector(&stMouseInduced3DMove, min(fRatioX, fRatioY), &stMouseInduced3DMove);
//if the object landed in the outer border, translate the camera so that the object
//gets back in the center area
// move the camera with the induced vector for the moved object...
oCoords.SetXYZ(stMouseInduced3DMove.xX, stMouseInduced3DMove.xY, stMouseInduced3DMove.xZ);
oCoords.SetAxisSystem(CameraCoordinates);
//release the camera target only if an object is moved...
if (m_p_oCameraInterface)
m_p_oCameraInterface->SetTargetType(m_p_oCamera, tNone);
//and move the camera
m_p_oCameraInterface->Translate(m_p_oCamera, &oCoords);
}
//handle the depth movement: add it to the camera's movement
if ( bDepthAutoScroll )
{
oCoords.SetXYZ(stDepthAutoScroll.xX, stDepthAutoScroll.xY, stDepthAutoScroll.xZ);
oCoords.SetAxisSystem(WorldCoordinates);
m_p_oCameraInterface->Translate(m_p_oCamera, &oCoords);
}
// now lets move the mouse to make it stand over the moved object in the view, as before
// the camera moved to recenter the moved object...
Convert3dTo2d(&stNewMouseScreenCoords, &m_stMousePos);
// Call InitDeplacement to reinit the engine functions
GLI_vInitDeplacement(m_hDisplayDevice, m_hDisplayViewport, &stNewMouseScreenCoords, &m_stMousePos);
//remember where the cursor lands after the object move
m_oLastCursorScreenPos = CPoint((int) stNewMouseScreenCoords.xX, (int) stNewMouseScreenCoords.xY);
//if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
VoodooToClient(m_oLastCursorScreenPos);
ClientToScreen(&m_oLastCursorScreenPos);
//redraw everything, since the object or the camera moved, and the hierarchy
//editor did now refresh the display...
GetParentMultiDevice3D()->GetInterface()->fn_vUpdateAll(E_mc_JustDraw);
//remove all mousemove messages that could have occurred during all this
MSG Message;
while ( PeekMessage(&Message, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE) );
//and make windows send a mouse move message to where the cursor is right now
GetCursorPos(&oScreenMousePoint);
SetCursorPos(oScreenMousePoint.x, oScreenMousePoint.y);
//we want to draw the move plane with the center on the moved object (where the 3D mouse is...)
GetParentContact()->GetInterface()->SetMovePlaneCenter(&m_stMousePos);
if (M_bFullScreenEditor())
{
GetParentMultiDevice3D()->DrawEditorObject();
}
}
//---------------------------------------------------------------------------
void DEV_ViewPort3D::OnSetFocus(CWnd* pOldWnd)
{
CPA_BaseObject *p_oCamera;
if (m_bWasInSecondScreen)
{
m_bWasInSecondScreen = FALSE;
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && IsCursorInFirstScreen() &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap())
{
while (ShowCursor(FALSE) >= 0);
SetCapture ();
SetCursorInSecondScreen ();
}
}
// if there is a dialog bar in this multidevice
if (GetParentDialogBar() != NULL)
{
// get the old camera
p_oCamera = GetParentDialogBar()->m_p_oCamera;
// if the new camera is different from the old one
if (p_oCamera != m_p_oCamera)
{
// hide the old camera toolbar
if (p_oCamera != NULL)
M_GetCameraDLL(p_oCamera)->HideDialogBar(p_oCamera);
// set the new camera toolbar
if (m_p_oCameraInterface != NULL)
m_p_oCameraInterface->ShowDialogBar(m_p_oCamera);
}
}
DEV_ViewPort::OnSetFocus(pOldWnd);
}
#ifndef USE_DIRECTX
//--------------------------------------------------------------------
// FBFFBF temporary, to remove when we have rush voodoo cards
void DEV_ViewPort3D::ClientToVoodoo(CPoint &point)
{
CRect oClientSize;
long lWidth,lHeight;
double dTx,dTy;
//voodoo screen size is 512*480
// special case : 2nd screen mode
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
ClientToScreen(&point);
lWidth = GetSystemMetrics (SM_CXFULLSCREEN);
lHeight = GetSystemMetrics (SM_CYFULLSCREEN);
}
else
{
// get the window size
GetClientRect(&oClientSize);
lWidth = oClientSize.Width();
lHeight = oClientSize.Height();
}
// if the window is smaller (x and y) than 512*480, don't touch coordinates!
if (lWidth <= 640 && lHeight <= 480 && !M_bFullScreenEditor())
return;
dTx = ((double)640)/((double)lWidth);
dTy = ((double)480)/((double)lHeight);
// backstretch horizontaly
if (lWidth > 640 || M_bFullScreenEditor())
point.x = (long) (point.x * dTx);
// backstretch verticaly
if (lHeight > 480 || M_bFullScreenEditor())
point.y = (long) (point.y * dTy);
}
//--------------------------------------------------------------------
// FBFFBF temporary, to remove when we have rush voodoo cards
void DEV_ViewPort3D::ClientToVoodooFullScreen(CPoint &point)
{
CRect oClientSize;
long lWidth,lHeight;
double dTx,dTy;
//voodoo screen size is 640*480
// special case : 2nd screen mode
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
ClientToScreen(&point);
lWidth = GetSystemMetrics (SM_CXFULLSCREEN);
lHeight = GetSystemMetrics (SM_CYFULLSCREEN);
}
else
{
// get the window size
GetClientRect(&oClientSize);
lWidth = oClientSize.Width();
lHeight = oClientSize.Height();
}
dTx = ((double)640)/((double)lWidth);
dTy = ((double)480)/((double)lHeight);
// backstretch horizontaly
point.x = (long) (point.x * dTx);
// backstretch verticaly
point.y = (long) (point.y * dTy);
}
//--------------------------------------------------------------------
// FBFFBF temporary, to remove when we have rush voodoo cards
void DEV_ViewPort3D::VoodooToClient(CPoint &point)
{
CRect oClientSize;
long lWidth,lHeight;
double dTx,dTy;
//voodoo screen size is 512*480
// special case : 2nd screen mode
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
lWidth = GetSystemMetrics (SM_CXFULLSCREEN);
lHeight = GetSystemMetrics (SM_CYFULLSCREEN);
}
else
{
// get the window size
GetClientRect(&oClientSize);
lWidth = oClientSize.Width();
lHeight = oClientSize.Height();
}
// if the window is smaller (x and y) than 512*480, don't touch coordinates!
if (lWidth <= 640 && lHeight <= 480 && !M_bFullScreenEditor())
return;
dTx = ((double)640)/((double)lWidth);
dTy = ((double)480)/((double)lHeight);
// backstretch horizontaly
if (lWidth > 640 || M_bFullScreenEditor())
point.x = (long) (point.x / dTx);
// backstretch verticaly
if (lHeight > 480 || M_bFullScreenEditor())
point.y = (long) (point.y / dTy);
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
ScreenToClient(&point);
}
}
//--------------------------------------------------------------------
// ALX 11 temporary, to remove when we have rush voodoo cards
void DEV_ViewPort3D::ClientToVoodoo(GLI_tdst2DVertex & point)
{
CRect oClientSize;
long lWidth,lHeight;
double dTx,dTy;
//voodoo screen size is 512*480
// special case : 2nd screen mode
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
CPoint oPoint ((int)point.xX, (int)point.xY);
ClientToScreen(&oPoint);
point.xX = (float) oPoint.x;
point.xY = (float) oPoint.y;
lWidth = GetSystemMetrics (SM_CXFULLSCREEN);
lHeight = GetSystemMetrics (SM_CYFULLSCREEN);
}
else
{
// get the window size
GetClientRect(&oClientSize);
lWidth = oClientSize.Width();
lHeight = oClientSize.Height();
}
// if the window is smaller (x and y) than 512*480, don't touch coordinates!
if (lWidth <= 640 && lHeight <= 480 && !M_bFullScreenEditor())
return;
dTx = ((double)640)/((double)lWidth);
dTy = ((double)480)/((double)lHeight);
// backstretch horizontaly
if (lWidth > 640 || M_bFullScreenEditor())
point.xX *= (long) dTx;
// backstretch verticaly
if (lHeight > 480 || M_bFullScreenEditor())
point.xY *= (long) dTy;
}
// End ALX 11
//--------------------------------------------------------------------
void DEV_ViewPort3D::PointToMousePos(CPoint point, tdstMousePos* pstMousePos)
{
pstMousePos->stPos = point;
ClientToScreen(&pstMousePos->stPos);
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
{
ClientToVoodoo (point);
pstMousePos->stPos2D.xX = GLI_M_LongToValue(point.x);
pstMousePos->stPos2D.xY = GLI_M_LongToValue(point.y);
VoodooToClient (point);
}
else
{
pstMousePos->stPos2D.xX = GLI_M_LongToValue(point.x);
pstMousePos->stPos2D.xY = GLI_M_LongToValue(point.y);
}
}
#else //USE_DIRECTX
void DEV_ViewPort3D::ClientToVoodoo(CPoint &point)
{
CRect oClientSize;
long lWidth,lHeight;
double dTx,dTy;
GLD_tdstViewportAttributes stViewAttrib; // MR1110
long lScreenWidth,lScreenHeight; // MR1110
#if 0
// special case : 2nd screen mode
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
ClientToScreen(&point);
lWidth = GetSystemMetrics (SM_CXFULLSCREEN);
lHeight = GetSystemMetrics (SM_CYFULLSCREEN);
}
else
{
// get the window size
GetClientRect(&oClientSize);
lWidth = oClientSize.Width();
lHeight = oClientSize.Height();
// JOB 23/01/01 {
if( !GLI_fn_iGetFullScreen() )
{
point.x = (long) (point.x/GLI_fn_fGetRatio());
point.y = (long) (point.y/GLI_fn_fGetRatio());
return;
}
// JOB 23/01/01 }
}
// MR1110
/*// if the window is smaller (x and y) than 512*480, don't touch coordinates!
if (lWidth <= 640 && lHeight <= 480 && !M_bFullScreenEditor())
return;
dTx = ((double)640)/((double)lWidth);
dTy = ((double)480)/((double)lHeight);
// backstretch horizontaly
if (lWidth > 640 || M_bFullScreenEditor())
point.x = (long) (point.x * dTx);
// backstretch verticaly
if (lHeight > 480 || M_bFullScreenEditor())
point.y = (long) (point.y * dTy);*/
GLD_bGetViewportAttributes(m_hDisplayDevice,m_hDisplayViewport,&stViewAttrib);
lScreenWidth = stViewAttrib.dwWidth;
lScreenHeight = stViewAttrib.dwHeight;
dTx = ((double)lScreenWidth)/((double)lWidth);
dTy = ((double)lScreenHeight)/((double)lHeight);
// backstretch horizontaly
point.x = (long) (point.x * dTx);
// backstretch verticaly
point.y = (long) (point.y * dTy);
#else
// get the window size
GetClientRect(&oClientSize);
lWidth = oClientSize.Width();
lHeight = oClientSize.Height();
GLD_bGetViewportAttributes(m_hDisplayDevice,m_hDisplayViewport,&stViewAttrib);
lScreenWidth = 640;//stViewAttrib.dwWidth;
lScreenHeight = 480;//stViewAttrib.dwHeight;
dTx = ((double)lScreenWidth)/((double)lWidth);
dTy = ((double)lScreenHeight)/((double)lHeight);
// backstretch horizontaly
point.x = (long) (point.x * dTx*GLI_gst_DllInfo.f_WidthRatio);
// backstretch verticaly
point.y = (long) (point.y * dTy*GLI_gst_DllInfo.f_HeightRatio);
#endif
}
//--------------------------------------------------------------------
// MT : generalization to all display type
void DEV_ViewPort3D::ClientToVoodooFullScreen(CPoint &point)
{
ClientToVoodoo(point);
}
//--------------------------------------------------------------------
// MT : generalization to all display type
void DEV_ViewPort3D::VoodooToClient(CPoint &point)
{
CRect oClientSize;
long lWidth,lHeight;
double dTx,dTy;
long lScreenWidth,lScreenHeight;
GLD_tdstViewportAttributes stViewAttrib;
#if 0
// special case : 2nd screen mode
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
lWidth = GetSystemMetrics (SM_CXFULLSCREEN);
lHeight = GetSystemMetrics (SM_CYFULLSCREEN);
}
else
{
// get the window size
GetClientRect(&oClientSize);
lWidth = oClientSize.Width();
lHeight = oClientSize.Height();
// JOB 23/01/01 {
if( !GLI_fn_iGetFullScreen() )
{
point.x = (long) (point.x*GLI_fn_fGetRatio());
point.y = (long) (point.y*GLI_fn_fGetRatio());
return;
}
// JOB 23/01/01 }
}
GLD_bGetViewportAttributes(m_hDisplayDevice,m_hDisplayViewport,&stViewAttrib);
lScreenWidth = 640;//stViewAttrib.dwWidth;
lScreenHeight = 480;//stViewAttrib.dwHeight;
dTx = ((double)lScreenWidth)/((double)lWidth);
dTy = ((double)lScreenHeight)/((double)lHeight);
point.x = (long) (point.x / dTx);
point.y = (long) (point.y / dTy);
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
ScreenToClient(&point);
}
#else
// get the window size
GetClientRect(&oClientSize);
lWidth = oClientSize.Width();
lHeight = oClientSize.Height();
GLD_bGetViewportAttributes(m_hDisplayDevice,m_hDisplayViewport,&stViewAttrib);
lScreenWidth = stViewAttrib.dwWidth;
lScreenHeight = stViewAttrib.dwHeight;
dTx = ((double)lScreenWidth)/((double)lWidth);
dTy = ((double)lScreenHeight)/((double)lHeight);
point.x = (long) ((point.x / dTx)/GLI_gst_DllInfo.f_WidthRatio);
point.y = (long) ((point.y / dTy)/GLI_gst_DllInfo.f_HeightRatio);
#endif
}
//--------------------------------------------------------------------
// MT : never used
void DEV_ViewPort3D::ClientToVoodoo(GLI_tdst2DVertex & point)
{
assert(0);
}
// End ALX 11
//--------------------------------------------------------------------
// MT : generalization to all display type
void DEV_ViewPort3D::PointToMousePos(CPoint point, tdstMousePos* pstMousePos)
{
pstMousePos->stPos = point;
ClientToScreen(&pstMousePos->stPos);
ClientToVoodoo (point);
pstMousePos->stPos2D.xX = GLI_M_LongToValue(point.x);
pstMousePos->stPos2D.xY = GLI_M_LongToValue(point.y);
pstMousePos->stPos2D.xOoZ = 1.f; /* Portage Windows 2000 */
}
#endif
//--------------------------------------------------------------------
void DEV_ViewPort3D::OnLButtonDown(UINT nFlags, CPoint point)
{
HIE_tdxHandleToSuperObject hSupObject;
HIE_aDEF_stTabOfPickInfo a_stPickInfo;
ACP_tdxIndex xNbPicked;
tdstMousePos stMousePos;
BOOL bRes;
//CPA2 Gabi Dumitrascu 98/06/29
if (IsCursorInDeadScreen ())
return;
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap())
{
SetFocus();
}
//End CPA2 Gabi Dumitrascu 98/06/29
g_bLButtonDown = TRUE;
m_uiLastMouseState = nFlags;
xNbPicked = 0;
// selection
PointToMousePos(point, &stMousePos);
//send command to camera
if( GetParentContact()->GetInterface()->fn_bMoveCamera() )
if ( m_p_oCameraInterface)
{
bRes = m_p_oCameraInterface->SendLButtonDownToCamera(m_p_oCamera, nFlags, &stMousePos, 0, NULL);
if (bRes)
{
m_p_oGrabCapture();
return; // processed by camera
}
}
//try to pick an object
hSupObject = GetParentMultiDevice3D()->GetEngineWorld();
if (hSupObject != NULL)
{
xNbPicked = HIE_xIsSuperObjectPick(GLI_C_ModePickingFace,m_hDisplayDevice,
m_hDisplayViewport, &stMousePos.stPos2D, hSupObject, a_stPickInfo);
}
m_bObjectIsMoving = xNbPicked > 1;// if more than one objects are pointed by mouse
ClientToScreen(&point);
// not in CameraPickObject mode
if (xNbPicked != 0)
{
InitMouseMove (&a_stPickInfo[0].stPickedObject.aDEF_stDataOfElement[0].stHit, &stMousePos.stPos2D);
}
// Capture the mouse
m_p_oGrabCapture();
if (GetParentContact())
{
if (xNbPicked != 0)
bRes = GetParentContact()->_OnLButtonDown(nFlags, &stMousePos, xNbPicked, a_stPickInfo);
else
bRes = GetParentContact()->_OnLButtonDown(nFlags, &stMousePos, 0, NULL);
}
m_bBeginMove = TRUE;
if (bRes) // processed by contact
{
m_vFakeMouseLButtonDown(point);
return;
}
//send command to camera
if (m_p_oCameraInterface)
{
if (xNbPicked != 0)
bRes = m_p_oCameraInterface->SendLButtonDownToCamera(m_p_oCamera, nFlags, &stMousePos, xNbPicked, a_stPickInfo);
else
bRes = m_p_oCameraInterface->SendLButtonDownToCamera(m_p_oCamera, nFlags, &stMousePos, 0, NULL);
}
if (bRes) // processed by camera
{
//m_vFakeMouseMove(point);
m_vFakeMouseLButtonDown(point);
//m_bObjectIsMoving = xNbPicked > 1;
return;
}
// add your code here
m_vFakeMouseLButtonDown(point);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : m_vFakeMouseLButtonDown
// Date : 97.12.11
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description : It make the calculation for the position of an object when is just selected.
// Author : Viorel Preoteasa
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void DEV_ViewPort3D::m_vFakeMouseLButtonDown(CPoint oScreenMousePoint)
{
GLI_tdst2DVertex stMouseScreenCoords;
tdstMousePos stMousePos;
// GLI_tdst2DVertex stNewMouseScreenCoords, stOldMouseScreenCoords;
MTH3D_tdstVector stMouseInduced3DMove;
const short c_wMaxBorderPercent = 100;
const short c_wScrollBorderPercent = c_wMaxBorderPercent * 90 / 100;
//BOOL bRemoveMouseMessages = TRUE;
//get the current screen client area of the viewport
CRect oScreenViewRect;
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
{
oScreenViewRect.top = 0;
oScreenViewRect.left = 0;
oScreenViewRect.right = GetSystemMetrics (SM_CXFULLSCREEN);
oScreenViewRect.bottom = GetSystemMetrics (SM_CYFULLSCREEN);
}
else
GetWindowRect(oScreenViewRect);
//make the rest of the code believe the cursor is always inside the client boundaries
//if we are moving an object (or trying to, at least)
if ( GetParentContact()->GetInterface()->fn_bGetObjectMouseMoveMode() )
{
oScreenMousePoint.x = max(oScreenMousePoint.x, oScreenViewRect.left);
oScreenMousePoint.x = min(oScreenMousePoint.x, oScreenViewRect.right);
oScreenMousePoint.y = max(oScreenMousePoint.y, oScreenViewRect.top);
oScreenMousePoint.y = min(oScreenMousePoint.y, oScreenViewRect.bottom);
}
//get the position in client coordinates
CPoint oClientMousePoint = oScreenMousePoint;
ScreenToClient(&oClientMousePoint);
//get the position in client voodoo coordinates
CPoint oVoodooMousePoint = oClientMousePoint;
//if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
ClientToVoodoo(oVoodooMousePoint);
//get the relative client area
CRect oClientViewRect(oScreenViewRect);
oClientViewRect.OffsetRect(-oScreenViewRect.left, -oScreenViewRect.top);
//##########################################################
//here the current cursor position is inside the client area
//##########################################################
//fill the stMousePos structure
stMousePos.stPos = oScreenMousePoint;
stMousePos.stPos3D = m_stMousePos;
stMouseScreenCoords.xX = GLI_M_LongToValue(oVoodooMousePoint.x);
stMouseScreenCoords.xY = GLI_M_LongToValue(oVoodooMousePoint.y);
stMousePos. stPos2D.xX = GLI_M_LongToValue(oVoodooMousePoint.x);
stMousePos. stPos2D.xY = GLI_M_LongToValue(oVoodooMousePoint.y);
if ( !GLI_bGetVecteurDeplacement(&stMouseScreenCoords, &stMouseInduced3DMove) ) // no object is moved
{
return;
}
//##################################################
//here and object is picked and moved with the mouse
//##################################################
// the camera is used to move or rotate an object: make the cursor follow the object
// ALX
// The mouse move is constrained into a specific plane selected by SetPlaneForMouseMove
// if the object moved out of the depth autoscroll zone, translate the camera of the object's movement
// get too far or too close
MTH3D_tdstVector stDepthAutoScroll;
BOOL bDepthAutoScroll;
if ( bDepthAutoScroll = ComputeMouseMoveIntoPlane(&stMouseInduced3DMove, &stMouseInduced3DMove) )
stDepthAutoScroll = stMouseInduced3DMove;
else
MTH3D_M_vNullVector(&stDepthAutoScroll);
}
// CPA_Ed_1 FS begin
//---------------------------------------------------------------------------
void DEV_ViewPort3D::OnRButtonUp(UINT nFlags, CPoint point) // FLORIN
{
ACP_tdxIndex xNbPicked;
tdstMousePos stMousePos;
//CPA2 Gabi Dumitrascu 98/06/29
if (IsCursorInDeadScreen ())
return;
//End CPA2 Gabi Dumitrascu 98/06/29
// if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
if(1)
{
ClientToVoodoo (point);
stMousePos.stPos2D.xX = GLI_M_LongToValue(point.x);
stMousePos.stPos2D.xY = GLI_M_LongToValue(point.y);
VoodooToClient(point);
}
else
{
stMousePos.stPos2D.xX = GLI_M_LongToValue(point.x);
stMousePos.stPos2D.xY = GLI_M_LongToValue(point.y);
}
m_uiLastMouseState = nFlags;
ClientToScreen(&point);
stMousePos.stPos = point;
xNbPicked = 0;
if( GetParentContact()->GetInterface()->fn_bMoveCamera() )
if (m_p_oCameraInterface)
if( m_p_oCameraInterface->SendRButtonUpToCamera(m_p_oCamera, nFlags, &stMousePos ) )
return;
if(GetParentContact())
GetParentContact()->_OnRButtonUp(nFlags, NULL);
}
//--------------------------------------------------------------------
void DEV_ViewPort3D::OnLButtonUp(UINT nFlags, CPoint point)
{
tdstMousePos stMousePos;
//CPA2 Gabi Dumitrascu 98/06/29
if (IsCursorInDeadScreen ())
return;
//End CPA2 Gabi Dumitrascu 98/06/29
g_bLButtonDown = FALSE;
m_uiLastMouseState = nFlags;
// ALX 11
#ifndef USE_DIRECTX
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
{
#endif
ClientToVoodoo (point);
stMousePos. stPos2D.xX = GLI_M_LongToValue(point.x);
stMousePos. stPos2D.xY = GLI_M_LongToValue(point.y);
#ifdef USE_DIRECTX
stMousePos. stPos2D.xOoZ = 1.f;
#endif
VoodooToClient (point);
#ifndef USE_DIRECTX
}
else
{
stMousePos. stPos2D.xX = GLI_M_LongToValue(point.x);
stMousePos. stPos2D.xY = GLI_M_LongToValue(point.y);
}
#endif
ClientToScreen(&point);
stMousePos.stPos = point;
//send command to camera
if( GetParentContact()->GetInterface()->fn_bMoveCamera() )
if (m_p_oCameraInterface)
{
if (m_p_oCameraInterface->SendLButtonUpToCamera(m_p_oCamera,nFlags,&stMousePos))
{
m_p_oSurrenderCapture(FALSE);
return;
}
}
GLI_vEndDeplacement();
GetParentContact()->GetInterface()->fn_vLeaveObjectMouseMoveMode();
if(GetParentContact())
{
GetParentContact()->_OnLButtonUp(nFlags, &stMousePos);
//send command to camera
if (m_p_oCameraInterface)
{
if (m_p_oCameraInterface->SendLButtonUpToCamera(m_p_oCamera,nFlags,&stMousePos))
return;
}
}
// Release the mouse
m_p_oSurrenderCapture(FALSE);
if(m_bObjectIsMoving)
M_GetMainWnd()->UpdateStatus((char*)LPCTSTR(m_csMessage), C_STATUSPANE_INFOS, C_STATUS_NORMAL);
DoneMouseMove ();
}
//--------------------------------------------------------------------
void DEV_ViewPort3D::OnRButtonDown(UINT nFlags, CPoint point)
{
HIE_tdxHandleToSuperObject hSupObject;
HIE_aDEF_stTabOfPickInfo a_stPickInfo;
ACP_tdxIndex xNbPicked;
tdstMousePos stMousePos;
BOOL bRes;
//CPA2 Gabi Dumitrascu 98/06/29
if (IsCursorInDeadScreen ())
return;
//End CPA2 Gabi Dumitrascu 98/06/29
// CB
#ifndef USE_DIRECTX
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
{
#endif
ClientToVoodoo (point);
stMousePos.stPos2D.xX = GLI_M_LongToValue(point.x);
stMousePos.stPos2D.xY = GLI_M_LongToValue(point.y);
#ifdef USE_DIRECTX
stMousePos.stPos2D.xOoZ = 1.f;
#endif
VoodooToClient(point);
#ifndef USE_DIRECTX
}
else
{
stMousePos.stPos2D.xX = GLI_M_LongToValue(point.x);
stMousePos.stPos2D.xY = GLI_M_LongToValue(point.y);
}
#endif
m_uiLastMouseState = nFlags;
ClientToScreen(&point);
stMousePos.stPos = point;
xNbPicked = 0;
if( GetParentContact()->GetInterface()->fn_bMoveCamera() )
if (m_p_oCameraInterface)
if( m_p_oCameraInterface->SendRButtonDownToCamera(m_p_oCamera, nFlags, &stMousePos, 0, NULL) )
return;
//try to pick an object
hSupObject = GetParentMultiDevice3D()->GetEngineWorld();
if (hSupObject != NULL)
{
xNbPicked = HIE_xIsSuperObjectPick(GLI_C_ModePickingFace,m_hDisplayDevice,
m_hDisplayViewport, &stMousePos.stPos2D, hSupObject, a_stPickInfo );
}
if(GetParentContact())
{
if (xNbPicked != 0)
bRes = GetParentContact()->_OnRButtonDown(nFlags, &stMousePos, xNbPicked, a_stPickInfo);
else
bRes = GetParentContact()->_OnRButtonDown(nFlags, &stMousePos, 0, NULL);
}
if (bRes) return;
//send command to camera
if (m_p_oCameraInterface)
{
if (xNbPicked != 0)
bRes = m_p_oCameraInterface->SendRButtonDownToCamera(m_p_oCamera, nFlags, &stMousePos, xNbPicked, a_stPickInfo);
else
bRes = m_p_oCameraInterface->SendRButtonDownToCamera(m_p_oCamera, nFlags, &stMousePos, 0, NULL);
}
if (bRes) return;
//add your code here
}
//--------------------------------------------------------------------
void DEV_ViewPort3D::OnLButtonDblClk(UINT nFlags, CPoint point)
{
HIE_tdxHandleToSuperObject hSupObject;
HIE_aDEF_stTabOfPickInfo a_stPickInfo;
ACP_tdxIndex xNbPicked;
tdstMousePos stMousePos;
BOOL bRes;
//CPA2 Gabi Dumitrascu 98/06/29
if (IsCursorInDeadScreen ())
return;
//End CPA2 Gabi Dumitrascu 98/06/29
// CB
#ifndef USE_DIRECTX
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
{
#endif
ClientToVoodoo (point);
stMousePos.stPos2D.xX = GLI_M_LongToValue(point.x);
stMousePos.stPos2D.xY = GLI_M_LongToValue(point.y);
#ifdef USE_DIRECTX
stMousePos.stPos2D.xOoZ = 1.f;
#endif
VoodooToClient(point);
#ifndef USE_DIRECTX
}
else
{
stMousePos.stPos2D.xX = GLI_M_LongToValue(point.x);
stMousePos.stPos2D.xY = GLI_M_LongToValue(point.y);
}
#endif
// ENDCB
m_uiLastMouseState = nFlags;
ClientToScreen(&point);
stMousePos.stPos = point;
// try to pick object
xNbPicked = 0;
hSupObject = GetParentMultiDevice3D()->GetEngineWorld();
if (hSupObject != NULL)
{
xNbPicked = HIE_xIsSuperObjectPick(GLI_C_ModePickingFace,m_hDisplayDevice,
m_hDisplayViewport, &stMousePos.stPos2D, hSupObject,a_stPickInfo);
}
if(GetParentContact())
{
if (xNbPicked != 0)
bRes = GetParentContact()->_OnLButtonDblClk(nFlags, &stMousePos, xNbPicked, a_stPickInfo);
else
bRes = GetParentContact()->_OnLButtonDblClk(nFlags, &stMousePos, 0, NULL);
}
if (bRes) return; // dblclick allready processed by contact
//send command to camera
if (m_p_oCameraInterface)
{
if (xNbPicked != 0)
bRes = m_p_oCameraInterface->SendLButtonDblClkToCamera(m_p_oCamera, nFlags, &stMousePos, xNbPicked, a_stPickInfo);
else
bRes = m_p_oCameraInterface->SendLButtonDblClkToCamera(m_p_oCamera, nFlags, &stMousePos, 0, NULL);
}
if (bRes)
return; // dblclick allready processed by camera
// process here the viewport dblclick
}
// ALX
//=========================================================================
// Function used by OnMouseMove to compute mouse move into the selected plane
// Input : p_stOriginalMouseMove, output : p_stConstrainedMouseMove
// Author : Alexis VAISSE
//=========================================================================
//TODO: remove this declaration when function is publicly declared by GLI
extern "C" MTH_tdxReal GLI_xGetCameraFocalizationPlane(GLI_tdxHandleToCamera hCam);
BOOL DEV_ViewPort3D::ComputeMouseMoveIntoPlane (MTH3D_tdstVector * p_stConstrainedMouseMove,
MTH3D_tdstVector * p_stOriginalMouseMove)
{
MTH3D_tdstVector stTempVector, stMouseXAxe, stMouseYAxe;
GetParentContact()->GetInterface()->GetPlaneForMouseMove(&stMouseXAxe, &stMouseYAxe);
//where is the cursor in 3D space now ?
MTH3D_tdstVector stMovedMousePos;
MTH3D_M_vAddVector(&stMovedMousePos, p_stOriginalMouseMove, &m_stMousePos);
// Get the matrix and inverted matrix of the camera
POS_tdstCompletePosition stCameraMatrix, stInvCameraMatrix;
POS_fn_vSetIdentityMatrix(&stCameraMatrix);
POS_fn_vSetIdentityMatrix(&stInvCameraMatrix);
GLI_xGetCameraMatrix(GetEngineCamera(), &stCameraMatrix);
POS_fn_vInvertIsoMatrix(&stInvCameraMatrix, &stCameraMatrix);
//get a point that is beyond the focal plane of the camera
MTH_tdxReal xCameraFocal = (MTH_tdxReal) (15.0 * GLI_xGetCameraFocalizationPlane(GetEngineCamera()));
//get the 3D position of the camera, because we will nullify it in the matrix later
MTH3D_tdstVector stCamPos, stFocalPos;
POS_fn_vGetTranslationVector(&stInvCameraMatrix, &stCamPos);
//build the 3d position of the focus point (the origin of the focal plane) in camera coordinates
MTH3D_M_vSetVectorElements(&stFocalPos, 0.0, 0.0, xCameraFocal);
//convert the vertex into world coordinates
POS_fn_vMulMatrixVertex(&stFocalPos, &stInvCameraMatrix, &stFocalPos);
//now set the translation vector to null : we work with vectors, so no translation
MTH3D_M_vNullVector(&stTempVector);
POS_fn_vSetTranslationVector(&stInvCameraMatrix, &stTempVector);
POS_fn_vSetTranslationVector(&stCameraMatrix, &stTempVector);
//get the 2 axis of the camera that define the plane for the mouse move, in world coordinates
MTH3D_tdstVector stCamXaxis, stCamYaxis;
POS_fn_vMulMatrixVertex(&stCamXaxis, &stInvCameraMatrix, &stMouseXAxe);
POS_fn_vMulMatrixVertex(&stCamYaxis, &stInvCameraMatrix, &stMouseYAxe);
//get the vector from the camera to the initial position of the object, in world coordinates
MTH3D_tdstVector stCamToStartingPos, stCamCamToStartingPos;
MTH3D_M_vSubVector(&stCamToStartingPos, &m_stMousePos, &stCamPos);
//get a version in camera coordinates
POS_fn_vMulMatrixVertex(&stCamCamToStartingPos, &stCameraMatrix, &stCamToStartingPos);
//get the normalized vector from the focal point to the initial position of the object, in world coordinates
MTH3D_tdstVector stFocalToStartingPos;
MTH3D_M_vSubVector(&stFocalToStartingPos, &m_stMousePos, &stFocalPos);
MTH3D_M_vNormalizeVector(&stFocalToStartingPos, &stFocalToStartingPos);
//in which plane did we start moving ?
tdeMouseMovePlane eMMP = GetParentContact()->GetInterface()->fn_eGetMouseMovePlane();
MTH3D_tdstVector stPlaneNormal;
// if we move the object in the visual plane, or if it is far enough, move it along the standard plane
if ( eMMP == E_mmp_Standard )
{
//we move the object in plane defined by the depth (Z) and width axis of the camera, and the old position
//of the cursor, so build it:
//->the plane is parallel to the camera's Z
MTH3D_M_vCrossProductVector(&stPlaneNormal, &stCamXaxis, &stCamYaxis);
GetParentContact()->GetInterface()->RememberLastMouseMovePlane(&stCamXaxis, &stCamYaxis);
}
else if ( eMMP == E_mmp_Warped )// else move it along a plane that includes the positions of the camera and the moved object
{
//the plane's normal is a vector orthogonal to stCamToStartingPos and the camera's X axis
//->the plane is not parallel to the camera's Z, and includes the object's initial position and the focal point
MTH3D_M_vCrossProductVector(&stPlaneNormal, &stCamXaxis, &stFocalToStartingPos);
GetParentContact()->GetInterface()->RememberLastMouseMovePlane(&stCamXaxis, &stFocalToStartingPos);
}
else
ASSERT(FALSE);
//now define the plane's normal
MTH3D_M_vNormalizeVector(&stPlaneNormal, &stPlaneNormal);
GLI_tdstEqPlan stPlane;
//the plane always includes the initial position of the moved object
GLI_vDefinePlanByNormale(&stPlane, &stPlaneNormal, &m_stMousePos);
//if we find where a line defined by the original and projected positions of the mouse
BOOL bDepthAutoscroll = FALSE;
if ( GLI_bIntersectionPlanDroite(&stPlane, &stCamPos, &stMovedMousePos, &stTempVector) )
{
//compute the vector from the initial position to the newly computed ending position of the mouse
MTH3D_M_vSubVector(p_stConstrainedMouseMove, &stTempVector, &m_stMousePos);
//get the vector from the camera to the ending position of the mouse
MTH3D_tdstVector stCamToEndingPos;
MTH3D_M_vSubVector(&stCamToEndingPos, &stTempVector, &stCamPos);
//convert it into camera coordinates
POS_fn_vMulMatrixVertex(&stCamToEndingPos, &stCameraMatrix, &stCamToEndingPos);
//cancel moves that are behind the camera
if ( stCamToEndingPos.xZ < 0.0 )
{
MTH3D_M_vNullVector(p_stConstrainedMouseMove);
}
else
{
MTH_tdxReal xDeltaZ = stCamToEndingPos.xZ - stCamCamToStartingPos.xZ;
bDepthAutoscroll = xDeltaZ > 0.0
? (stCamToEndingPos.xZ > xCameraFocal + 50.0)
: (stCamToEndingPos.xZ < xCameraFocal);
bDepthAutoscroll = bDepthAutoscroll && (stMouseYAxe.xZ ? TRUE : FALSE);
if ( bDepthAutoscroll )
{
MTH_tdxReal xNorm = MTH3D_M_xNormVector(p_stConstrainedMouseMove);
if ( xNorm > 1.0 )
MTH3D_M_vNormalizeVector(p_stConstrainedMouseMove, p_stConstrainedMouseMove);
}
if(m_bBeginMove)
{
m_stCamToEndingPos = stCamToEndingPos;
m_stInitMousePos = stTempVector;
m_bBeginMove = FALSE;
}
}
}
else
MTH3D_M_vNullVector(p_stConstrainedMouseMove);
return bDepthAutoscroll;
}
// End ALX
// ALX
//=========================================================================
// Function used by OnMouseMove
// Convert 3D-coordinates to a 2D-position into the window
// Author : Alexis VAISSE
//=========================================================================
#ifndef USE_DIRECTX
void DEV_ViewPort3D::Convert3dTo2d (GLI_tdst2DVertex * p_stDest , MTH3D_tdstVector * p_stSource)
{
// Get the matrix of the camera
POS_tdstCompletePosition stCameraMatrix;
POS_fn_vSetIdentityMatrix(&stCameraMatrix);
GLI_xGetCameraMatrix (GetEngineCamera () , & stCameraMatrix);
MTH3D_tdstVector Temp;
POS_fn_vMulMatrixVertex(&Temp,&stCameraMatrix,p_stSource);
GLI_xProjection (GetEngineCamera(),&Temp,p_stDest);
// ALX 11
// MT 03/08/98 {
/*
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
{
p_stDest -> xX -= (float)(3.0 * pow(2,(23-5)));
p_stDest -> xY -= (float)(3.0 * pow(2,(23-5)));
}
*/
// End MT 03/08/98 }
// End ALX 11
}
// End ALX
#else
void DEV_ViewPort3D::Convert3dTo2d (GLI_tdst2DVertex * p_stDest , MTH3D_tdstVector * p_stSource)
{
/* Begin Portage Windows 2000 */
MTH3D_tdstVector stCamCoords;
GLI_tdstCamera *p_stCam = GetEngineCamera();
// Convert from world space to camera space
POS_fn_vMulMatrixVertex( &stCamCoords, &p_stCam->stMatrix, p_stSource );
// Project on screen
GLI_xProjection( p_stCam, &stCamCoords, p_stDest );
/* End Portage Windows 2000 */
}
#endif //
//--------------------------------------------------------------------
//NOTE: oMousePoint is relative to the client area, NOT the screen!
/*
void DEV_ViewPort3D::OnMouseMove(UINT nFlags, CPoint oMousePoint)
{
m_uiLastMouseState = nFlags;
const short wScrollLimits = 10;
// ALX
CPoint oMousePosAtBegin = oMousePoint;
// End ALX
CRect oViewRect;
GetWindowRect(oViewRect);
// try to keep the cursor inside the viewport boundaries if the mouse is used to move an object or
// to change the camera orientation/position
//no longer necessary in move object mode: the handler will cancel any cursor position outside
//the client area
// not in camera mousemove mode
if ( !m_bMouseMoveFakerIsOn && GetParentContact() )
{
MTH3D_tdstVector stMouseInduced3DMove;
GLI_tdst2DVertex stMouseScreenCoords;
tdstMousePos stMousePos;
// ALX 11
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
{
ClientToVoodoo (oMousePoint);
stMouseScreenCoords.xX = GLI_M_LongToValue(oMousePoint.x);
stMouseScreenCoords.xY = GLI_M_LongToValue(oMousePoint.y);
stMousePos. stPos2D.xX = GLI_M_LongToValue(oMousePoint.x);
stMousePos. stPos2D.xY = GLI_M_LongToValue(oMousePoint.y);
VoodooToClient (oMousePoint);
}
else
{
stMouseScreenCoords.xX = GLI_M_LongToValue(oMousePoint.x);
stMouseScreenCoords.xY = GLI_M_LongToValue(oMousePoint.y);
stMousePos. stPos2D.xX = GLI_M_LongToValue(oMousePoint.x);
stMousePos. stPos2D.xY = GLI_M_LongToValue(oMousePoint.y);
}
// End ALX 11
ClientToScreen(&oMousePoint);
stMousePos.stPos = oMousePoint;
stMousePos.stPos3D = m_stMousePos;
// if the mousemove-faker timer is not enabled, send the event to the contact
if ( GLI_bGetVecteurDeplacement(&stMouseScreenCoords, &stMouseInduced3DMove) )
{
// the camera is used to move or rotate an object: make the cursor follow the object
// ALX
// The mouse move is constrained into a specific plane selected by SetPlaneForMouseMove
ComputeMouseMoveIntoPlane (& stMouseInduced3DMove , & stMouseInduced3DMove);
// Send the 3D vector to the frame base.
// the given mouse pos is *before* the movement!
if ( GetParentContact()->_OnMouseMove(nFlags, &stMousePos, &stMouseInduced3DMove) )
// we update the 3D-position of the mouse
MTH3D_M_vAddVector (&m_stMousePos, &m_stMousePos, &stMouseInduced3DMove);
}
else
{
GetParentContact()->_OnMouseMove(nFlags, &stMousePos, NULL);
if (m_p_oCameraInterface)
m_p_oCameraInterface->SendMouseMoveToCamera(m_p_oCamera,nFlags, &stMousePos, NULL);
}
}
MSG stMsg;
while(::PeekMessage(&stMsg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE));
// other mousemove processing here
}
*/
void DEV_ViewPort3D::OnMouseMove(UINT nFlags, CPoint oMousePoint)
{
m_uiLastMouseState = nFlags;
ACP_tdxIndex xNbPicked;
tdstMousePos stMousePos;
CPoint point=oMousePoint;
//if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
if(1)
{
ClientToVoodoo (point);
stMousePos.stPos2D.xX = GLI_M_LongToValue(point.x);
stMousePos.stPos2D.xY = GLI_M_LongToValue(point.y);
VoodooToClient(point);
}
else
{
stMousePos.stPos2D.xX = GLI_M_LongToValue(point.x);
stMousePos.stPos2D.xY = GLI_M_LongToValue(point.y);
}
m_uiLastMouseState = nFlags;
ClientToScreen(&point);
stMousePos.stPos = point;
xNbPicked = 0;
if( GetParentContact()->GetInterface()->fn_bMoveCamera() )
if (m_p_oCameraInterface)
if( m_p_oCameraInterface->SendMouseMoveToCamera(m_p_oCamera,nFlags, &stMousePos, NULL) )
return;
ClientToScreen(&oMousePoint);
m_vFakeMouseMove(oMousePoint);
// other mousemove processing here
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
LONG DEV_ViewPort3D::OnDragDropEnd(WPARAM wparam, LPARAM lparam)
{
BOOL bRes;
//CPA2 Gabi Dumitrascu 98/07/13
g_bDragDropActivate = FALSE;
//End CPA2 Gabi Dumitrascu 98/07/13
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap())
{
SetFocus();
}
if(GetParentContact())
{
bRes = GetParentContact()->_OnDragDropEnd(wparam,lparam);
if (bRes) return NULL; //contact allready processed the key
}
// other dragdrop processing here
return NULL;
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
LONG DEV_ViewPort3D::OnDragDropLooseFocus(WPARAM wparam, LPARAM lparam)
{
BOOL bRes;
//CPA2 Gabi Dumitrascu 98/07/13
g_bDragDropActivate = FALSE;
//End CPA2 Gabi Dumitrascu 98/07/13
if(GetParentContact())
{
bRes = GetParentContact()->_OnDragDropLooseFocus(wparam,lparam);
if (bRes) return NULL; //contact allready processed the key
}
// other dragdrop processing here
return NULL;
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
LONG DEV_ViewPort3D::OnDragDropGainFocus(WPARAM wparam, LPARAM lparam)
{
BOOL bRes;
//CPA2 Gabi Dumitrascu 98/07/13
g_bDragDropActivate = TRUE;
//End CPA2 Gabi Dumitrascu 98/07/13
if(GetParentContact())
{
bRes = GetParentContact()->_OnDragDropGainFocus(wparam,lparam);
if (bRes) return NULL; //contact allready processed the key
}
// other dragdrop processing here
return NULL;
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
LONG DEV_ViewPort3D::OnDragDropMove(WPARAM wparam, LPARAM lparam)
{
BOOL bRes;
if (M_bFullScreenEditor())
{
GetParentMultiDevice3D()->DrawEditorObject();
// GetParentMultiDevice3D()->GetInterface()->fn_vUpdateAll(E_mc_JustDraw);
}
if(GetParentContact())
{
bRes = GetParentContact()->_OnDragDropMove(wparam,lparam);
if (bRes) return NULL; //contact allready processed the key
}
// other dragdrop processing here
return NULL;
}
//====================================================================
//
// VIEWPORT 3D KEYBOARD
//
//====================================================================
//--------------------------------------------------------------------
//CPA2 Corneliu Babiuc (Alt Key) 14-05-98
inline void DEV_ViewPort3D::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
OnKeyDown(nChar, nRepCnt, nFlags);
}
inline void DEV_ViewPort3D::OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
OnKeyUp(nChar, nRepCnt, nFlags);
}
//END CPA2 Corneliu Babiuc (Alt Key) 19-05-98
//--------------------------------------------------------------------
void DEV_ViewPort3D::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
BOOL bRes;
if (M_GetMainApp()->m_bEditorsAreActive == FALSE)
return;
switch ( nChar )
{
case VK_SHIFT:
m_uiLastMouseState |= MK_SHIFT;
break;
case VK_CONTROL:
m_uiLastMouseState |= MK_CONTROL;
break;
default:
break;
}
if(GetParentContact())
{
bRes = GetParentContact()->_OnKeyDown(nChar, nRepCnt, nFlags);
if (bRes) return; //contact allready processed the key
}
//CPA2 Corneliu Babiuc 13-05-98
//get the selected object
CPA_SuperObject * pSelected = GetParentMultiDevice3D()->GetInterface()->GetCurrentWorld()->GetSingleSelection();
CPA_Interface * pInterface = GetParentContact() ? GetParentContact()->GetInterface() : NULL;
//END CPA2 Corneliu Babiuc 13-05-98
switch(M_GetMainApp()->mp_oDevKeyboard->mfn_uwKeyToAction(nChar))
{
//CPA2 Corneliu Babiuc 13-05-98
// object drawing flags
case KA_CancelAllDrawingFlags:
if ( pInterface )
{
pInterface->fn_vCancelAllDrawingFlags();
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
case KA_IgnoreDrawingFlags:
pInterface->SetIgnoreFlags(TRUE);
return;
case KA_NormalObject:
if ( pSelected && pInterface)
{
pSelected->SetDrawingFlag(E_df_Normal);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
case KA_GridedObject:
if ( pSelected && pInterface)
{
pSelected->SetDrawingFlag(E_df_Grided);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
case KA_WiredObject:
if ( pSelected && pInterface)
{
pSelected->SetDrawingFlag(E_df_Wired);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
// object parameters
case KA_ShowObjectAxis:
if ( pSelected && pInterface)
{
pSelected->SetDrawnAxis(!pSelected->fn_bIsAxisDrawn());
pInterface -> fn_vUpdateAll(E_mc_JustDraw);
}
return;
case KA_BVObject:
if ( pSelected && pInterface)
{
pSelected->SetDrawingFlag(E_df_BoundingV);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
//objects centers
case KA_ShowMainCenters:
if ( pInterface )
pInterface->SetShowcenter(2);
return;
case KA_ShowAllCenters:
if ( pInterface )
pInterface->SetShowcenter(1);
return;
case KA_ShowNoCenter:
if ( pInterface )
pInterface->SetShowcenter(0);
return;
// world drawing flags
case KA_NormalWorld:
if ( pInterface )
pInterface -> fn_vChangeWorldMask(GLI_C_lIsTextured, !pInterface->fn_bWorldIsTextured());
return;
case KA_GridedWorld:
if ( pInterface )
pInterface->fn_vChangeWorldMask(GLI_C_lIsNotGrided, pInterface->fn_bWorldIsGrided());
return;
case KA_WiredWorld:
if ( pInterface )
pInterface->fn_vChangeWorldMask(GLI_C_lIsNotWired, pInterface->fn_bWorldIsWired());
return;
// world display mode
case KA_WorldSectors:
if ( pInterface )
pInterface->GetSpecificInterface()->fn_vOnChangeDisplayMode(E_dm_DrawWorld);
return;
case KA_VisibleSectors:
if ( pInterface )
pInterface->GetSpecificInterface()->fn_vOnChangeDisplayMode(E_dm_DrawVisibleSectors);
return;
case KA_CurrentSector:
if ( pInterface )
pInterface->GetSpecificInterface()->fn_vOnChangeDisplayMode(E_dm_DrawOnlyCurrentSector);
return;
case KA_CollisionMap:
if ( pInterface )
pInterface->GetSpecificInterface()->fn_vOnChangeDisplayMode(E_dm_DrawCollisionMap);
return;
// bounding volumes
case KA_SectorsBV:
if ( pInterface )
{
pInterface->fn_vSetBVMode(E_bv_Sectors);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
case KA_ActorsBV:
if ( pInterface )
{
pInterface->fn_vSetBVMode(E_bv_Actors);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
case KA_ObjectsBV:
if ( pInterface )
{
pInterface->fn_vSetBVMode(E_bv_Objects);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
case KA_NoBV:
if ( pInterface )
{
pInterface->fn_vSetBVMode(E_bv_None);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
// colors
case KA_SelectBackgroundColor:
{
CColorDialog oColorDialog;
COLORREF stColor;
// display color dialog
if (oColorDialog.DoModal() == IDOK)
{
// get selected color
stColor = oColorDialog.GetColor();
// update controls
GetParentMultiDevice3D()->SetBackgroundColor(stColor);
}
return;
}
// selection
case KA_CancelSelection:
pInterface->fn_vCancelCurrentSelection();
return;
case KA_FullSelection:
pInterface->SetFullSelect(!pInterface->fn_bFullSelect());
pInterface->fn_vUpdateAll(E_mc_UpdateDialog);
pInterface->GetFrameBase()->m_oGeneralDialogBar.fn_vUpdateFullSelect(pInterface->fn_bFullSelect());
return;
case KA_DeltaSelection:
pInterface->SetDeltaSelect(!pInterface->fn_bDeltaSelect());
pInterface->GetFrameBase()->m_oGeneralDialogBar.fn_vUpdateDeltaSelect(pInterface->fn_bDeltaSelect());
return;
// pyramidal selection
case KA_FixedDepthPyramid:
pInterface->SetFixedDepthPyramid(!pInterface->GetFixedDepthPyramid());
return;
case KA_RealTimePyramid:
pInterface->SetRealTimePyramid(!pInterface->GetRealTimePyramid());
return;
// status bar
case KA_DisplayInstanceInfo:
pInterface->SetStatusBarMode(E_sb_InstanceInfo);
fn_vUpdateStatusBarMessage();
return;
case KA_DisplayInstanceToCam:
pInterface->SetStatusBarMode(E_sb_InstanceToCamera);
fn_vUpdateStatusBarMessage();
return;
case KA_DisplayCameraInfo:
pInterface->SetStatusBarMode(E_sb_CameraInfo);
fn_vUpdateStatusBarMessage();
return;
case KA_DisplayDistance:
pInterface->SetDisplayDistance(TRUE);
return;
// options
case KA_ScaleEditorObjects:
if (pInterface)
{
if (pInterface->fn_bIsScaleActive())
{
pInterface->fn_vReScale();
pInterface->fn_bSetScaleActive(FALSE);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
else
{
pInterface->fn_vScale();
pInterface->fn_vUpdatePositions();
pInterface->fn_vScale();
pInterface->fn_bSetScaleActive(TRUE);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
}
return;
case KA_ShowNoAxis:
if (pInterface && GetCameraInterface())
{
GetCameraInterface()->SetReferentialDisplayMode(DisplayNone);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
case KA_ShowAxisLeft:
if (pInterface && GetCameraInterface())
{
GetCameraInterface()->SetReferentialDisplayMode(DisplayDownLeft);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
case KA_ShowAxisRight:
if (pInterface && GetCameraInterface())
{
GetCameraInterface()->SetReferentialDisplayMode(DisplayDownRight);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
case KA_Borders:
if ( pInterface )
{
CPA_DLLBase *p_oSectorInterface = pInterface->GetMainWorld()->GetObjectDLLWithName(C_szDLLSectorName);
p_oSectorInterface->_OnSubMenuCommand(NULL, KA_Borders);
}
return;
case KA_ComputeCenters:
if (pInterface)
{
pInterface->fn_vComputeSuperObjectsCenters(NULL);
pInterface->fn_vUpdateAll(E_mc_JustDraw);
}
return;
case KA_ForceMousePos:
// show the cursos
while (ShowCursor(TRUE) < 0);
//disable the confine of the cursor
ReleaseCapture ();
ClipCursor (NULL);
// force cursor in first screen
SetCursorInFirstScreen ();
// reinit flags
m_bWasInSecondScreen = FALSE;
g_bLButtonDown = FALSE;
// redraw world
GetParentContact()->GetDevice()->DrawEditorObject();
return;
}
//send key to camera
if (m_p_oCameraInterface && m_p_oCameraInterface->SendKeyDownToCamera(m_p_oCamera,nChar,nRepCnt,nFlags))
return;
}
//--------------------------------------------------------------------
void DEV_ViewPort3D::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
BOOL bRes;
if (M_GetMainApp()->m_bEditorsAreActive == FALSE)
return;
switch ( nChar )
{
case VK_SHIFT:
m_uiLastMouseState &= ~MK_SHIFT;
break;
case VK_CONTROL:
m_uiLastMouseState &= ~MK_CONTROL;
break;
default:
break;
}
if(GetParentContact())
{
bRes = GetParentContact()->_OnKeyUp(nChar, nRepCnt, nFlags);
if (bRes) return; //contact allready processed the key
}
//send key to camera
if (m_p_oCameraInterface && m_p_oCameraInterface->SendKeyUpToCamera(m_p_oCamera,nChar,nRepCnt,nFlags))
return;
// treat viewport key here
CPA_Interface * pInterface = GetParentContact() ? GetParentContact()->GetInterface() : NULL;
switch(M_GetMainApp()->mp_oDevKeyboard->mfn_uwKeyToAction(nChar))
{
// drawing flag
case KA_IgnoreDrawingFlags:
pInterface->SetIgnoreFlags(FALSE);
return;
// status bar
case KA_DisplayDistance:
pInterface->SetDisplayDistance(FALSE);
return;
}
}
//=================================================================
// MESSAGES FROM TOOLBAR
//=================================================================
/*===========================================================================
call each timer vector handler in turn
=========================================================================*/
void DEV_ViewPort3D::OnTimer(UINT uiIdEvent)
{
}
/*===========================================================================
find the name of the selected instance
=========================================================================*/
CString DEV_ViewPort3D::fn_csGetSelectedInstanceName( ACP_tdxIndex xIndex, HIE_tdstPickInfo*p_stPickInfo, tdstMousePos*p_stMousePos )
{
CPA_SuperObject * p_csSelectedObject;
BOOL bDummy;
p_csSelectedObject = GetParentContact()->GetInterface()->GetPickingSelection( E_sm_SelectNormal, xIndex, p_stPickInfo, p_stMousePos, &bDummy );
if( p_csSelectedObject && p_csSelectedObject->GetObject() )
return p_csSelectedObject->GetObject()->GetName();
else
return "";
}
void fn_vConvertRotateMatrixToAngles (MTH3D_tdstVector *pAngles, POS_tdstCompletePosition *pMatrix)
{
#define M(a,b) (MTH3D_M_xGet##b##ofVector(&stVect##a))
MTH3D_tdstVector stVectI,stVectJ,stVectK;
POS_fn_vGetRotationMatrix(pMatrix,&stVectI,&stVectJ,&stVectK);
// Calculate the 3 angles
GLI_tdxValue Divide = (float) sqrt(M(I,X)*M(I,X)+M(I,Y)*M(I,Y));
pAngles->xX = (float) asin (M(J,Z) / Divide); // We get an angle between -90<39> and 90<39>
pAngles->xZ = (float) asin (M(I,Y) / Divide); // We get an angle between -90<39> and 90<39>
pAngles->xY = (float) asin (M(I,Z)); // We get an angle between -90<39> and 90<39>
if (M(K,Z) < 0)
{
if (pAngles->xX >= 0)
pAngles->xX = GLI_M_PI - pAngles->xX; // Angle between 90<39> and 180<38>
else
pAngles->xX = - GLI_M_PI - pAngles->xX; // Angle between -180<38> and -90<39>
}
if (M(I,X) < 0)
{
if (pAngles->xZ >= 0)
pAngles->xZ = GLI_M_PI - pAngles->xZ; // Angle between 90<39> and 180<38>
else
pAngles->xZ = - GLI_M_PI - pAngles->xZ; // Angle between -180<38> and -90<39>
}
if (M(I,X) < 0 && M(K,Z) < 0)
{
if (pAngles->xY >= 0)
pAngles->xY = GLI_M_PI - pAngles->xY; // Angle between 90<39> and 180<38>
else
pAngles->xY = - GLI_M_PI - pAngles->xY; // Angle bewteen -180<38> and -90<39>
if (pAngles->xX >= 0)
pAngles->xX -= GLI_M_PI;
else
pAngles->xX += GLI_M_PI;
if (pAngles->xZ >= 0)
pAngles->xZ -= GLI_M_PI;
else
pAngles->xZ += GLI_M_PI;
}
// Convert from radians to degrees
const GLI_tdxValue ConvertToDegrees = 180 / GLI_M_PI;
MTH3D_M_vMulScalarVector (pAngles,ConvertToDegrees, pAngles);
}
/*===========================================================================
update status bar with appropriate message
=========================================================================*/
void DEV_ViewPort3D::fn_vUpdateStatusBarMessage (void)
{
GEO_tdxHandleToMatrix hGlobalMatrix;
MTH3D_tdstVector stPosition;
MTH3D_tdstVector stRotation;
CPA_Interface *pInterface;
pInterface = GetParentContact()->GetInterface();
// display distance : special mode
if (pInterface->GetDisplayDistance())
{
if ((m_csSelectedInstance == "") || (m_csPickedInstance == ""))
m_csMessage.Format("");
else
m_csMessage.Format("%s ==> %s [ Vector : %5.2f, %5.2f, %5.2f ] [ Distance: %5.2f ]",
m_csSelectedInstance,
m_csPickedInstance,
m_stDistance.xX, m_stDistance.xY, m_stDistance.xZ,
MTH3D_M_xNormVector(&m_stDistance));
}
else if (pInterface->GetSpecificInterface()->fn_bHasValidWorld())
{
switch (pInterface->GetStatusBarMode())
{
case E_sb_InstanceInfo:
if (m_csSelectedInstance == "")
m_csMessage.Format("");
else if (MTH3D_M_xNormVector(&m_stMoveVector) != 0.f)
// Begin Silviu Simen 06 August 1998 Update Sector Status
// m_csMessage.Format("%s [ Position: %5.2f, %5.2f, %5.2f ] [ Move: %5.2f, %5.2f, %5.2f ] [ Distance: %5.2f ]",
// m_csSelectedInstance,
// m_stPosition.xX, m_stPosition.xY, m_stPosition.xZ,
// m_stMoveVector.xX, m_stMoveVector.xY, m_stMoveVector.xZ,
// MTH3D_M_xNormVector(&m_stMoveVector));
m_csMessage.Format("%s [ Position: %5.2f, %5.2f, %5.2f ] [ Move: %5.2f, %5.2f, %5.2f ] [ Distance: %5.2f ] [ Sector: %s ]",
m_csSelectedInstance,
m_stPosition.xX, m_stPosition.xY, m_stPosition.xZ,
m_stMoveVector.xX, m_stMoveVector.xY, m_stMoveVector.xZ,
MTH3D_M_xNormVector(&m_stMoveVector),
pInterface->GetSpecificInterface()->GetCurrentSectorFromPos(&m_stPosition)->GetName());
else
// m_csMessage.Format("%s [ Position: %5.2f, %5.2f, %5.2f ]",
// m_csSelectedInstance,
// m_stPosition.xX, m_stPosition.xY, m_stPosition.xZ);
m_csMessage.Format("%s [ Position: %5.2f, %5.2f, %5.2f ] [ Sector: %s ]",
m_csSelectedInstance,
m_stPosition.xX, m_stPosition.xY, m_stPosition.xZ,
pInterface->GetSpecificInterface()->GetCurrentSectorFromPos(&m_stPosition)->GetName());
// End Silviu Simen 06 August 1998 Update Sector Status
break;
case E_sb_InstanceToCamera:
if (m_csSelectedInstance == "")
m_csMessage.Format("");
else
m_csMessage.Format("%s [ Position / Camera: %5.2f, %5.2f, %5.2f ] [ Distance / Camera: %5.2f ]",
m_csSelectedInstance,
m_stCameraDistance.xX, m_stCameraDistance.xY, m_stCameraDistance.xZ,
MTH3D_M_xNormVector(&m_stCameraDistance));
break;
case E_sb_CameraInfo:
hGlobalMatrix = HIE_fn_hGetSuperObjectMatrix(m_p_oCameraSO->GetStruct());
POS_fn_vGetTranslationVector(hGlobalMatrix, &stPosition);
fn_vConvertRotateMatrixToAngles(&stRotation, hGlobalMatrix);
m_csMessage.Format("CAMERA [ Mode: %s ] [ Position: %5.2f, %5.2f, %5.2f ] [ Rotation: %5.2f, %5.2f, %5.2f ]",
(m_p_oCameraInterface->GetTargetType(m_p_oCamera) == tNone) ? "Free" : "Targeted",
stPosition.xX, stPosition.xY, stPosition.xZ,
stRotation.xX, stRotation.xY, stRotation.xZ);
break;
}
}
else
m_csMessage.Format("");
M_GetMainWnd()->UpdateStatus((char*)LPCTSTR(m_csMessage), C_STATUSPANE_INFOS, C_STATUS_NORMAL);
}
/*===========================================================================
update message parameters
=========================================================================*/
void DEV_ViewPort3D::SetPosition (MTH3D_tdstVector *pNewPos)
{
MTH3D_tdstVector stPosition;
MTH3D_M_vCopyVector(&m_stPosition, pNewPos);
POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectMatrix(m_p_oCameraSO->GetStruct()), &stPosition);
MTH3D_M_vSubVector(&m_stCameraDistance, &m_stPosition, &stPosition);
}
void DEV_ViewPort3D::SetMoveVector (MTH3D_tdstVector *pNewMove)
{
MTH3D_M_vCopyVector(&m_stMoveVector, pNewMove);
}
void DEV_ViewPort3D::AddtoMoveVector (MTH3D_tdstVector *pNewMove)
{
MTH3D_M_vAddVector(&m_stMoveVector, &m_stMoveVector, pNewMove);
}
void DEV_ViewPort3D::SetDistanceVector (MTH3D_tdstVector *pDist)
{
MTH3D_M_vCopyVector(&m_stDistance, pDist);
}
void DEV_ViewPort3D::SetDistanceToCamera (MTH3D_tdstVector *pDist)
{
MTH3D_M_vCopyVector(&m_stCameraDistance, pDist);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : IsCursorInDeadScreen
// Date : 98/06/29
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Gabi Dumitrascu - CPA
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL DEV_ViewPort3D::IsCursorInDeadScreen ()
{
BOOL bCursorInDeadScreen = FALSE;
if (GetParentContact()->GetInterface()->fn_bGetAutomaticSwap ())
bCursorInDeadScreen = M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && IsCursorInFirstScreen ();
return bCursorInDeadScreen;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : IsCursorInFirstScreen
// Date : 98/07/09
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Gabi Dumitrascu - CPA
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL DEV_ViewPort3D::IsCursorInFirstScreen ()
{
CPA_Interface *pInterface = GetParentContact()->GetInterface();
ASSERT (pInterface);
return M_GetMainApp()->m_bCursorInFirstScreen;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : SetCursorInFirstScreen
// Date : 98/07/09
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Gabi Dumitrascu - CPA
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void DEV_ViewPort3D::SetCursorInFirstScreen ()
{
CPA_Interface *pInterface = GetParentContact()->GetInterface();
ASSERT (pInterface);
M_GetMainApp()->m_bCursorInFirstScreen = TRUE;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : SetCursorInSecondScreen
// Date : 98/07/09
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Gabi Dumitrascu - CPA
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void DEV_ViewPort3D::SetCursorInSecondScreen ()
{
CPA_Interface *pInterface = GetParentContact()->GetInterface();
ASSERT (pInterface);
M_GetMainApp()->m_bCursorInFirstScreen = FALSE;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_vChangeCursorFrom1To2
// Date : 98/07/09
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Gabi Dumitrascu - CPA
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void DEV_ViewPort3D::mfn_vChangeCursorFrom1To2 (CPoint &rptMouse, tdeForceSwap eSwapMode, BOOL bVerticalSwap)
{
//ptMouse in screen coordinates
CRect rcDeadScreen;
GetWindowRect (rcDeadScreen);
while (ShowCursor(FALSE) >= 0);
SetCapture ();
m_bIsVerticalSwap = FALSE;
ClientToScreen(&rptMouse);
if (bVerticalSwap)
rptMouse.y = /*rcDeadScreen.top + */EDGE_TOLERANCE + 1;
else
{
if (eSwapMode == eSwapLeft)
rptMouse.x = rcDeadScreen.right - EDGE_TOLERANCE - 1;
else
rptMouse.x = /*rcDeadScreen.left + */EDGE_TOLERANCE + 1;
rptMouse.y -= ( rcDeadScreen.top - EDGE_TOLERANCE - 1);
}
SetCursorPos (rptMouse.x, rptMouse.y);
SetCursorInSecondScreen ();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_vChangeCursorFrom2To1
// Date : 98/07/09
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Gabi Dumitrascu - CPA
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void DEV_ViewPort3D::mfn_vChangeCursorFrom2To1 (CPoint &rptMouse, tdeForceSwap eSwapMode, BOOL bVerticalSwap)
{
//ptMouse in screen coordinates
CRect rcViewRect;
GetWindowRect (rcViewRect);
ScreenToClient(&rptMouse);
// vertical swap
if (bVerticalSwap)
rptMouse.y = rcViewRect.top;
// horizontal swap
else
{
if (eSwapMode == eSwapLeft)
rptMouse.x = /*rcViewRect.left + */EDGE_TOLERANCE + 1;
else
rptMouse.x = rcViewRect.right - EDGE_TOLERANCE - 1;
rptMouse.y += (rcViewRect.top + EDGE_TOLERANCE + 1);
}
SetCursorPos (rptMouse.x, rptMouse.y);
while (ShowCursor(TRUE) < 0);
//disable the confine of the cursor
ReleaseCapture ();
ClipCursor (NULL);
SetCursorInFirstScreen ();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : OnNcMouseMove
// Date : 98/07/13
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Gabi Dumitrascu - CPA
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void DEV_ViewPort3D::OnNcMouseMove (UINT nHitTest, CPoint point)
{
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap () && nHitTest == HTBORDER)
{
POINT ptMouse;
GetCursorPos (&ptMouse);
const int nScreenWidth = GetSystemMetrics (SM_CXFULLSCREEN);
tdeForceSwap eSwapMode = GetParentContact()->GetInterface()->fn_eGetForceSwap ();
if (eSwapMode == eSwapLeft || eSwapMode == eSwapBoth)
{
if (ptMouse.x <= EDGE_TOLERANCE)
{
CRect rcViewRect;
GetWindowRect (rcViewRect);
// ptMouse.y = ptMouse.y < rcViewRect.top ? rcViewRect.top : ptMouse.y;
// ptMouse.y = ptMouse.y > rcViewRect.bottom ? rcViewRect.bottom : ptMouse.y;
mfn_vChangeCursorFrom1To2 (CPoint (ptMouse), eSwapLeft);
}
}
if (eSwapMode == eSwapRight || eSwapMode == eSwapBoth)
{
if (ptMouse.x >= (nScreenWidth - EDGE_TOLERANCE))
{
CRect rcViewRect;
GetWindowRect (rcViewRect);
// ptMouse.y = ptMouse.y < rcViewRect.top ? rcViewRect.top : ptMouse.y;
// ptMouse.y = ptMouse.y > rcViewRect.bottom ? rcViewRect.bottom : ptMouse.y;
mfn_vChangeCursorFrom1To2 (CPoint (ptMouse), eSwapRight);
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : OnNcHitTest
// Date : 98/07/13
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Gabi Dumitrascu - CPA
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
UINT DEV_ViewPort3D::OnNcHitTest (CPoint point)
{
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap () && m_bIsVerticalSwap)
{
POINT ptMouse;
GetCursorPos (&ptMouse);
CRect rcViewRect;
GetWindowRect (rcViewRect);
// vertical swap
if ((point.y > rcViewRect.top + TOP_TOLERANCE) && !g_bMouseLocked)
mfn_vChangeCursorFrom1To2 (CPoint (ptMouse), eSwapBoth, TRUE);
}
return CWnd::OnNcHitTest(point);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : OnKillFocus
// Date : 98/07/13
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Gabi Dumitrascu - CPA
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void DEV_ViewPort3D::OnKillFocus (CWnd* pNewWnd)
{
if (M_bFullScreenEditor() && m_p_oDevice->IsFullScreen() && !IsCursorInFirstScreen () &&
GetParentContact()->GetInterface()->fn_bGetAutomaticSwap())
{
m_bWasInSecondScreen = TRUE;
if (g_bLButtonDown)
{
POINT ptMouse;
GetCursorPos (&ptMouse);
OnLButtonUp(m_uiLastMouseState, CPoint(ptMouse));
}
while (ShowCursor(TRUE) < 0);
//disable the confine of the cursor
ReleaseCapture ();
ClipCursor (NULL);
SetCursorInFirstScreen ();
GetParentContact()->GetDevice()->DrawEditorObject();
}
DEV_ViewPort::OnKillFocus(pNewWnd);
}
#endif //ACTIVE_EDITOR