Example #1
0
MBox3d MOCamera::createMatrixOrientedBoundingBox(MMatrix4x4 * matrix)
{
	const MVector3 * points = m_frustum.getPoints();

	MVector3 min, max;
	min = max = (*matrix) * points[0];
	for(int i=1; i<8; i++)
	{
		MVector3 localPoint = (*matrix) * points[i];
		min.x = MIN(min.x, localPoint.x);
		min.y = MIN(min.y, localPoint.y);
		min.z = MIN(min.z, localPoint.z);
		max.x = MAX(max.x, localPoint.x);
		max.y = MAX(max.y, localPoint.y);
		max.z = MAX(max.z, localPoint.z);
	}

	return MBox3d(min, max);
}
Example #2
0
void MOText::prepare(void)
{
	MFont * font = getFont();
	const char * text = m_text.getData();

	if(! (strlen(text) > 0 && font)){
		m_boundingBox = MBox3d();
		return;
	}

	MVector3 * min = m_boundingBox.getMin();
	MVector3 * max = m_boundingBox.getMax();

	(*min) = (*max) = MVector3(0, 0, 0);

	float tabSize = m_size*2;
	float fontSize = (float)font->getFontSize();
	float widthFactor = font->getTextureWith() / fontSize;
	float heightFactor = font->getTextureHeight() / fontSize;
	float xc = 0, yc = 0;

	unsigned int i;
	unsigned int size = strlen(text);
	for(i=0; i<size; i++)
	{
		if(text[i] == '\n') // return
		{
			yc += m_size;
			xc = 0;
			continue;
		}

		if(text[i] == '\t') // tab
		{
			int tab = (int)(xc / tabSize) + 1;
			xc = tab*tabSize;
			continue;
		}

		// get character
		unsigned int charCode = (unsigned int)((unsigned char)text[i]);
		MCharacter * character = font->getCharacter(charCode);
		if(! character)
			continue;

		MVector2 scale = character->getScale();
		MVector2 offset = character->getOffset() * m_size;

		float width = scale.x * widthFactor * m_size;
		float height = scale.y * heightFactor * m_size;

		MVector2 charMin = MVector2(xc, yc) + offset;
		MVector2 charMax = charMin + MVector2(width, height);

		if(charMin.x < min->x)
			min->x = charMin.x;
		if(charMin.y < min->y)
			min->y = charMin.y;

		if(charMax.x > max->x)
			max->x = charMax.x;
		if(charMax.y > max->y)
			max->y = charMax.y;

		//move to next character
		xc += character->getXAdvance() * m_size;
	}

	updateLinesOffset();
}