summaryrefslogtreecommitdiff
path: root/3dc/OBJECT.C
diff options
context:
space:
mode:
authorSteven Fuller <relnev@icculus.org>2001-07-01 00:55:22 +0000
committerPatryk Obara <dreamer.tan@gmail.com>2019-08-20 02:09:04 +0200
commit2186d5f3f95cd74a070a490d899291648d58667a (patch)
tree55241a1afa3e1a22e0b6593a8dead0b703800f44 /3dc/OBJECT.C
parent218ca90543758a20ac326e444ca0643174ca7384 (diff)
Initial revision
Diffstat (limited to '3dc/OBJECT.C')
-rw-r--r--3dc/OBJECT.C613
1 files changed, 0 insertions, 613 deletions
diff --git a/3dc/OBJECT.C b/3dc/OBJECT.C
deleted file mode 100644
index de494a3..0000000
--- a/3dc/OBJECT.C
+++ /dev/null
@@ -1,613 +0,0 @@
-
-#include "3dc.h"
-#include "module.h"
-
-#include "stratdef.h"
-#include "sfx.h"
-
-#define UseLocalAssert Yes
-#include "ourasert.h"
-
-
-/* globals for export */
-
-int NumActiveBlocks;
-DISPLAYBLOCK *ActiveBlockList[maxobjects];
-
-
-
-
-/*
- Object Block Lists et al
-*/
-
-static int NumFreeBlocks;
-static DISPLAYBLOCK *FreeBlockList[maxobjects];
-static DISPLAYBLOCK **FreeBlockListPtr = &FreeBlockList[maxobjects-1];
-static DISPLAYBLOCK FreeBlockData[maxobjects];
-static DISPLAYBLOCK **ActiveBlockListPtr = &ActiveBlockList[0];
-
-
-/*
- Texture Animation Block Extensions
-*/
-
-static int NumFreeTxAnimBlocks;
-static TXACTRLBLK *FreeTxAnimBlockList[maxTxAnimblocks];
-static TXACTRLBLK **FreeTxAnimBlockListPtr = &FreeTxAnimBlockList[maxTxAnimblocks-1];
-static TXACTRLBLK FreeTxAnimBlockData[maxTxAnimblocks];
-
-
-
-/*
- Light Block Extensions
-*/
-
-static int NumFreeLightBlocks;
-static LIGHTBLOCK *FreeLightBlockList[maxlightblocks];
-static LIGHTBLOCK **FreeLightBlockListPtr = &FreeLightBlockList[maxlightblocks-1];
-static LIGHTBLOCK FreeLightBlockData[maxlightblocks];
-
-
-
-/*
-
- To create the free block list, pointers to "FreeBlockData[]" must be copied
- to "FreeBlockList[]".
-
- Also:
-
- "NumFreeBlocks" must be updated as "FreeBlockList[]" is created.
- "NumActiveBlocks" must be initialised to zero.
-
-*/
-void InitialiseObjectBlocks(void)
-{
-
- DISPLAYBLOCK *FreeBlkPtr = &FreeBlockData[0];
-
- NumActiveBlocks = 0;
-
- FreeBlockListPtr = &FreeBlockList[maxobjects-1];
- ActiveBlockListPtr = &ActiveBlockList[0];
-
- for(NumFreeBlocks = 0; NumFreeBlocks<maxobjects; NumFreeBlocks++) {
-
- FreeBlockList[NumFreeBlocks] = FreeBlkPtr;
-
- FreeBlkPtr++;
-
- }
-}
-
-
-/*
-
- "AllocateObjectBlock()" is identical to the routine "GetBlock"
-
-*/
-
-DISPLAYBLOCK* AllocateObjectBlock(void)
-{
-
- DISPLAYBLOCK *FreeBlkPtr = 0; /* Default to null ptr */
- int *sptr;
- int i;
-
-
- if(NumFreeBlocks) {
-
- FreeBlkPtr = *FreeBlockListPtr--;
-
- NumFreeBlocks--; /* One less free block */
-
- /* Clear the block */
-
- sptr = (int *)FreeBlkPtr;
- for(i = sizeof(DISPLAYBLOCK)/4; i!=0; i--)
- *sptr++ = 0;
- }
-
- return(FreeBlkPtr);
-}
-
-
-/*
-
- "DeallocateObjectBlock()" is identical to the routine "ReturnBlock"
-
-*/
-
-void DeallocateObjectBlock(DISPLAYBLOCK *dblockptr)
-{
- /* Deallocate the Display Block */
-
- FreeBlockListPtr++;
- *FreeBlockListPtr = dblockptr;
-
- NumFreeBlocks++; /* One more free block */
-}
-
-
-/*
- "CreateActiveObject()" calls "AllocateObjectBlock()". An active object is
- passed into the view and strategy routines unless flagged otherwise
-
- WARNING!
-
- An active object must ALWAYS be deallocated by "DestroyActiveObject()".
-*/
-
-DISPLAYBLOCK* CreateActiveObject(void)
-{
-
- DISPLAYBLOCK *dblockptr;
-
-
- dblockptr = AllocateObjectBlock();
-
- if(dblockptr) {
-
- *ActiveBlockListPtr++ = dblockptr;
-
- NumActiveBlocks++;
-
-
- }
-
- return dblockptr;
-}
-
-
-/*
-
- DestroyActiveObject()
-
- Remove the block from "ActiveBlockList".
- Use the array model because it's clearer.
-
- This function returns 0 if successful, -1 if not
-
-*/
-
-
-int DestroyActiveObject(DISPLAYBLOCK *dblockptr)
-{
- int i, light;
- TXACTRLBLK *taptr;
-
- /* If the block ptr is OK, search the Active Blocks List */
- if(dblockptr) {
-
- for(i = 0; i < NumActiveBlocks; i++) {
-
- if(ActiveBlockList[i] == dblockptr) {
-
- ActiveBlockList[i] = ActiveBlockList[NumActiveBlocks-1];
- NumActiveBlocks--;
- ActiveBlockListPtr--;
-
- DestroyActiveVDB(dblockptr->ObVDBPtr); /* Checks for null */
-
- if(dblockptr->ObNumLights) {
- for(light = dblockptr->ObNumLights - 1; light != -1; light--)
- DeleteLightBlock(dblockptr->ObLights[light], dblockptr);
- }
-
- /* If no SB, deallocate any Texture Animation Blocks */
-
- if(dblockptr->ObStrategyBlock == 0) {
-
- if(dblockptr->ObTxAnimCtrlBlks) {
-
- taptr = dblockptr->ObTxAnimCtrlBlks;
-
- while(taptr) {
-
- DeallocateTxAnimBlock(taptr);
-
- taptr = taptr->tac_next;
-
- }
-
- }
-
- }
-
-
- /* Deallocate the Lazy Morphed Points Array Pointer */
-
- #if (SupportMorphing && LazyEvaluationForMorphing)
- if(dblockptr->ObMorphedPts) {
- DeallocateMem(dblockptr->ObMorphedPts);
- dblockptr->ObMorphedPts = 0;
- }
- #endif
-
- /* KJL 16:52:43 06/01/98 - dealloc sfx block if one exists */
- if(dblockptr->SfxPtr)
- {
- DeallocateSfxBlock(dblockptr->SfxPtr);
- }
-
- DeallocateObjectBlock(dblockptr); /* Back to Free List */
-
- /* If this is the current landscape, clear the pointer */
-
- return 0;
- }
- }
- }
-
- return -1;
-}
-
-
-
-
-/*
-
- Support Functions for Texture Animation Blocks
-
-*/
-
-void InitialiseTxAnimBlocks(void)
-
-{
-
- TXACTRLBLK *FreeBlkPtr = &FreeTxAnimBlockData[0];
-
-
- FreeTxAnimBlockListPtr = &FreeTxAnimBlockList[maxTxAnimblocks-1];
-
- for(NumFreeTxAnimBlocks=0; NumFreeTxAnimBlocks < maxTxAnimblocks; NumFreeTxAnimBlocks++) {
-
- FreeTxAnimBlockList[NumFreeTxAnimBlocks] = FreeBlkPtr;
-
- FreeBlkPtr++;
-
- }
-
-}
-
-
-/*
-
- Allocate a Texture Animation Block
-
-*/
-
-TXACTRLBLK* AllocateTxAnimBlock(void)
-
-{
-
- TXACTRLBLK *FreeBlkPtr = 0; /* Default to null ptr */
- int *sptr;
- int i;
-
-
- if(NumFreeTxAnimBlocks) {
-
- FreeBlkPtr = *FreeTxAnimBlockListPtr--;
-
- NumFreeTxAnimBlocks--; /* One less free block */
-
- /* Clear the block */
-
- sptr = (int *)FreeBlkPtr;
- for(i = sizeof(TXACTRLBLK)/4; i!=0; i--)
- *sptr++ = 0;
-
- }
-
- return FreeBlkPtr;
-
-}
-
-
-/*
-
- Deallocate a Texture Animation Block
-
-*/
-
-void DeallocateTxAnimBlock(TXACTRLBLK *TxAnimblockptr)
-
-{
-
- FreeTxAnimBlockListPtr++;
-
- *FreeTxAnimBlockListPtr = TxAnimblockptr;
-
- NumFreeTxAnimBlocks++; /* One more free block */
-
-}
-
-
-/*
-
- Add a Texture Animation Block to a Display Block
-
-*/
-
-void AddTxAnimBlock(DISPLAYBLOCK *dptr, TXACTRLBLK *taptr)
-
-{
-
- TXACTRLBLK *taptr_tmp;
-
-
- if(dptr->ObTxAnimCtrlBlks) {
-
- taptr_tmp = dptr->ObTxAnimCtrlBlks;
-
- while(taptr_tmp->tac_next)
- taptr_tmp = taptr_tmp->tac_next;
-
- taptr_tmp->tac_next = taptr;
-
- }
-
- else dptr->ObTxAnimCtrlBlks = taptr;
-
-}
-
-
-
-
-
-/*
-
- Support functions for Light Blocks
-
-*/
-
-void InitialiseLightBlocks(void)
-
-{
-
- LIGHTBLOCK *FreeBlkPtr = &FreeLightBlockData[0];
-
-
- FreeLightBlockListPtr = &FreeLightBlockList[maxlightblocks-1];
-
- for(NumFreeLightBlocks=0; NumFreeLightBlocks < maxlightblocks; NumFreeLightBlocks++) {
-
- FreeLightBlockList[NumFreeLightBlocks] = FreeBlkPtr;
-
- FreeBlkPtr++;
-
- }
-
-}
-
-
-LIGHTBLOCK* AllocateLightBlock(void)
-
-{
-
- LIGHTBLOCK *FreeBlkPtr = 0; /* Default to null ptr */
- int *lptr;
- int i;
-
-
- if(NumFreeLightBlocks) {
-
- FreeBlkPtr = *FreeLightBlockListPtr--;
-
- NumFreeLightBlocks--; /* One less free block */
-
- /* Clear the block */
-
- lptr = (int *)FreeBlkPtr;
- for(i = sizeof(LIGHTBLOCK)/4; i!=0; i--)
- *lptr++ = 0;
-
- }
-
- return(FreeBlkPtr);
-
-}
-
-
-void DeallocateLightBlock(LIGHTBLOCK *lptr)
-
-{
-
- /* Not all lights come from the free light list */
-
- if(lptr->LightFlags & LFlag_WasNotAllocated) return;
-
-
- /* Make sure that this light IS from the free light list */
-
- GLOBALASSERT(
- (lptr >= FreeLightBlockData) &&
- (lptr < &FreeLightBlockData[maxlightblocks])
- );
-
-
- /* Ok to return the light */
-
- FreeLightBlockListPtr++;
-
- *FreeLightBlockListPtr = lptr;
-
- NumFreeLightBlocks++; /* One more free block */
-
-}
-
-
-/*
-
- See if there are any free slots in the dptr light block array.
- If there are, allocate a light block, place it in the list and return
- the pointer to the caller.
-
- A late addition is the passing of a light block (from somewhere, it does
- not matter where). This light block is then added rather than one being
- allocated from the free light block list.
-
-*/
-
-LIGHTBLOCK* AddLightBlock(DISPLAYBLOCK *dptr, LIGHTBLOCK *lptr_to_add)
-
-{
-
- LIGHTBLOCK **larrayptr;
- LIGHTBLOCK **freelarrayptr;
- LIGHTBLOCK *lptr = 0;
- int i, lfree;
-
-
- /* Are there any free slots? */
-
- lfree = No;
-
- larrayptr = &dptr->ObLights[0];
-
- for(i = MaxObjectLights; i!=0 && lfree == No; i--) {
-
- if(*larrayptr == 0) {
-
- freelarrayptr = larrayptr;
- lfree = Yes;
-
- }
-
- larrayptr++;
-
- }
-
- if(lfree) {
-
- if(lptr_to_add) {
-
- lptr = lptr_to_add;
-
- }
-
- else {
-
- lptr = AllocateLightBlock();
-
- }
-
- if(lptr)
- {
- *freelarrayptr = lptr;
- dptr->ObNumLights++;
- }
-
- }
-
- return lptr;
-
-}
-
-
-/*
-
- To delete a light block, copy the end block to the new free slot and
- reduce the count by one. Make sure the end block array entry is cleared.
-
-*/
-
-void DeleteLightBlock(LIGHTBLOCK *lptr, DISPLAYBLOCK *dptr)
-{
-
- int i, larrayi;
-
- DeallocateLightBlock(lptr);
-
- /* What is lptr's array index? */
-
- larrayi = -1; /* null value */
-
- for(i = 0; i < dptr->ObNumLights; i++)
- if(dptr->ObLights[i] == lptr) larrayi = i;
-
-
-
- /* Proceed only if lptr has been found in the array */
-
- if(larrayi != -1) {
-
- /* Copy the end block to that of lptr */
-
- dptr->ObLights[larrayi] = dptr->ObLights[dptr->ObNumLights - 1];
-
- /* Clear the end block array entry */
-
- dptr->ObLights[dptr->ObNumLights - 1] = 0;
-
- /* One less light in the dptr list */
-
- dptr->ObNumLights--;
-
- }
-}
-
-
-
-
-/*
-
- When running the parallel strategies, display and light block deallocation
- must only be done at the end of the frame, AFTER processor synchronisation
- and BEFORE the shadow copy.
-
-*/
-
-int DisplayAndLightBlockDeallocation(void)
-{
-
- DISPLAYBLOCK **activeblocksptr;
- DISPLAYBLOCK *dptr;
- int i, j;
- LIGHTBLOCK *lptr;
-
- if(NumActiveBlocks) {
-
- activeblocksptr = &ActiveBlockList[NumActiveBlocks - 1];
-
- for(i = NumActiveBlocks; i!=0; i--) {
-
- dptr = *activeblocksptr--;
-
- /* Deallocate Object? */
-
- if(dptr->ObFlags2 & ObFlag2_Deallocate) {
-
- DestroyActiveObject(dptr);
-
- }
-
-
- /* Deallocate any Lights? */
-
- else {
-
- if(dptr->ObNumLights) {
-
- for(j = dptr->ObNumLights - 1; j > -1; j--) {
-
- lptr = dptr->ObLights[j];
-
- if(lptr->LightFlags & LFlag_Deallocate) {
-
- DeleteLightBlock(dptr->ObLights[j], dptr);
-
- }
-
- }
-
- }
-
- }
-
- }
-
- }
- return 0;
-}