/* Object list-related functions. */ #include #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; iCenterInView.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; } } }