97 for (index = Num/2; index >= 1; index--) Downheap(index);
111 Nodes[1].Set_Key(new_key);
118 for (
int i=1; i <= Num; i++) {
119 if (Nodes[i].Get_Item() == item) {
120 float old_key = Nodes[i].Get_Key();
121 Nodes[i].Set_Key(new_key);
124 if (new_key < old_key) Downheap(i);
149 void Upheap(
int index) {
150 LODHeapNode node = Nodes[index];
151 Nodes[0].Set_Key(FLT_MAX);
152 while (Nodes[index/2] <= node) {
153 Nodes[index] = Nodes[index/2];
162 void Downheap(
int index) {
163 LODHeapNode node = Nodes[index];
164 while (index <= Num/2) {
165 int child_index = index + index;
166 if ((child_index < Num) && (Nodes[child_index] < Nodes[child_index+1])) child_index++;
167 if (node >= Nodes[child_index])
break;
168 Nodes[index] = Nodes[child_index];
177int PredictiveLODOptimizerClass::ArraySize = 0;
178int PredictiveLODOptimizerClass::NumObjects = 0;
179float PredictiveLODOptimizerClass::TotalCost = 0.0f;
180LODHeapNode * PredictiveLODOptimizerClass::VisibleObjArray1;
181LODHeapNode * PredictiveLODOptimizerClass::VisibleObjArray2;
182int PredictiveLODOptimizerClass::VisibleObjArraySize;
201 for (
int i = 0; i < NumObjects; i++) {
202 if (ObjectArray[i]) {
203 ObjectArray[i]->Release_Ref();
204 ObjectArray[i] =
NULL;
230 if (ArraySize <= NumObjects) {
231 int new_array_size = NumObjects + 100;
233 memcpy(new_array, ObjectArray,
sizeof(
RenderObjClass *) * NumObjects);
234 delete [] ObjectArray;
235 ObjectArray = new_array;
236 ArraySize = new_array_size;
244 ObjectArray[NumObjects] = robj;
245 ObjectArray[NumObjects]->
Add_Ref();
279 if (!ObjectArray || NumObjects == 0)
return;
281 AllocVisibleObjArrays(NumObjects);
288 for (
int i = 0; i < NumObjects; i++) {
296 LODHeap min_current_value_queue(NumObjects, VisibleObjArray1);
297 LODHeap max_post_increment_value_queue(NumObjects, VisibleObjArray2);
312 if (TotalCost <= max_cost) {
321 max_data = max_post_increment_value_queue.
Top()->
Get_Item();
334 while (TotalCost > max_cost) {
344 min_data = min_current_value_queue.
Top()->
Get_Item();
356 if (max_data == min_data) {
385 delete [] ObjectArray;
391 if (VisibleObjArray1)
delete[] VisibleObjArray1;
392 VisibleObjArray1=
NULL;
393 VisibleObjArray2=
NULL;
394 VisibleObjArraySize = 0;
397void PredictiveLODOptimizerClass::AllocVisibleObjArrays(
int num_objects)
399 if (VisibleObjArraySize<num_objects) {
400 VisibleObjArraySize=num_objects;
401 if (VisibleObjArray1)
delete[] VisibleObjArray1;
403 VisibleObjArray2=VisibleObjArray1+(num_objects + 1);
void Change_Key(RenderObjClass *item, float new_key)
void Change_Key_Top(float new_key)
LODHeap(int count, LODHeapNode *NodeArray)
int operator==(const LODHeapNode &node)
int operator>=(const LODHeapNode &node)
int operator<=(const LODHeapNode &node)
int operator>(const LODHeapNode &node)
int operator!=(const LODHeapNode &node)
RenderObjClass * Get_Item(void)
LODHeapNode(RenderObjClass *item, float key)
int operator<(const LODHeapNode &node)
static void Add_Object(RenderObjClass *robj)
static void Optimize_LODs(float max_cost)
virtual void Decrement_LOD(void)
virtual float Get_Post_Increment_Value(void) const
virtual void Increment_LOD(void)
virtual float Get_Cost(void) const
static const float AT_MAX_LOD
static const float AT_MIN_LOD
virtual float Get_Value(void) const