Esempio n. 1
0
void
vsModelInstanceLodGroup::CalculateMatrixBounds( vsBox3D& out )
{
	out.Clear();
	for ( int i = 0; i < m_matrix.ItemCount(); i++ )
		out.ExpandToInclude( m_matrix[i].w );
}
Esempio n. 2
0
// 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);
	}
}
Esempio n. 3
0
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();
		}
	}
}