home *** CD-ROM | disk | FTP | other *** search
- /* Object list-related functions. */
- #include <stdio.h>
- #include "polygon.h"
-
- /* Set up the empty object list, with sentinels at both ends to
- terminate searches */
- void InitializeObjectList()
- {
- ObjectListStart.NextObject = &ObjectListEnd;
- ObjectListStart.PreviousObject = NULL;
- ObjectListStart.CenterInView.Z = INT_TO_FIXED(-32768);
- ObjectListEnd.NextObject = NULL;
- ObjectListEnd.PreviousObject = &ObjectListStart;
- ObjectListEnd.CenterInView.Z = 0x7FFFFFFFL;
- NumObjects = 0;
- }
-
- /* Adds an object to the object list, sorted by center Z coord. */
- void AddObject(Object *ObjectPtr)
- {
- Object *ObjectListPtr = ObjectListStart.NextObject;
-
- /* Find the insertion point. Guaranteed to terminate because of
- the end sentinel */
- while (ObjectPtr->CenterInView.Z > ObjectListPtr->CenterInView.Z) {
- ObjectListPtr = ObjectListPtr->NextObject;
- }
-
- /* Link in the new object */
- ObjectListPtr->PreviousObject->NextObject = ObjectPtr;
- ObjectPtr->NextObject = ObjectListPtr;
- ObjectPtr->PreviousObject = ObjectListPtr->PreviousObject;
- ObjectListPtr->PreviousObject = ObjectPtr;
- NumObjects++;
- }
-
- /* Resorts the objects in order of ascending center Z coordinate in
- view space, by moving each object in turn to the correct position
- in the object list. */
- void SortObjects()
- {
- int i;
- Object *ObjectPtr, *ObjectCmpPtr, *NextObjectPtr;
-
- /* Start checking with the second object */
- ObjectCmpPtr = ObjectListStart.NextObject;
- ObjectPtr = ObjectCmpPtr->NextObject;
- for (i=1; i<NumObjects; i++) {
- /* See if we need to move backward through the list */
- if (ObjectPtr->CenterInView.Z < ObjectCmpPtr->CenterInView.Z) {
- /* Remember where to resume sorting with the next object */
- NextObjectPtr = ObjectPtr->NextObject;
- /* Yes, move backward until we find the proper insertion
- point. Termination guaranteed because of start sentinel */
- do {
- ObjectCmpPtr = ObjectCmpPtr->PreviousObject;
- } while (ObjectPtr->CenterInView.Z <
- ObjectCmpPtr->CenterInView.Z);
-
- /* Now move the object to its new location */
- /* Unlink the object at the old location */
- ObjectPtr->PreviousObject->NextObject =
- ObjectPtr->NextObject;
- ObjectPtr->NextObject->PreviousObject =
- ObjectPtr->PreviousObject;
-
- /* Link in the object at the new location */
- ObjectCmpPtr->NextObject->PreviousObject = ObjectPtr;
- ObjectPtr->PreviousObject = ObjectCmpPtr;
- ObjectPtr->NextObject = ObjectCmpPtr->NextObject;
- ObjectCmpPtr->NextObject = ObjectPtr;
-
- /* Advance to the next object to sort */
- ObjectCmpPtr = NextObjectPtr->PreviousObject;
- ObjectPtr = NextObjectPtr;
- } else {
- /* Advance to the next object to sort */
- ObjectCmpPtr = ObjectPtr;
- ObjectPtr = ObjectPtr->NextObject;
- }
- }
- }