⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ivp_real_object.hxx

📁 hl2 source code. Do not use it illegal.
💻 HXX
📖 第 1 页 / 共 2 页
字号:
// Copyright (C) Ipion Software GmbH 1999-2000. All rights reserved.

//IVP_EXPORT_PUBLIC

/********************************************************************************
 *	File:	       	ivp_real_object.hxx	
 *	Description:	???
 ********************************************************************************/

#ifndef _IVP_REAL_OBJECT_INCLUDED
#define _IVP_REAL_OBJECT_INCLUDED

#ifndef WIN32
#	pragma interface
#endif

#ifndef IVP_U_MINLIST_INCLUDED
#	include <ivu_min_list.hxx>
#endif
// resolve forward references 
class IVP_Template_Phantom;
class IVP_SurfaceManager;
class IVP_Template_Real_Object;
class IVP_Material;
class IVP_OV_Element;
class IVP_OV_Element;
class IVP_Listener_Collision;
class IVP_Listener_Object;
class IVP_Radar;
class IVP_Template_Anchor;
class IVP_Hull_Manager;
class IVP_Synapse_Friction;

#define IVP_NO_COLL_GROUP_STRING_LEN 8

/********************************************************************************
 *	Name:	    	IVP_Movement_Type   	
 *	Description:	Indicates the coarse speed status of an object
 *	Attention:	Order is important, see macros
 ********************************************************************************/
enum IVP_Movement_Type {
    IVP_MT_UNDEFINED = 0,
    IVP_MT_MOVING = 0x01,	  // fast 
    IVP_MT_SLOW = 0x02,	          // slow
    IVP_MT_CALM = 0x03, 	  // slow for more than a certain time span (currently 1 second)
    IVP_MT_NOT_SIM =0x08,	  // not simulated, but can be changed to be simulated
    IVP_MT_STATIC_PHANTOM = 0x09, // like static, but object may be moved by setting the matrix directly
    IVP_MT_STATIC = 0x10,	  // static object
    IVP_MT_GET_MINDIST = 0x21     // not really a movement type, used to get all mindists with recheck_ov_element
};

#define IVP_MTIS_SIMULATED(var) ( var < IVP_MT_NOT_SIM )
#define IVP_MTIS_CAN_COLLIDE(var) ( var & 0x07 )
#define IVP_MTIS_IS_MOVING(var) (  var & 0x07 )
#define IVP_MTIS_IS_STATIC(var) ( var & 0x10 )

class IVP_Hull_Manager_Base_Gradient {
public:
    IVP_Time last_vpsi_time;
    IVP_FLOAT gradient;		    // slightly higher than the real gradient 
    IVP_FLOAT center_gradient;  
    IVP_FLOAT hull_value_last_vpsi;        
    IVP_FLOAT hull_center_value_last_vpsi;    
    IVP_FLOAT hull_value_next_psi;	// optimistic, may be less
    int time_of_next_reset;  		// counting seconds only
public:
    IVP_Hull_Manager_Base_Gradient() : last_vpsi_time (0.0f) {; };
    ~IVP_Hull_Manager_Base_Gradient(){;};
};

class IVP_Hull_Manager_Base: protected IVP_Hull_Manager_Base_Gradient {
protected:
    // Manages a sorted event list of synapses for one Real_Object **/
    IVP_U_Min_List sorted_synapses;
public:
    IVP_Hull_Manager_Base();
    ~IVP_Hull_Manager_Base();
};


/*********************************************************************
 *	Name:	    	IVP_Real_Object  	
 *	Description:	Base of all real objects.
 *			Real object means that this object has a mass,
 *			can collide, etc.
 *********************************************************************/
class IVP_Real_Object_Fast_Static: public IVP_Object {
protected:
    class IVP_Controller_Phantom *controller_phantom;
    class IVP_Synapse_Real *exact_synapses;		// Linked list of all exact synapses, no sphere nor hull.
    IVP_Synapse_Real     *invalid_synapses;         // Linkes list of all intruded synapses
    IVP_Synapse_Friction *friction_synapses;	// Linked list of contact points.
    IVP_U_Quat	         *q_core_f_object;	 // in object !!!!
    IVP_U_Float_Point 	 shift_core_f_object;
    IVP_Real_Object_Fast_Static(IVP_Cluster *father, const IVP_Template_Object *templ): IVP_Object( father, templ){;};
public:
    const IVP_U_Float_Point *get_shift_core_f_object() const { return &shift_core_f_object; };

};

