void vsModelInstanceLodGroup::CalculateMatrixBounds( vsBox3D& out ) { out.Clear(); for ( int i = 0; i < m_matrix.ItemCount(); i++ ) out.ExpandToInclude( m_matrix[i].w ); }
// find the bounds of our matrix translations. void vsModelInstanceGroup::CalculateMatrixBounds( vsBox3D& out ) { vsBox3D a; out.Clear(); for ( int i = 0; i < m_lod.ItemCount(); i++ ) { m_lod[i]->CalculateMatrixBounds(a); out.ExpandToInclude(a); } }
void vsDisplayList::GetBoundingBox( vsBox3D &box ) { box = vsBox3D(); if ( m_instanceParent ) { return m_instanceParent->GetBoundingBox(box); } else { vsMatrix4x4 transformStack[20]; transformStack[0] = vsMatrix4x4::Identity; int transformStackLevel = 0; vsVector3D *currentVertexArray = NULL; //int currentVertexArraySize = 0; Rewind(); op *o = PopOp(); while(o) { if ( o->type == OpCode_PushMatrix4x4 ) { transformStack[transformStackLevel+1] = transformStack[transformStackLevel] * o->data.matrix4x4; transformStackLevel++; } if ( o->type == OpCode_SetMatrix4x4 ) { transformStack[++transformStackLevel] = o->data.matrix4x4; } else if ( o->type == OpCode_SetMatrices4x4 ) { vsMatrix4x4 *mat = (vsMatrix4x4*)o->data.p; transformStack[++transformStackLevel] = *mat; } else if ( o->type == OpCode_PopTransform ) { transformStackLevel--; } else if ( o->type == OpCode_VertexArray ) { vsVector3D pos; int count = o->data.GetUInt(); float *shuttle = (float *) o->data.p; currentVertexArray = (vsVector3D *)shuttle; //currentVertexArraySize = count*3; for ( int i = 0; i < count; i++ ) { pos.Set(shuttle[0],shuttle[1],shuttle[2]); pos = transformStack[transformStackLevel].ApplyTo( pos ); box.ExpandToInclude( pos ); shuttle += 3; } } else if ( o->type == OpCode_VertexBuffer ) { vsVector3D pos; vsRenderBuffer *buffer = (vsRenderBuffer *)o->data.p; currentVertexArray = buffer->GetVector3DArray(); //currentVertexArraySize = buffer->GetVector3DArraySize(); for ( int i = 0; i < buffer->GetVector3DArraySize(); i++ ) { pos = buffer->GetVector3DArray()[i]; pos = transformStack[transformStackLevel].ApplyTo( pos ); box.ExpandToInclude( pos ); } } else if ( o->type == OpCode_BindBuffer ) { vsVector3D pos; vsRenderBuffer *buffer = (vsRenderBuffer *)o->data.p; int positionCount = buffer->GetPositionCount(); for ( int i = 0; i < positionCount; i++ ) { pos = buffer->GetPosition(i); pos = transformStack[transformStackLevel].ApplyTo( pos ); box.ExpandToInclude( pos ); } } else if ( o->type == OpCode_LineListBuffer || o->type == OpCode_LineStripBuffer ) { vsRenderBuffer *buffer = (vsRenderBuffer *)o->data.p; uint16_t *shuttle = buffer->GetIntArray(); for ( int i = 0; i < buffer->GetIntArraySize(); i++ ) { uint16_t index = shuttle[i]; box.ExpandToInclude( transformStack[transformStackLevel].ApplyTo( currentVertexArray[index] ) ); } } else if ( o->type == OpCode_LineStripArray ) { uint16_t *shuttle = (uint16_t *)o->data.p; int count = o->data.GetUInt(); for ( int i = 0; i < count; i++ ) { uint16_t index = shuttle[i]; box.ExpandToInclude( transformStack[transformStackLevel].ApplyTo( currentVertexArray[index] ) ); } } o = PopOp(); } } }