123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- //***************************************************************************
- //
- // Light.cpp -- File contains the Light Object code
- //
- // MechCommander 2
- //
- //---------------------------------------------------------------------------//
- // Copyright (C) Microsoft Corporation. All rights reserved. //
- //===========================================================================//
- #ifndef MCLIB_H
- #include "mclib.h"
- #endif
- #ifndef GAMEOBJ_H
- #include "gameobj.h"
- #endif
- #ifndef LIGHT_H
- #include "light.h"
- #endif
- #include <stdio.h>
- #define LIGHT_DEPTH_FIXUP -500
- //***************************************************************************
- // LIGHT TYPE class
- //***************************************************************************
- GameObjectPtr LightType::createInstance (void) {
- LightPtr newLight = new Light;
- if (!newLight)
- return(NULL);
- newLight->init(true, this);
- return(newLight);
- }
- //---------------------------------------------------------------------------
- void LightType::destroy (void)
- {
- ObjectType::destroy();
- }
-
- //---------------------------------------------------------------------------
- long LightType::init (FilePtr objFile, unsigned long fileSize) {
- long result = 0;
-
- FitIniFile explFile;
- result = explFile.open(objFile,fileSize);
- if (result != NO_ERR)
- return(result);
- result = explFile.seekBlock("LightData");
- if (result != NO_ERR)
- return result;
- result = explFile.readIdBoolean("OneShotFlag",oneShotFlag);
- if (result != NO_ERR)
- return result;
- result = explFile.readIdFloat("AltitudeOffset",altitudeOffset);
- if (result != NO_ERR)
- return result;
- //------------------------------------------------------------------
- // Initialize the base object Type from the current file.
- result = ObjectType::init(&explFile);
- return(result);
- }
-
- //---------------------------------------------------------------------------
- bool LightType::handleCollision (GameObjectPtr collidee, GameObjectPtr collider) {
- //-----------------------------
- // Nothing collides with light!
- return(false);
- }
- //---------------------------------------------------------------------------
- bool LightType::handleDestruction (GameObjectPtr collidee, GameObjectPtr collider) {
- //----------------------------
- // No destroy'n light, either!
- return(false);
- }
- //***************************************************************************
- // LIGHT class
- //***************************************************************************
- void Light::init (bool create) {
- setFlag(OBJECT_FLAG_JUSTCREATED, true);
- }
- //---------------------------------------------------------------------------
- long Light::update (void) {
- if (!getFlag(OBJECT_FLAG_DONE)) {
- //----------------------------------
- //-- Always force position altitude 'cause set every frame.
- position.z += ((LightTypePtr)getObjectType())->altitudeOffset;
- setPosition(position);
-
- if (getFlag(OBJECT_FLAG_JUSTCREATED)) {
- setFlag(OBJECT_FLAG_JUSTCREATED, false);
- setFlag(OBJECT_FLAG_TANGIBLE, false);
- }
-
- #ifdef USE_LIGHT_APPEARANCE
- //-----------------------------------------
- // Light is NEVER Done. Unless its done!
- bool inView = onScreen();
- lightAppearance->setInView(inView);
- long result = lightAppearance->update();
- if (!result && ((LightTypePtr)getObjectType())->oneShotFlag)
- setFlag(OBJECT_FLAG_DONE, true);
- #endif
- }
- return (true);
- }
- //---------------------------------------------------------------------------
- void Light::render (void) {
- if (gamePaused)
- onScreen();
- if (!getFlag(OBJECT_FLAG_JUSTCREATED) && (windowsVisible == turn) && !getFlag(OBJECT_FLAG_DONE)) {
- #ifdef USE_LIGHT_APPEARANCE
- lightAppearance->render(LIGHT_DEPTH_FIXUP);
- #endif
- }
- }
- //---------------------------------------------------------------------------
- void Light::destroy (void)
- {
- }
- //---------------------------------------------------------------------------
- void Light::init (bool create, ObjectTypePtr _type) {
- //-------------------------------------------
- // Initialize the Light Appearance here.
- GameObject::init(create, _type);
- setFlag(OBJECT_FLAG_JUSTCREATED, true);
- setFlag(OBJECT_FLAG_TANGIBLE, false);
- //-------------------------------------------------------------
- // The appearance is initialized here using data from the type
- #ifdef USE_LIGHT_APPEARANCE
- unsigned long appearanceType = _type->getAppearanceTypeNum();
- AppearanceTypePtr lightAppearanceType = appearanceTypeList->getAppearance(appearanceType);
- if (!lightAppearanceType)
- return(NO_APPEARANCE_TYPE_FOR_EXPL);
-
- //--------------------------------------------------------------
- // The only kind of appearanceType the explosions currently know how
- // to work with is a spriteTree. Anything else is wrong.
- if (lightAppearanceType->getAppearanceClass() == VFX_APPEAR)
- {
- lightAppearance = new VFXAppearance;
- if (!lightAppearance)
- return(NO_APPEARANCE_FOR_EXPL);
- result = lightAppearance->init((VFXAppearanceType *)lightAppearanceType, (GameObjectPtr)this);
- if (result != NO_ERR)
- return(result);
- }
- else
- {
- return(APPEARANCE_NOT_VFX_XPL);
- }
- #endif
- objectClass = KLIEG_LIGHT;
- setFlag(OBJECT_FLAG_DONE, false);
- }
- //***************************************************************************
|