| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project Name : LevelEdit *
- * *
- * $Archive:: /Commando/Code/Tools/LevelEdit/Mover.h $*
- * *
- * Author:: Patrick Smith *
- * *
- * $Modtime:: 2/15/01 10:16a $*
- * *
- * $Revision:: 10 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #if defined(_MSC_VER)
- #pragma once
- #endif
- #ifndef __MOVER_H
- #define __MOVER_H
- #include "listtypes.h"
- #include "bittype.h"
- #include "collisiongroups.h"
- #include "coltest.h"
- #include "physcoltest.h"
- #include "utils.h"
- #include "sceneeditor.h"
- // Forward declarations
- class NodeClass;
- class Quaternion;
- class Vector3;
- class Matrix3D;
- struct CastResultStruct;
- ///////////////////////////////////////////////////////////////////////
- //
- // MoverClass
- //
- ///////////////////////////////////////////////////////////////////////
- class MoverClass
- {
- public:
- ////////////////////////////////////////////////////////////////////
- // Static methods
- ////////////////////////////////////////////////////////////////////
-
- //
- // Node 'casting' functions.
- // These position a node at the interesction point of a ray cast into the world.
- //
- static void Position_Node (NodeClass *node);
- static void Position_Node_Along_Ray (NodeClass *node);
- static Vector3 Position_Node_Along_Ray (NodeClass *node, const Vector3 &start, const Vector3 &end);
- static void Position_Nodes_Along_Ray (void);
- static void Position_Nodes_Along_Ray (const Vector3 &start, const Vector3 &end);
- static Vector3 Position_Nodes_Along_Ray (NODE_LIST &list, const Vector3 &tracking_pt, const Vector3 &start, const Vector3 &end);
-
- static Vector3 Calc_New_Position (const Matrix3D &coord_system, const Vector3 &start_point_in_world_coords, LPPOINT mouse_pos = NULL);
- //
- // Translation functions
- //
- static void Move_Node (NodeClass *node, const Vector3 &translation);
- static void Move_Nodes (const Vector3 &translation);
- static Vector3 Move_Nodes (NODE_LIST &list, const Vector3 &tracking_point);
- static void Simple_Move_Nodes (NODE_LIST &list, const Vector3 &translation);
-
- //
- // Rotation functions
- //
- static void Rotate_Nodes (float deltax, float deltay, const Quaternion &rotation);
- static void Rotate_Nodes (NODE_LIST &list, const Vector3 ¢er, float deltax, float deltay, const Quaternion &rotation);
- static void Rotate_Nodes (NODE_LIST &list, const Matrix3D &rotation_matrix, const Vector3 ¢er);
- static void Rotate_Nodes_Z (float multiplier);
- static void Rotate_Nodes_Z (NODE_LIST &list, const Vector3 ¢er, float multiplier);
- //
- // Low-level rotate and translate functions on a per-node basis.
- // These are called by the other functions once the rotatation or translation params are calculated.
- //
- static void Rotate_Node (NodeClass *node, const Matrix3D &rotation_matrix, const Matrix3D &coord_system);
- static void Rotate_Node_Freely (NodeClass *node, const Matrix3D &rotation_matrix, const Matrix3D &coord_system);
- static void Rotate_Node_Z90 (NodeClass *node, const Matrix3D &rotation_matrix, const Matrix3D &coord_system);
- static void Translate_Node (NodeClass *node, const Vector3 &vector);
- static void Transform_Node (NodeClass *node, const Matrix3D &transform);
- static void Transform_Nodes (NodeClass *node, const Matrix3D &transform);
- static void Transform_Nodes (NODE_LIST &list, NodeClass *node, const Matrix3D &transform);
- //
- // Ray-Cast helper functions
- // These are used to simplify ray casting and line-of-sight casting
- //
- static void Get_LOS_Ray (const POINT &mouse_pos, float length, Vector3 &start, Vector3 &end);
- static void Get_LOS_Ray (float length, Vector3 &start, Vector3 &end);
- static void Get_Mouse_Ray (const POINT &mouse_pos, float length, Vector3 &start, Vector3 &end);
- static void Get_Mouse_Ray (float length, Vector3 &start, Vector3 &end);
- static PhysClass *Cast_Ray (CastResultStruct &result, const Vector3 &start, const Vector3 &end, uint32 group = DEF_COLLISION_GROUP, uint32 type = COLLISION_TYPE_PHYSICAL | COLLISION_TYPE_PROJECTILE | COLLISION_TYPE_6);
- static PhysClass *Cast_Box (CastResultStruct &result, const AABoxClass &box, const Vector3 &move, uint32 group = DEF_COLLISION_GROUP, uint32 type = COLLISION_TYPE_PHYSICAL | COLLISION_TYPE_PROJECTILE | COLLISION_TYPE_6);
- protected:
-
- ////////////////////////////////////////////////////////////////////
- // Protected methods
- ////////////////////////////////////////////////////////////////////
- static bool Calc_Ray_Intersection_XY (float plane, const Vector3 &start, const Vector3 &end, Vector3 &result);
- static bool Calc_Ray_Intersection_XZ (float plane, const Vector3 &start, const Vector3 &end, Vector3 &result);
- static bool Calc_Ray_Intersection_YZ (float plane, const Vector3 &start, const Vector3 &end, Vector3 &result);
- private:
- ////////////////////////////////////////////////////////////////////
- // Private member data
- ////////////////////////////////////////////////////////////////////
- };
- ////////////////////////////////////////////////////////////////////
- // Cast_Ray
- ////////////////////////////////////////////////////////////////////
- inline PhysClass *
- MoverClass::Cast_Ray
- (
- CastResultStruct & result,
- const Vector3 & start,
- const Vector3 & end,
- uint32 group,
- uint32 type
- )
- {
- bool retval = false;
-
- LineSegClass ray (start, end);
- PhysRayCollisionTestClass raytest (ray, &result, group, type);
- ::Get_Scene_Editor ()->Cast_Ray (raytest);
- //
- // Return a pointer to the collided physics object if the
- // cast hit something
- //
- PhysClass *collided_obj = NULL;
- if (result.Fraction < 1.0F) {
- collided_obj = raytest.CollidedPhysObj;
- }
- return collided_obj;
- }
- ////////////////////////////////////////////////////////////////////
- // Cast_Box
- ////////////////////////////////////////////////////////////////////
- inline PhysClass *
- MoverClass::Cast_Box
- (
- CastResultStruct & result,
- const AABoxClass & box,
- const Vector3 & move,
- uint32 group,
- uint32 type
- )
- {
- bool retval = false;
- PhysAABoxCollisionTestClass boxtest (box, move, &result, group, type);
- PhysicsSceneClass::Get_Instance()->Cast_AABox (boxtest);
- //
- // Return a pointer to the collided physics object if the
- // cast hit something
- //
- PhysClass *collided_obj = NULL;
- if (result.Fraction < 1.0F) {
- collided_obj = boxtest.CollidedPhysObj;
- }
- return collided_obj;
- }
- #endif //__MOVER_H
|