// add dynamics
class IVP_Real_Object_Fast: public IVP_Real_Object_Fast_Static {
protected:
    class IVP_Cache_Object *cache_object;		// Intermediate caches
    IVP_Hull_Manager_Base hull_manager; 		// Internal usage
public:
    struct {
	IVP_Movement_Type  object_movement_state:8; // moving, not_simulated, static only
	IVP_BOOL      	collision_detection_enabled:2;	/* Collision detection is enabled. If it is disabled, not even
							 * the IVP_Collision_Filter is called */
	IVP_BOOL 	shift_core_f_object_is_zero:2;
	
	unsigned int	object_listener_exists:1;   /* is set to one if an object listener exists */
	unsigned int	collision_listener_exists:1; /* all flags of object listeners functions */
	unsigned int	collision_listener_listens_to_friction:1;
    } flags;
    IVP_Real_Object_Fast(IVP_Cluster *father, const IVP_Template_Object *templ): IVP_Real_Object_Fast_Static( father, templ){;};
};

class IVP_Real_Object: public IVP_Real_Object_Fast {

    friend class IVP_Anchor;
    friend class IVP_Core;
    friend class IVP_Friction_System;
    friend class IVP_Synapse_Real;
    friend class IVP_Cache_Object;
    friend class IVP_Cache_Object_Manager;
    friend class IVP_Synapse_Friction;
    friend class IVP_Contact_Point;
    friend class IVP_Simulation_Unit;
    friend class IVP_Controller_Phantom;
    friend class IVP_Example_Boundingboxes;
    
private:
    friend class IVP_Merge_Core;
    IVP_Anchor *anchors;			// Linked list of all anchors @@@ remove anchor concept

    friend class IVP_Object_Attach;
    void unlink_contact_points(IVP_BOOL silent); //FALSE means wake up the cores
    void clear_internal_references();

    friend class IVP_Mindist_Manager;
protected:    
    IVP_SurfaceManager *surface_manager;	// The surface_manager defines the surface structure for this object.
    
    /* The following section is used to calculate intermediate values */

    friend class IVP_Core_Collision;
    friend class IVP_Calc_Next_PSI_Solver;
    void update_exact_mindist_events_of_object();
    void revive_nearest_objects_grow_fs();
    void get_all_near_mindists();
    void recalc_exact_mindists_of_object();
    void recalc_invalid_mindists_of_object();
  
    virtual void set_new_quat_object_f_core( const IVP_U_Quat *new_quat_object_f_core, const IVP_U_Point *trans_object_f_core); // calls set_new_m...
public:
    virtual void set_new_m_object_f_core( const IVP_U_Matrix *new_m_object_f_core );	 /* specifies new objects coordinate system in core space */
    void init_object_core(IVP_Environment *env, const IVP_Template_Real_Object *tpop);
protected:

    IVP_Real_Object(IVP_Cluster *father,IVP_SurfaceManager *, const IVP_Template_Real_Object *,
		    const IVP_U_Quat *q_world_f_obj, const IVP_U_Point *position);


    virtual ~IVP_Real_Object();	// to delete the object use delete_and_check_vicinity or delete_silently

/********************************************************************************
 *	The physics simulation internal public section. Handle with care:
 ********************************************************************************/
public:    
    char nocoll_group_ident[IVP_NO_COLL_GROUP_STRING_LEN];	/* Identifier for filtering collisions, used only 
				 * if the IVP_Collision_Filter_Coll_Group_Ident is
				 * the installed collision filter, see IVP_Application_Environment. */
    ///////// Simulation internals
    IVP_Material 	*l_default_material;	// default material of object
    IVP_OV_Element   	*ov_element;		// used to trace objects movement within the environment->ov_tree
    IVP_FLOAT extra_radius;	                        // extra collision radius around the object

    ///////// Core 
    IVP_Core *physical_core; // Coordinate system, mass, speed, etc... (eventually merged)
    IVP_Core *friction_core; // Long term (merged) core for frictions, when objs are splitted make sure to call 'recheck_ov_element'
    IVP_Core *original_core;

    ////////// Anchors
    IVP_Anchor *get_first_anchor(){ return anchors; };
    void insert_anchor(IVP_Anchor *new_anchor);
    void remove_anchor(IVP_Anchor *destroy_anch);

    IVP_Synapse_Real *get_first_exact_synapse(){ return exact_synapses; };
    IVP_Synapse_Friction *get_first_friction_synapse(){ return friction_synapses; };
    IVP_Hull_Manager *get_hull_manager(){ return (IVP_Hull_Manager *)&this->hull_manager; };

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -