colobot/src/object/object.h

206 lines
6.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* This file is part of the Colobot: Gold Edition source code
* Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam
* http://epsiteс.ch; http://colobot.info; http://github.com/colobot
*
* 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://gnu.org/licenses
*/
/**
* \file object/object.h
* \brief CObject - base class for all game objects
*/
#pragma once
#include "object/crash_sphere.h"
#include "object/object_interface_type.h"
#include "object/old_object_interface.h"
#include <vector>
namespace Gfx
{
struct ModelCrashSphere;
} // namespace Gfx
class CLevelParserLine;
class CBotVar;
/**
* \class CObject
* \brief Base class for all 3D in-game objects
*
* CObject serves as a base class for all in-game objects, including:
* - buildings,
* - robots,
* - astronaut,
* - plants,
* - aliens.
*
* As every object has its specific behavior, there are or will be
* separate subclasses for each of the specific objects. For the time being,
* old object interface is still present, but its functions will be moved to
* appropriate subclasses with time. The new CObject interface implemented
* here will feature only functions common to all objects.
*/
class CObject : public COldObjectInterface
{
protected:
//! Constructor only accessible to subclasses
CObject(int id, ObjectType type);
public:
CObject(const CObject&) = delete;
CObject& operator=(const CObject&) = delete;
virtual ~CObject();
//! Returns object type
inline ObjectType GetType() const
{
return m_type;
}
//! Returns object's unique id
inline int GetID() const
{
return m_id;
}
//! Writes object properties to line in level file
virtual void Write(CLevelParserLine* line) = 0;
//! Reads object properties from line in level file
virtual void Read(CLevelParserLine* line) = 0;
//! Check if object implements the given type of interface
inline bool Implements(ObjectInterfaceType type) const
{
return m_implementedInterfaces[static_cast<int>(type)];
}
//! Returns object's position
virtual Math::Vector GetPosition() const;
//! Sets object's position
virtual void SetPosition(const Math::Vector& pos);
//! Returns object's rotation (Euler angles)
/** Angles are given in radians */
virtual Math::Vector GetRotation() const;
//! Sets object's rotation (Euler angles)
/** Angles are given in radians */
virtual void SetRotation(const Math::Vector& rotation);
//!@{
//! Shortcuts for rotation components
void SetRotationX(float angle);
void SetRotationY(float angle);
void SetRotationZ(float angle);
float GetRotationX();
float GetRotationY();
float GetRotationZ();
//!@}
//! Returns object's scale
virtual Math::Vector GetScale() const;
//! Sets objects's scale
virtual void SetScale(const Math::Vector& scale);
//! Sets objects's scale (uniform value)
void SetScale(float scale);
//!@{
//! Shortcuts for scale components
void SetScaleX(float angle);
void SetScaleY(float angle);
void SetScaleZ(float angle);
float GetScaleX();
float GetScaleY();
float GetScaleZ();
//!@}
//! Sets crash spheres for object
void SetCrashSpheres(const std::vector<Gfx::ModelCrashSphere>& crashSpheres);
//! Adds a new crash sphere
/** Crash sphere position is given in object coordinates */
void AddCrashSphere(const CrashSphere& crashSphere);
//! Returns total number of crash spheres
int GetCrashSphereCount();
//! Returns the first crash sphere (assumes it exists)
/** Crash sphere position is returned in world coordinates */
CrashSphere GetFirstCrashSphere();
//! Returns all crash spheres
/** Crash sphere position is returned in world coordinates */
std::vector<CrashSphere> GetAllCrashSpheres();
//! Removes all crash spheres
void DeleteAllCrashSpheres();
//! Returns sphere used to test for camera collisions
Math::Sphere GetCameraCollisionSphere();
//! Sets sphere used to test for camera collisions
// TODO: remove from here once no longer necessary
void SetCameraCollisionSphere(const Math::Sphere& sphere);
//! Sets the transparency of object
virtual void SetTransparency(float value) = 0;
//! Sets flag controlling animation effect on level reset
void SetAnimateOnReset(bool animateOnReset);
//! Returns flag controlling animation effect on level reset
bool GetAnimateOnReset();
//! Turns object collisions on/off
void SetCollisions(bool collisions);
//! Returns true if collisions are enabled
bool GetCollisions();
//! Sets object team (shouldn't be called after creation because the model won't update!)
void SetTeam(int team);
//! Returns object team
int GetTeam();
//! Enable object activation only after you come close
void SetProxyActivate(bool activate);
//! Returns close activation mode
bool GetProxyActivate();
//! Sets distance for close activation
void SetProxyDistance(float distance);
//! Returns distance for close activation
float GetProxyDistance();
//! Returns CBot "object" variable associated with this object
CBotVar* GetBotVar();
protected:
//! Transform crash sphere by object's world matrix
virtual void TransformCrashSphere(Math::Sphere& crashSphere) = 0;
//! Transform crash sphere by object's world matrix
virtual void TransformCameraCollisionSphere(Math::Sphere& collisionSphere) = 0;
protected:
const int m_id; //!< unique identifier
ObjectType m_type; //!< object type
ObjectInterfaceTypes m_implementedInterfaces; //!< interfaces that the object implements
Math::Vector m_position;
Math::Vector m_rotation;
Math::Vector m_scale;
std::vector<CrashSphere> m_crashSpheres; //!< crash spheres
Math::Sphere m_cameraCollisionSphere;
bool m_animateOnReset;
bool m_collisions;
int m_team;
bool m_proxyActivate;
float m_proxyDistance;
CBotVar* m_botVar;
};