#ifndef ___RLDS3D_HEADER_FILE
#define ___RLDS3D_HEADER_FILE
#include "d3drmwin.h"
/*
** This is an interface between the viewer and the RL/DS3D APIs which provides the
** functionality required by the viewer in simplified form.
**
** Note: This is not an object-oriented API since there should only be need for one
** copy at a time and this way C++ to C conversions should be fairly easy
**
** DESCRIPTION: The user interfaces the 3D world and objects therein by selecting items
** with the mouse (on the screen) and performing operations on that item. The user will
** also be able to perform operations on the camera and a few global operations applied
** to all objects.
**
** USAGE: Create the interface using RLDS3D_Initialize() (returns FALSE if not created)
** and remove it using RLDS3D_Deinitialize(). The RLDS3D_Render() functionality draws the world
** on the screen.
*/
/*
************************ INITIALIZATION/DEINITIALIZATION ****************************
*/
/*
** Initialize will attach itself to the passed window. Call initialize after
** getting a handle for your window but before you display it.
**
** Initialize will initialize the RL API and return false if it fails. It will
** also attempt to initialize a DirectSound3D API, but failing this does not
** justify a failed Initialize (since the 3D sound isn't a necessary part of
** the viewer)
*/
BOOL RLDS3D_Initialize(HWND hwndPW, HINSTANCE this_inst);
/*
** Deinitializes where necessary (assumes program quits after calling this otherwise it'd free up memory, etc...)
*/
void RLDS3D_Deinitialize();
/*
*************************** ADDING/REMOVING/EDITING OBJECTS *********************************
*/
/*
** Loads XOF file into the RL world (with textures)
*/
void RLDS3D_LoadXOF(char* file);
/*
** Sets/Gets whether or not boxes are shown around selected item
*/
BOOL RLDS3D_GetBoxes(void);
void RLDS3D_SetBoxes(BOOL new_val);
/*
** Updates the bounding box around the selected visual (this could be done using a render callback function to compare the
** frame's scaling and transform functions instead)
*/
void RLDS3D_UpdateSelectionBox(void);
/*
** Deselects the currently selected 3D visual.
*/
void RLDS3D_DeselectVisual();
/*
** Given coordinates it selects the first visual under those coordinates in the window's viewport
*/
void RLDS3D_FindAndSelectVisual(int x, int y, LPBOOL changed = NULL);
/*
** Cuts the current selection to the clipboard
*/
void RLDS3D_CutVisual();
/*
** Copies the current selection to the clipboard
*/
void RLDS3D_CopyVisual();
/*
** Pastes the current selection to the window
*/
void RLDS3D_PasteVisual();
/*
** Deletes the current selection from the world without copying to the clipboard
*/
void RLDS3D_DeleteVisual();
/*
** Add a directional light
*/
void RLDS3D_AddDirectionalLight();
/*
** Add a parallel point light
*/
void RLDS3D_AddParallelPointLight();
/*
** Add Point Light
*/
void RLDS3D_AddPointLight();
/*
** Add a spotlight
*/
void RLDS3D_AddSpotlight();
/*
*********************************** OBJECT MOTION/SCALING/COLOURING ****************************************
*/
/*
** Sets the selected object's colour
*/
void RLDS3D_SetSelColour();
/*
** Moves the camera relative to itself by providing scalars to multiply against the CAMERA-RELATIVE unit vectors
** forwards/up/right.
*/
void RLDS3D_SetCamVelRelToCam(D3DVALUE forward, D3DVALUE up, D3DVALUE right);
/*
** Rotates the camera around its three axis
**
** forward_axis is roll, up_axis is yaw, right_axis is pitch
** (Only one affects at a time)
*/
void RLDS3D_SetCamRotForward(D3DVALUE forward_axis);
void RLDS3D_SetCamRotUp(D3DVALUE up_axis);
void RLDS3D_SetCamRotRight(D3DVALUE right_axis);
/*
** Scales the selected object in the x/y/z axis of it's orientation by the specified values
*/
void RLDS3D_ScaleSelected(D3DVALUE sx, D3DVALUE sy, D3DVALUE sz);
/*
** Moves the currently selected object in the 3D world relative to the camera
*/
void RLDS3D_SetSelectedVelRelToCam(D3DVALUE forward, D3DVALUE up, D3DVALUE right);
/*
** Rotates the currently selected object relative to the camera's frame when passed
** a vector for the axis and an angle of rotation.
** This is useful because the AXIS which is specified is relative to what appears on the screen with it's origin at the camera
** (ie: (0,0,1) will be an axis straight into the screen and thus things will spin around the centre of the screen)
*/
void RLDS3D_SetSelectedRotRelToCam(D3DVALUE AxisX, D3DVALUE AxisY, D3DVALUE AxisZ, D3DVALUE angle);
/*
** Moves the currently selected object by x/y pixels on the screen from it's relative position. Allows a user
** to drag objects around the screen using the mouse. Assumes that the distance from the frame to the screen
** will remain constant
*/
void RLDS3D_MoveSelectedPosByScreenCoords(double delta_x, double delta_y);
/*
** Orbits the selected object around the camera
*/
void RLDS3D_OrbitSelected(void);
void RLDS3D_StopOrbitSelected();
/*
** Bullets it towards the camera
*/
void RLDS3D_BulletSelected(void);
/*
********************** DIRECTSOUND 3D INTERFACE ******************************
*/
/*
** Stops all sounds from playing
*/
void RLDS3D_StopAllSounds();
/*
** Removes all of the sounds
*/
void RLDS3D_RemoveAllSounds();
/*
** Plays the sound associated with the currently selected object
*/
void RLDS3D_PlaySound(BOOL bIsLooping);
/*
** Stops the sound associated with the currently selected object
*/
void RLDS3D_StopSelectedSound();
/*
** Removes the sound from the currently selected object
*/
void RLDS3D_RemoveSound();
/*
** Attaches a sound (filename provided) to the selected frame
*/
void RLDS3D_AttachSound(char* filename);
/*
** Global parameter mods
*/
void RLDS3D_GetDistanceFactor(D3DVALUE *temp);
void RLDS3D_GetDopplerFactor(D3DVALUE *temp);
void RLDS3D_GetRolloffFactor(D3DVALUE *temp);
void RLDS3D_SetDistanceFactor(D3DVALUE temp);
void RLDS3D_SetDopplerFactor(D3DVALUE temp);
void RLDS3D_SetRolloffFactor(D3DVALUE temp);
void RLDS3D_CommitDeferredSettings(void);
/*
** Selected sound parameter modifications
*/
BOOL RLDS3D_SoundSelected(void);
void RLDS3D_GetSelConeAngles(LPDWORD inner, LPDWORD outer);
void RLDS3D_GetSelConeOutsideVolume(LPLONG temp);
void RLDS3D_GetSelMinimumDistance(D3DVALUE *temp);
void RLDS3D_GetSelMaximumDistance(D3DVALUE *temp);
void RLDS3D_SetSelConeAngles(DWORD inner, DWORD outer);
void RLDS3D_SetSelConeOutsideVolume(LONG temp);
void RLDS3D_SetSelMinimumDistance(D3DVALUE temp);
void RLDS3D_SetSelMaximumDistance(D3DVALUE temp);
/*
************************************* MISC. MAINTENANCE FUNCTIONS **************************************
*/
/*
** Allows external users access to the RL Device to deal with Windows-related issues
** (See case WM_ACTIVATE: and case WM_PAINT: in viewer source for examples of HandleActivate() and HandlePaint())
** Design note: This was done to save time from the conversion from the old version of the viewer rather than
** having RLDS3D_HandleActivate(), etc.
*/
LPDIRECT3DRMDEVICE RLDS3D_WinDevice();
// Handles window activation (pass the wparam from the winproc)
void RLDS3D_HandleActivate(WPARAM wparam);
// Handles paint messages from the window. Pass this one the paintstructure created using BeginPaint
void RLDS3D_HandlePaint(PAINTSTRUCT* ps);
// Tells whether or not something is currently selected
BOOL RLDS3D_FrameSelected();
/*
** Renders the scene's next frame into the viewport.
*/
void RLDS3D_Render(D3DVALUE time_delta);
/*
* Resize the viewport and device when the window size changes.
*/
void RLDS3D_ResizeViewport(int width, int height);
/*
** Returns whether or not the 3D Sound API was actually initialized properly
*/
BOOL RLDS3D_SoundInitialized();
/*
** Sets/Gets the current polygon fill mode
*/
D3DRMFILLMODE RLDS3D_GetPolygonFillMode(void);
void RLDS3D_SetPolygonFillMode(D3DRMFILLMODE quality);
/*
** Sets/Gets the current polygon shade mode
*/
void RLDS3D_SetPolygonShadeMode(D3DRMSHADEMODE quality);
D3DRMSHADEMODE RLDS3D_GetPolygonShadeMode(void);
/*
** Sets/Gets the colour model for the viewport (RGB or ramp)
*/
D3DRMCOLORMODEL RLDS3D_GetColourModel(void);
void RLDS3D_SetColourModel(D3DRMCOLORMODEL model);
/*
** Sets/Gets whether or not the lights affect the visuals
*/
void RLDS3D_SetLighting(BOOL new_val);
BOOL RLDS3D_GetLighting(void);
/*
** Sets/Gets whether or not dithering is on
*/
BOOL RLDS3D_GetDither(void);
void RLDS3D_SetDither(BOOL dither);
/*
** Sets/Gets texture quality (only relevant for RGB modes)
*/
D3DRMTEXTUREQUALITY RLDS3D_GetTextureQuality(void);
void RLDS3D_SetTextureQuality(D3DRMTEXTUREQUALITY new_quality);
#endif