Files
FC1/Editor/Objects/ShapeObject.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

330 lines
10 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2001.
// -------------------------------------------------------------------------
// File name: ShapeObject.h
// Version: v1.00
// Created: 10/10/2001 by Timur.
// Compilers: Visual C++ 6.0
// Description: ShapeObject object definition.
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#ifndef __ShapeObject_h__
#define __ShapeObject_h__
#if _MSC_VER > 1000
#pragma once
#endif
#include "BaseObject.h"
#include "SafeObjectsArray.h"
#define SHAPE_CLOSE_DISTANCE 0.8f
#define SHAPE_Z_OFFSET 0.1f
/*!
* CShapeObject is an object that represent named 3d position in world.
*
*/
class CShapeObject : public CBaseObject
{
public:
DECLARE_DYNCREATE(CShapeObject)
//////////////////////////////////////////////////////////////////////////
// Ovverides from CBaseObject.
//////////////////////////////////////////////////////////////////////////
bool Init( IEditor *ie,CBaseObject *prev,const CString &file );
void Done();
bool CreateGameObject();
void Display( DisplayContext &dc );
//////////////////////////////////////////////////////////////////////////
void SetName( const CString &name );
void BeginEditParams( IEditor *ie,int flags );
void EndEditParams( IEditor *ie );
//! Called when object is being created.
int MouseCreateCallback( CViewport *view,EMouseEvent event,CPoint &point,int flags );
void GetBoundBox( BBox &box );
void GetLocalBounds( BBox &box );
bool HitTest( HitContext &hc );
bool HitTestRect( HitContext &hc );
void OnEvent( ObjectEvent event );
void Serialize( CObjectArchive &ar );
XmlNodeRef Export( const CString &levelPath,XmlNodeRef &xmlNode );
//////////////////////////////////////////////////////////////////////////
int GetAreaId();
void SetClosed( bool bClosed );
bool IsClosed() { return mv_closed; };
//! Insert new point to shape at givven index.
//! @return index of newly inserted point.
int InsertPoint( int index,const Vec3 &point );
//! Remve point from shape at givven index.
void RemovePoint( int index );
//! Get number of points in shape.
int GetPointCount() { return m_points.size(); };
//! Get point at index.
const Vec3& GetPoint( int index ) const { return m_points[index]; };
//! Set point position at specified index.
void SetPoint( int index,const Vec3 &pos );
void SelectPoint( int index );
int GetSelectedPoint() const { return m_selectedPoint;};
//! Set shape width.
float GetWidth() const { return mv_width; };
//! Set shape height.
float GetHeight() const { return mv_height; };
//! Find shape point nearest to givven point.
int GetNearestPoint( const Vec3 &raySrc,const Vec3 &rayDir,float &distance );
//! Find shape edge nearest to givven point.
void GetNearestEdge( const Vec3 &pos,int &p1,int &p2,float &distance,Vec3 &intersectPoint );
//! Find shape edge nearest to givven ray.
void GetNearestEdge( const Vec3 &raySrc,const Vec3 &rayDir,int &p1,int &p2,float &distance,Vec3 &intersectPoint );
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
virtual void SetSelected( bool bSelect );
//////////////////////////////////////////////////////////////////////////
// Binded entities.
//////////////////////////////////////////////////////////////////////////
//! Bind entity to this shape.
void AddEntity( CBaseObject *entity );
void RemoveEntity( int index );
CBaseObject* GetEntity( int index );
int GetEntityCount() { return m_entities.GetCount(); }
void CalcBBox();
protected:
virtual void PostClone( CBaseObject *pFromObject,CObjectCloneContext &ctx );
bool RayToLineDistance( const Vec3 &rayLineP1,const Vec3 &rayLineP2,const Vec3 &pi,const Vec3 &pj,float &distance,Vec3 &intPnt );
virtual bool IsOnlyUpdateOnUnselect() const { return false; }
virtual int GetMaxPoints() const { return 1000; };
////! Calculate distance between
//float DistanceToShape( const Vec3 &pos );
void DrawTerrainLine( DisplayContext &dc,const Vec3 &p1,const Vec3 &p2 );
// Ignore default draw highlight.
void DrawHighlight( DisplayContext &dc ) {};
void EndCreation();
//! Update game area.
virtual void UpdateGameArea( bool bRemove=false );
//overrided from CBaseObject.
void InvalidateTM();
//! Called when shape variable changes.
void OnShapeChange( IVariable *var );
//! Dtor must be protected.
CShapeObject();
void DeleteThis() { delete this; };
IEditor *m_ie;
BBox m_bbox;
std::vector<Vec3> m_points;
struct IXArea *m_IArea;
bool m_bIgnoreGameUpdate;
//////////////////////////////////////////////////////////////////////////
//! List of binded entities.
//std::vector<uint> m_entities;
// Entities.
CSafeObjectsArray m_entities;
//////////////////////////////////////////////////////////////////////////
// Shape parameters.
//////////////////////////////////////////////////////////////////////////
CVariable<float> mv_width;
CVariable<float> mv_height;
CVariable<int> mv_areaId;
CVariable<int> mv_groupId;
CVariable<bool> mv_closed;
//! Display triangles filling closed shape.
CVariable<bool> mv_displayFilled;
int m_selectedPoint;
float m_lowestHeight;
bool m_bAreaModified;
//! Forces shape to be always 2D. (all vertices lie on XY plane).
bool m_bForce2D;
bool m_bDisplayFilledWhenSelected;
static int m_rollupId;
static class CShapePanel* m_panel;
};
/*!
* Class Description of ShapeObject.
*/
class CShapeObjectClassDesc : public CObjectClassDesc
{
public:
REFGUID ClassID()
{
// {6167DD9D-73D5-4d07-9E92-CF12AF451B08}
static const GUID guid = { 0x6167dd9d, 0x73d5, 0x4d07, { 0x9e, 0x92, 0xcf, 0x12, 0xaf, 0x45, 0x1b, 0x8 } };
return guid;
}
ObjectType GetObjectType() { return OBJTYPE_SHAPE; };
const char* ClassName() { return "Shape"; };
const char* Category() { return "Area"; };
CRuntimeClass* GetRuntimeClass() { return RUNTIME_CLASS(CShapeObject); };
int GameCreationOrder() { return 50; };
};
//////////////////////////////////////////////////////////////////////////
// Special object for forbidden area.
//////////////////////////////////////////////////////////////////////////
class CAIForbiddenAreaObject : public CShapeObject
{
DECLARE_DYNCREATE(CAIForbiddenAreaObject)
public:
CAIForbiddenAreaObject();
// Ovverride game area creation.
virtual void UpdateGameArea( bool bRemove=false );
};
//////////////////////////////////////////////////////////////////////////
// Special object for AI Walkabale paths.
//////////////////////////////////////////////////////////////////////////
class CAIPathObject : public CShapeObject
{
DECLARE_DYNCREATE(CAIPathObject)
public:
CAIPathObject();
// Ovverride game area creation.
virtual void UpdateGameArea( bool bRemove=false );
};
//////////////////////////////////////////////////////////////////////////
// Special object for AI Walkabale paths.
//////////////////////////////////////////////////////////////////////////
class CAINavigationModifierObject : public CShapeObject
{
DECLARE_DYNCREATE(CAINavigationModifierObject)
public:
CAINavigationModifierObject();
// Ovverride game area creation.
virtual void UpdateGameArea( bool bRemove=false );
};
//////////////////////////////////////////////////////////////////////////
// Special object for AI Walkabale paths.
//////////////////////////////////////////////////////////////////////////
class CAIOcclusionPlaneObject : public CShapeObject
{
DECLARE_DYNCREATE(CAIOcclusionPlaneObject)
public:
CAIOcclusionPlaneObject();
// Ovverride game area creation.
virtual void UpdateGameArea( bool bRemove=false );
};
/*!
* Class Description of CForbiddenAreaObject.
*/
class CAIForbiddenAreaObjectClassDesc : public CObjectClassDesc
{
public:
REFGUID ClassID()
{
// {9C9D5FD9-761B-4734-B2AA-38990E4C2EB9}
static const GUID guid = { 0x9c9d5fd9, 0x761b, 0x4734, { 0xb2, 0xaa, 0x38, 0x99, 0xe, 0x4c, 0x2e, 0xb9 } };
return guid;
}
ObjectType GetObjectType() { return OBJTYPE_SHAPE; };
const char* ClassName() { return "ForbiddenArea"; };
const char* Category() { return "AI"; };
CRuntimeClass* GetRuntimeClass() { return RUNTIME_CLASS(CAIForbiddenAreaObject); };
int GameCreationOrder() { return 50; };
};
/*!
* Class Description of CForbiddenAreaObject.
*/
class CAIPathObjectClassDesc : public CObjectClassDesc
{
public:
REFGUID ClassID()
{
// {06380C56-6ECB-416f-9888-60DE08F0280B}
static const GUID guid = { 0x6380c56, 0x6ecb, 0x416f, { 0x98, 0x88, 0x60, 0xde, 0x8, 0xf0, 0x28, 0xb } };
return guid;
}
ObjectType GetObjectType() { return OBJTYPE_SHAPE; };
const char* ClassName() { return "AIPath"; };
const char* Category() { return "AI"; };
CRuntimeClass* GetRuntimeClass() { return RUNTIME_CLASS(CAIPathObject); };
int GameCreationOrder() { return 50; };
};
/*!
* Class Description of CForbiddenAreaObject.
*/
class CAINavigationModifierObjectClassDesc : public CObjectClassDesc
{
public:
REFGUID ClassID()
{
// {2AD95C7B-5548-435b-BF0C-63632D7FEA40}
static const GUID guid = { 0x2ad95c7b, 0x5548, 0x435b, { 0xbf, 0xc, 0x63, 0x63, 0x2d, 0x7f, 0xea, 0x40 } };
return guid;
}
ObjectType GetObjectType() { return OBJTYPE_SHAPE; };
const char* ClassName() { return "AINavigationModifier"; };
const char* Category() { return "AI"; };
CRuntimeClass* GetRuntimeClass() { return RUNTIME_CLASS(CAINavigationModifierObject); };
int GameCreationOrder() { return 50; };
};
/*!
* Class Description of CForbiddenAreaObject.
*/
class CAIOcclusionPlaneObjectClassDesc : public CObjectClassDesc
{
public:
REFGUID ClassID()
{
// {85F4FEB1-1E97-4d78-BC0F-CACEA0D539C3}
static const GUID guid =
{ 0x85f4feb1, 0x1e97, 0x4d78, { 0xbc, 0xf, 0xca, 0xce, 0xa0, 0xd5, 0x39, 0xc3 } };
return guid;
}
ObjectType GetObjectType() { return OBJTYPE_SHAPE; };
const char* ClassName() { return "AIHorizontalOcclusionPlane"; };
const char* Category() { return "AI"; };
CRuntimeClass* GetRuntimeClass() { return RUNTIME_CLASS(CAIOcclusionPlaneObject); };
int GameCreationOrder() { return 50; };
};
#endif // __ShapeObject_h__