oolite/src/Core/Entities/Entity.h

334 lines
8.4 KiB
Objective-C

/*
Entity.h
Base class for entities, i.e. drawable world objects.
Oolite
Copyright (C) 2004-2013 Giles C Williams and contributors
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 2
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, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
*/
#import "OOCocoa.h"
#import "OOMaths.h"
#import "OOCacheManager.h"
#import "OOTypes.h"
#import "OOWeakReference.h"
#import "OOColor.h"
@class Universe, CollisionRegion, ShipEntity, OOVisualEffectEntity;
#ifndef NDEBUG
extern uint32_t gLiveEntityCount;
extern size_t gTotalEntityMemory;
#endif
#define NO_DRAW_DISTANCE_FACTOR 1024.0
#define ABSOLUTE_NO_DRAW_DISTANCE2 (2500.0 * 2500.0 * NO_DRAW_DISTANCE_FACTOR * NO_DRAW_DISTANCE_FACTOR)
// ie. the furthest away thing we can draw is at 1280km (a 2.5km wide object would disappear at that range)
#define SCANNER_MAX_RANGE 25600.0
#define SCANNER_MAX_RANGE2 655360000.0
#define CLOSE_COLLISION_CHECK_MAX_RANGE2 1000000000.0
#define ENTRY(label, value) label = value,
typedef enum OOEntityStatus
{
#include "OOEntityStatus.tbl"
} OOEntityStatus;
#ifndef OO_SCANCLASS_TYPE
#define OO_SCANCLASS_TYPE
typedef enum OOScanClass OOScanClass;
#endif
enum OOScanClass
{
#include "OOScanClass.tbl"
};
#undef ENTRY
@interface Entity: OOWeakRefObject
{
// the base object for ships/stations/anything actually
//////////////////////////////////////////////////////
//
// @public variables:
//
// we forego encapsulation for some variables in order to
// lose the overheads of Obj-C accessor methods...
//
@public
OOUniversalID universalID; // used to reference the entity
unsigned isShip: 1,
isStation: 1,
isPlayer: 1,
isWormhole: 1,
isSubEntity: 1,
hasMoved: 1,
hasRotated: 1,
hasCollided: 1,
isSunlit: 1,
collisionTestFilter: 2,
throw_sparks: 1,
isImmuneToBreakPatternHide: 1,
isExplicitlyNotMainStation: 1,
isVisualEffect: 1;
OOScanClass scanClass;
GLfloat zero_distance;
GLfloat cam_zero_distance;
GLfloat no_draw_distance; // 10 km initially
GLfloat collision_radius;
HPVector position; // use high-precision vectors for global position
Vector cameraRelativePosition;
Quaternion orientation;
OOColor *atmosphereFogging;
int zero_index;
// Linked lists of entites, sorted by position on each (world) axis
Entity *x_previous, *x_next;
Entity *y_previous, *y_next;
Entity *z_previous, *z_next;
Entity *collision_chain;
OOUniversalID shadingEntityID;
Entity *collider;
CollisionRegion *collisionRegion; // initially nil - then maintained
@protected
HPVector lastPosition;
Quaternion lastOrientation;
GLfloat distanceTravelled; // set to zero initially
OOMatrix rotMatrix;
Vector velocity;
GLfloat energy;
GLfloat maxEnergy;
BoundingBox boundingBox;
GLfloat mass;
NSMutableArray *collidingEntities;
OOTimeAbsolute spawnTime;
struct JSObject *_jsSelf;
@private
NSUInteger _sessionID;
OOWeakReference *_owner;
OOEntityStatus _status;
}
// The session in which the entity was created.
- (NSUInteger) sessionID;
- (BOOL) isShip;
- (BOOL) isDock;
- (BOOL) isStation;
- (BOOL) isSubEntity;
- (BOOL) isPlayer;
- (BOOL) isPlanet;
- (BOOL) isSun;
- (BOOL) isSunlit;
- (BOOL) isStellarObject;
- (BOOL) isSky;
- (BOOL) isWormhole;
- (BOOL) isEffect;
- (BOOL) isVisualEffect;
- (BOOL) isWaypoint;
- (BOOL) validForAddToUniverse;
- (void) addToLinkedLists;
- (void) removeFromLinkedLists;
- (void) updateLinkedLists;
- (void) wasAddedToUniverse;
- (void) wasRemovedFromUniverse;
- (void) warnAboutHostiles;
- (CollisionRegion *) collisionRegion;
- (void) setCollisionRegion:(CollisionRegion*)region;
- (void) setUniversalID:(OOUniversalID)uid;
- (OOUniversalID) universalID;
- (BOOL) throwingSparks;
- (void) setThrowSparks:(BOOL)value;
- (void) throwSparks;
- (void) setOwner:(Entity *)ent;
- (id) owner;
- (ShipEntity *) parentEntity; // owner if self is subentity of owner, otherwise nil.
- (ShipEntity *) rootShipEntity; // like parentEntity, but recursive.
- (void) setPosition:(HPVector)posn;
- (void) setPositionX:(OOHPScalar)x y:(OOHPScalar)y z:(OOHPScalar)z;
- (HPVector) position;
- (Vector) cameraRelativePosition;
- (GLfloat) cameraRangeFront;
- (GLfloat) cameraRangeBack;
- (void) updateCameraRelativePosition;
// gets a low-position relative vector
- (Vector) vectorTo:(Entity *)entity;
- (HPVector) absolutePositionForSubentity;
- (HPVector) absolutePositionForSubentityOffset:(HPVector) offset;
- (double) zeroDistance;
- (double) camZeroDistance;
- (NSComparisonResult) compareZeroDistance:(Entity *)otherEntity;
- (BoundingBox) boundingBox;
- (GLfloat) mass;
- (Quaternion) orientation;
- (void) setOrientation:(Quaternion) quat;
- (Quaternion) normalOrientation; // Historical wart: orientation.w is reversed for player; -normalOrientation corrects this.
- (void) setNormalOrientation:(Quaternion) quat;
- (void) orientationChanged;
- (void) setVelocity:(Vector)vel;
- (Vector) velocity;
- (double) speed;
- (GLfloat) distanceTravelled;
- (void) setDistanceTravelled:(GLfloat)value;
- (void) setStatus:(OOEntityStatus)stat;
- (OOEntityStatus) status;
- (void) setScanClass:(OOScanClass)sClass;
- (OOScanClass) scanClass;
- (void) setEnergy:(GLfloat)amount;
- (GLfloat) energy;
- (void) setMaxEnergy:(GLfloat)amount;
- (GLfloat) maxEnergy;
- (void) applyRoll:(GLfloat)roll andClimb:(GLfloat)climb;
- (void) applyRoll:(GLfloat)roll climb:(GLfloat) climb andYaw:(GLfloat)yaw;
- (void) moveForward:(double)amount;
- (OOMatrix) rotationMatrix;
- (OOMatrix) drawRotationMatrix;
- (OOMatrix) transformationMatrix;
- (OOMatrix) drawTransformationMatrix;
- (BOOL) canCollide;
- (GLfloat) collisionRadius;
- (GLfloat) frustumRadius;
- (void) setCollisionRadius:(GLfloat)amount;
- (NSMutableArray *)collisionArray;
- (void) update:(OOTimeDelta)delta_t;
- (void) applyVelocity:(OOTimeDelta)delta_t;
- (BOOL) checkCloseCollisionWith:(Entity *)other;
- (void) takeEnergyDamage:(double)amount from:(Entity *)ent becauseOf:(Entity *)other weaponIdentifier:(NSString *)weaponIdentifier;
- (void) dumpState; // General "describe situtation verbosely in log" command.
- (void) dumpSelfState; // Subclasses should override this, not -dumpState, and call throught to super first.
// Subclass repsonsibilities
- (double) findCollisionRadius;
- (void) drawImmediate:(bool)immediate translucent:(bool)translucent;
- (BOOL) isVisible;
- (BOOL) isInSpace;
- (BOOL) isImmuneToBreakPatternHide;
// For shader bindings.
- (GLfloat) universalTime;
- (GLfloat) spawnTime;
- (GLfloat) timeElapsedSinceSpawn;
- (void) setAtmosphereFogging: (OOColor *) fogging;
- (OOColor *) fogUniform;
#ifndef NDEBUG
- (NSString *) descriptionForObjDumpBasic;
- (NSString *) descriptionForObjDump;
- (NSSet *) allTextures;
#endif
@end
@protocol OOHUDBeaconIcon;
// Methods that must be supported by entities with beacons, regardless of type.
@protocol OOBeaconEntity
- (NSComparisonResult) compareBeaconCodeWith:(Entity <OOBeaconEntity>*) other;
- (NSString *) beaconCode;
- (void) setBeaconCode:(NSString *)bcode;
- (NSString *) beaconLabel;
- (void) setBeaconLabel:(NSString *)blabel;
- (BOOL) isBeacon;
- (id <OOHUDBeaconIcon>) beaconDrawable;
- (Entity <OOBeaconEntity> *) prevBeacon;
- (Entity <OOBeaconEntity> *) nextBeacon;
- (void) setPrevBeacon:(Entity <OOBeaconEntity> *)beaconShip;
- (void) setNextBeacon:(Entity <OOBeaconEntity> *)beaconShip;
- (BOOL) isJammingScanning;
@end
enum
{
// Values used for unknown strings.
kOOEntityStatusDefault = STATUS_INACTIVE,
kOOScanClassDefault = CLASS_NOT_SET
};
NSString *OOStringFromEntityStatus(OOEntityStatus status) CONST_FUNC;
OOEntityStatus OOEntityStatusFromString(NSString *string) PURE_FUNC;
NSString *OOStringFromScanClass(OOScanClass scanClass) CONST_FUNC;
OOScanClass OOScanClassFromString(NSString *string) PURE_FUNC;