Issue found with PVS-Studio:

Many instances of a function or expression being used repeatedly, which can lower performance.

Fixed it in these cases by creating on local var, reference or pointer that's used instead.
This commit is contained in:
Areloch 2015-07-13 22:51:17 -05:00
parent ec63398042
commit 2002d74b78
38 changed files with 465 additions and 371 deletions

View file

@ -113,9 +113,11 @@ void GuiClockHud::initPersistFields()
void GuiClockHud::onRender(Point2I offset, const RectI &updateRect) void GuiClockHud::onRender(Point2I offset, const RectI &updateRect)
{ {
GFXDrawUtil* drawUtil = GFX->getDrawUtil();
// Background first // Background first
if (mShowFill) if (mShowFill)
GFX->getDrawUtil()->drawRectFill(updateRect, mFillColor); drawUtil->drawRectFill(updateRect, mFillColor);
// Convert ms time into hours, minutes and seconds. // Convert ms time into hours, minutes and seconds.
S32 time = S32(getTime()); S32 time = S32(getTime());
@ -129,13 +131,13 @@ void GuiClockHud::onRender(Point2I offset, const RectI &updateRect)
// Center the text // Center the text
offset.x += (getWidth() - mProfile->mFont->getStrWidth((const UTF8 *)buf)) / 2; offset.x += (getWidth() - mProfile->mFont->getStrWidth((const UTF8 *)buf)) / 2;
offset.y += (getHeight() - mProfile->mFont->getHeight()) / 2; offset.y += (getHeight() - mProfile->mFont->getHeight()) / 2;
GFX->getDrawUtil()->setBitmapModulation(mTextColor); drawUtil->setBitmapModulation(mTextColor);
GFX->getDrawUtil()->drawText(mProfile->mFont, offset, buf); drawUtil->drawText(mProfile->mFont, offset, buf);
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
// Border last // Border last
if (mShowFrame) if (mShowFrame)
GFX->getDrawUtil()->drawRect(updateRect, mFrameColor); drawUtil->drawRect(updateRect, mFrameColor);
} }

View file

@ -162,10 +162,12 @@ void GuiHealthTextHud::onRender(Point2I offset, const RectI &updateRect)
else else
mValue = 100 - (100 * control->getDamageValue()); mValue = 100 - (100 * control->getDamageValue());
} }
GFXDrawUtil* drawUtil = GFX->getDrawUtil();
// If enabled draw background first // If enabled draw background first
if (mShowFill) if (mShowFill)
GFX->getDrawUtil()->drawRectFill(updateRect, mFillColor); drawUtil->drawRectFill(updateRect, mFillColor);
// Prepare text and center it // Prepare text and center it
S32 val = (S32)mValue; S32 val = (S32)mValue;
@ -190,11 +192,11 @@ void GuiHealthTextHud::onRender(Point2I offset, const RectI &updateRect)
} }
} }
GFX->getDrawUtil()->setBitmapModulation(tColor); drawUtil->setBitmapModulation(tColor);
GFX->getDrawUtil()->drawText(mProfile->mFont, offset, buf); drawUtil->drawText(mProfile->mFont, offset, buf);
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
// If enabled draw the border last // If enabled draw the border last
if (mShowFrame) if (mShowFrame)
GFX->getDrawUtil()->drawRect(updateRect, mFrameColor); drawUtil->drawRect(updateRect, mFrameColor);
} }

View file

@ -301,18 +301,20 @@ void GuiShapeNameHud::drawName(Point2I offset, const char *name, F32 opacity)
offset.x -= width / 2; offset.x -= width / 2;
offset.y -= height / 2; offset.y -= height / 2;
GFXDrawUtil* drawUtil = GFX->getDrawUtil();
// Background fill first // Background fill first
if (mShowLabelFill) if (mShowLabelFill)
GFX->getDrawUtil()->drawRectFill(RectI(offset, extent), mLabelFillColor); drawUtil->drawRectFill(RectI(offset, extent), mLabelFillColor);
// Deal with opacity and draw. // Deal with opacity and draw.
mTextColor.alpha = opacity; mTextColor.alpha = opacity;
GFX->getDrawUtil()->setBitmapModulation(mTextColor); drawUtil->setBitmapModulation(mTextColor);
GFX->getDrawUtil()->drawText(mProfile->mFont, offset + mLabelPadding, name); drawUtil->drawText(mProfile->mFont, offset + mLabelPadding, name);
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
// Border last // Border last
if (mShowLabelFrame) if (mShowLabelFrame)
GFX->getDrawUtil()->drawRect(RectI(offset, extent), mLabelFrameColor); drawUtil->drawRect(RectI(offset, extent), mLabelFrameColor);
} }

View file

@ -1171,8 +1171,10 @@ DefineEngineMethod( TSStatic, changeMaterial, void, ( const char* mapTo, Materia
return; return;
} }
TSMaterialList* shapeMaterialList = object->getShape()->materialList;
// Check the mapTo name exists for this shape // Check the mapTo name exists for this shape
S32 matIndex = object->getShape()->materialList->getMaterialNameList().find_next(String(mapTo)); S32 matIndex = shapeMaterialList->getMaterialNameList().find_next(String(mapTo));
if (matIndex < 0) if (matIndex < 0)
{ {
Con::errorf("TSShape::changeMaterial failed: Invalid mapTo name '%s'", mapTo); Con::errorf("TSShape::changeMaterial failed: Invalid mapTo name '%s'", mapTo);
@ -1190,13 +1192,13 @@ DefineEngineMethod( TSStatic, changeMaterial, void, ( const char* mapTo, Materia
// Replace instances with the new material being traded in. Lets make sure that we only // Replace instances with the new material being traded in. Lets make sure that we only
// target the specific targets per inst, this is actually doing more than we thought // target the specific targets per inst, this is actually doing more than we thought
delete object->getShape()->materialList->mMatInstList[matIndex]; delete shapeMaterialList->mMatInstList[matIndex];
object->getShape()->materialList->mMatInstList[matIndex] = newMat->createMatInstance(); shapeMaterialList->mMatInstList[matIndex] = newMat->createMatInstance();
// Finish up preparing the material instances for rendering // Finish up preparing the material instances for rendering
const GFXVertexFormat *flags = getGFXVertexFormat<GFXVertexPNTTB>(); const GFXVertexFormat *flags = getGFXVertexFormat<GFXVertexPNTTB>();
FeatureSet features = MATMGR->getDefaultFeatures(); FeatureSet features = MATMGR->getDefaultFeatures();
object->getShape()->materialList->getMaterialInst(matIndex)->init( features, flags ); shapeMaterialList->getMaterialInst(matIndex)->init(features, flags);
} }
DefineEngineMethod( TSStatic, getModelFile, const char *, (),, DefineEngineMethod( TSStatic, getModelFile, const char *, (),,

View file

@ -637,12 +637,13 @@ void ScatterSky::prepRenderImage( SceneRenderState *state )
return; return;
// Regular sky render instance. // Regular sky render instance.
ObjectRenderInst *ri = state->getRenderPass()->allocInst<ObjectRenderInst>(); RenderPassManager* renderPass = state->getRenderPass();
ObjectRenderInst *ri = renderPass->allocInst<ObjectRenderInst>();
ri->renderDelegate.bind( this, &ScatterSky::_render ); ri->renderDelegate.bind( this, &ScatterSky::_render );
ri->type = RenderPassManager::RIT_Sky; ri->type = RenderPassManager::RIT_Sky;
ri->defaultKey = 10; ri->defaultKey = 10;
ri->defaultKey2 = 0; ri->defaultKey2 = 0;
state->getRenderPass()->addInst( ri ); renderPass->addInst(ri);
// Debug render instance. // Debug render instance.
/* /*
@ -685,13 +686,13 @@ void ScatterSky::prepRenderImage( SceneRenderState *state )
mMatrixSet->setSceneProjection(GFX->getProjectionMatrix()); mMatrixSet->setSceneProjection(GFX->getProjectionMatrix());
mMatrixSet->setWorld(GFX->getWorldMatrix()); mMatrixSet->setWorld(GFX->getWorldMatrix());
ObjectRenderInst *ri = state->getRenderPass()->allocInst<ObjectRenderInst>(); ObjectRenderInst *ri = renderPass->allocInst<ObjectRenderInst>();
ri->renderDelegate.bind( this, &ScatterSky::_renderMoon ); ri->renderDelegate.bind( this, &ScatterSky::_renderMoon );
ri->type = RenderPassManager::RIT_Sky; ri->type = RenderPassManager::RIT_Sky;
// Render after sky objects and before CloudLayer! // Render after sky objects and before CloudLayer!
ri->defaultKey = 5; ri->defaultKey = 5;
ri->defaultKey2 = 0; ri->defaultKey2 = 0;
state->getRenderPass()->addInst( ri ); renderPass->addInst(ri);
} }
} }

View file

@ -450,10 +450,11 @@ void ForestSelectionTool::onRender2D()
F32 hscale = wwidth * 2 / F32(mEditor->getWidth()); F32 hscale = wwidth * 2 / F32(mEditor->getWidth());
F32 vscale = wheight * 2 / F32(mEditor->getHeight()); F32 vscale = wheight * 2 / F32(mEditor->getHeight());
F32 left = (mDragRect.point.x - mEditor->getPosition().x) * hscale - wwidth; Point2I editorPosition = mEditor->getPosition();
F32 right = (mDragRect.point.x - mEditor->getPosition().x + mDragRect.extent.x) * hscale - wwidth; F32 left = (mDragRect.point.x - editorPosition.x) * hscale - wwidth;
F32 top = wheight - vscale * (mDragRect.point.y - mEditor->getPosition().y); F32 right = (mDragRect.point.x - editorPosition.x + mDragRect.extent.x) * hscale - wwidth;
F32 bottom = wheight - vscale * (mDragRect.point.y - mEditor->getPosition().y + mDragRect.extent.y); F32 top = wheight - vscale * (mDragRect.point.y - editorPosition.y);
F32 bottom = wheight - vscale * (mDragRect.point.y - editorPosition.y + mDragRect.extent.y);
gDragFrustum.set(lastCameraQuery.ortho, left, right, top, bottom, lastCameraQuery.nearPlane, lastCameraQuery.farPlane, lastCameraQuery.cameraMatrix ); gDragFrustum.set(lastCameraQuery.ortho, left, right, top, bottom, lastCameraQuery.nearPlane, lastCameraQuery.farPlane, lastCameraQuery.cameraMatrix );
mForest->getData()->getItems( gDragFrustum, &mDragSelection ); mForest->getData()->getItems( gDragFrustum, &mDragSelection );

View file

@ -918,17 +918,18 @@ void GFont::importStrip(const char *fileName, U32 padding, U32 kerning)
// Allocate a new bitmap for this glyph, taking into account kerning and padding. // Allocate a new bitmap for this glyph, taking into account kerning and padding.
glyphList.increment(); glyphList.increment();
glyphList.last().bitmap = new GBitmap(mCharInfoList[i].width + kerning + 2*padding, mCharInfoList[i].height + 2*padding, false, strip->getFormat()); GlyphMap& lastGlyphMap = glyphList.last();
glyphList.last().charId = i; lastGlyphMap.bitmap = new GBitmap(mCharInfoList[i].width + kerning + 2 * padding, mCharInfoList[i].height + 2 * padding, false, strip->getFormat());
lastGlyphMap.charId = i;
// Copy the rect. // Copy the rect.
RectI ri(curWidth, getBaseline() - mCharInfoList[i].yOrigin, glyphList.last().bitmap->getWidth(), glyphList.last().bitmap->getHeight()); RectI ri(curWidth, getBaseline() - mCharInfoList[i].yOrigin, lastGlyphMap.bitmap->getWidth(), lastGlyphMap.bitmap->getHeight());
Point2I outRi(0,0); Point2I outRi(0,0);
glyphList.last().bitmap->copyRect(strip, ri, outRi); lastGlyphMap.bitmap->copyRect(strip, ri, outRi);
// Update glyph attributes. // Update glyph attributes.
mCharInfoList[i].width = glyphList.last().bitmap->getWidth(); mCharInfoList[i].width = lastGlyphMap.bitmap->getWidth();
mCharInfoList[i].height = glyphList.last().bitmap->getHeight(); mCharInfoList[i].height = lastGlyphMap.bitmap->getHeight();
mCharInfoList[i].xOffset -= kerning + padding; mCharInfoList[i].xOffset -= kerning + padding;
mCharInfoList[i].xIncrement += kerning; mCharInfoList[i].xIncrement += kerning;
mCharInfoList[i].yOffset -= padding; mCharInfoList[i].yOffset -= padding;

View file

@ -1041,7 +1041,8 @@ void GFXTextureManager::_validateTexParams( const U32 width, const U32 height,
} }
// inOutFormat is not modified by this method // inOutFormat is not modified by this method
bool chekFmt = GFX->getCardProfiler()->checkFormat( testingFormat, profile, autoGenSupp ); GFXCardProfiler* cardProfiler = GFX->getCardProfiler();
bool chekFmt = cardProfiler->checkFormat(testingFormat, profile, autoGenSupp);
if( !chekFmt ) if( !chekFmt )
{ {
@ -1057,16 +1058,16 @@ void GFXTextureManager::_validateTexParams( const U32 width, const U32 height,
{ {
case GFXFormatR8G8B8: case GFXFormatR8G8B8:
testingFormat = GFXFormatR8G8B8X8; testingFormat = GFXFormatR8G8B8X8;
chekFmt = GFX->getCardProfiler()->checkFormat( testingFormat, profile, autoGenSupp ); chekFmt = cardProfiler->checkFormat(testingFormat, profile, autoGenSupp);
break; break;
case GFXFormatA8: case GFXFormatA8:
testingFormat = GFXFormatR8G8B8A8; testingFormat = GFXFormatR8G8B8A8;
chekFmt = GFX->getCardProfiler()->checkFormat( testingFormat, profile, autoGenSupp ); chekFmt = cardProfiler->checkFormat(testingFormat, profile, autoGenSupp);
break; break;
default: default:
chekFmt = GFX->getCardProfiler()->checkFormat( testingFormat, profile, autoGenSupp ); chekFmt = cardProfiler->checkFormat(testingFormat, profile, autoGenSupp);
break; break;
} }
} }

View file

@ -114,10 +114,11 @@ void GFXVertexFormat::addElement( const String& semantic, GFXDeclType type, U32
{ {
mDirty = true; mDirty = true;
mElements.increment(); mElements.increment();
mElements.last().mStreamIndex = stream; GFXVertexElement& lastElement = mElements.last();
mElements.last().mSemantic = semantic.intern(); lastElement.mStreamIndex = stream;
mElements.last().mSemanticIndex = index; lastElement.mSemantic = semantic.intern();
mElements.last().mType = type; lastElement.mSemanticIndex = index;
lastElement.mType = type;
} }
const String& GFXVertexFormat::getDescription() const const String& GFXVertexFormat::getDescription() const

View file

@ -1091,8 +1091,9 @@ void GuiScrollCtrl::drawVScrollBar(const Point2I &offset)
} }
// Render Up Arrow. // Render Up Arrow.
GFX->getDrawUtil()->clearBitmapModulation(); GFXDrawUtil* drawUtil = GFX->getDrawUtil();
GFX->getDrawUtil()->drawBitmapSR( mTextureObject, pos, mBitmapBounds[upArrowBitmap] ); drawUtil->clearBitmapModulation();
drawUtil->drawBitmapSR(mTextureObject, pos, mBitmapBounds[upArrowBitmap]);
// Update Pos. // Update Pos.
pos.y += mBitmapBounds[upArrowBitmap].extent.y; pos.y += mBitmapBounds[upArrowBitmap].extent.y;
@ -1118,8 +1119,8 @@ void GuiScrollCtrl::drawVScrollBar(const Point2I &offset)
if ( trackRect.extent.y > 0 ) if ( trackRect.extent.y > 0 )
{ {
// Render Track. // Render Track.
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretchSR( mTextureObject, trackRect, mBitmapBounds[trackBitmap] ); drawUtil->drawBitmapStretchSR(mTextureObject, trackRect, mBitmapBounds[trackBitmap]);
} }
// Update Pos. // Update Pos.
@ -1137,8 +1138,8 @@ void GuiScrollCtrl::drawVScrollBar(const Point2I &offset)
} }
// Render Down Arrow. // Render Down Arrow.
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapSR( mTextureObject, pos, mBitmapBounds[downArrowBitmap] ); drawUtil->drawBitmapSR(mTextureObject, pos, mBitmapBounds[downArrowBitmap]);
// Render the Thumb? // Render the Thumb?
if ( !mVBarEnabled ) if ( !mVBarEnabled )
@ -1163,8 +1164,8 @@ void GuiScrollCtrl::drawVScrollBar(const Point2I &offset)
} }
// Render Thumb Top. // Render Thumb Top.
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapSR( mTextureObject, pos, mBitmapBounds[thumbBitmapTop] ); drawUtil->drawBitmapSR(mTextureObject, pos, mBitmapBounds[thumbBitmapTop]);
// Update Pos. // Update Pos.
pos.y += mBitmapBounds[thumbBitmapTop].extent.y; pos.y += mBitmapBounds[thumbBitmapTop].extent.y;
@ -1179,16 +1180,16 @@ void GuiScrollCtrl::drawVScrollBar(const Point2I &offset)
if ( thumbRect.extent.y > 0 ) if ( thumbRect.extent.y > 0 )
{ {
// Render Track. // Render Track.
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretchSR( mTextureObject, thumbRect, mBitmapBounds[thumbBitmapMiddle] ); drawUtil->drawBitmapStretchSR(mTextureObject, thumbRect, mBitmapBounds[thumbBitmapMiddle]);
} }
// Update Pos. // Update Pos.
pos.y += thumbRect.extent.y; pos.y += thumbRect.extent.y;
// Render the Thumb Bottom. // Render the Thumb Bottom.
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapSR( mTextureObject, pos, mBitmapBounds[thumbBitmapBottom] ); drawUtil->drawBitmapSR(mTextureObject, pos, mBitmapBounds[thumbBitmapBottom]);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -1215,8 +1216,9 @@ void GuiScrollCtrl::drawHScrollBar(const Point2I &offset)
} }
// Render Up Arrow. // Render Up Arrow.
GFX->getDrawUtil()->clearBitmapModulation(); GFXDrawUtil* drawUtil = GFX->getDrawUtil();
GFX->getDrawUtil()->drawBitmapSR( mTextureObject, pos, mBitmapBounds[leftArrowBitmap] ); drawUtil->clearBitmapModulation();
drawUtil->drawBitmapSR(mTextureObject, pos, mBitmapBounds[leftArrowBitmap]);
// Update Pos. // Update Pos.
pos.x += mBitmapBounds[leftArrowBitmap].extent.x; pos.x += mBitmapBounds[leftArrowBitmap].extent.x;
@ -1242,8 +1244,8 @@ void GuiScrollCtrl::drawHScrollBar(const Point2I &offset)
if ( trackRect.extent.x > 0 ) if ( trackRect.extent.x > 0 )
{ {
// Render Track. // Render Track.
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretchSR( mTextureObject, trackRect, mBitmapBounds[trackBitmap] ); drawUtil->drawBitmapStretchSR(mTextureObject, trackRect, mBitmapBounds[trackBitmap]);
} }
// Update Pos. // Update Pos.
@ -1261,8 +1263,8 @@ void GuiScrollCtrl::drawHScrollBar(const Point2I &offset)
} }
// Render Right Arrow. // Render Right Arrow.
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapSR( mTextureObject, pos, mBitmapBounds[rightArrowBitmap] ); drawUtil->drawBitmapSR(mTextureObject, pos, mBitmapBounds[rightArrowBitmap]);
// Render the Thumb? // Render the Thumb?
if ( !mHBarEnabled ) if ( !mHBarEnabled )
@ -1287,8 +1289,8 @@ void GuiScrollCtrl::drawHScrollBar(const Point2I &offset)
} }
// Render Thumb Left. // Render Thumb Left.
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapSR( mTextureObject, pos, mBitmapBounds[thumbBitmapLeft] ); drawUtil->drawBitmapSR(mTextureObject, pos, mBitmapBounds[thumbBitmapLeft]);
// Update Pos. // Update Pos.
pos.x += mBitmapBounds[thumbBitmapLeft].extent.x; pos.x += mBitmapBounds[thumbBitmapLeft].extent.x;
@ -1303,16 +1305,16 @@ void GuiScrollCtrl::drawHScrollBar(const Point2I &offset)
if ( thumbRect.extent.x > 0 ) if ( thumbRect.extent.x > 0 )
{ {
// Render Track. // Render Track.
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretchSR( mTextureObject, thumbRect, mBitmapBounds[thumbBitmapMiddle] ); drawUtil->drawBitmapStretchSR(mTextureObject, thumbRect, mBitmapBounds[thumbBitmapMiddle]);
} }
// Update Pos. // Update Pos.
pos.x += thumbRect.extent.x; pos.x += thumbRect.extent.x;
// Render the Thumb Bottom. // Render the Thumb Bottom.
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapSR( mTextureObject, pos, mBitmapBounds[thumbBitmapRight] ); drawUtil->drawBitmapSR(mTextureObject, pos, mBitmapBounds[thumbBitmapRight]);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View file

@ -1294,11 +1294,13 @@ void GuiWindowCtrl::onRender(Point2I offset, const RectI &updateRect)
winRect.extent.x += 1; winRect.extent.x += 1;
GFX->getDrawUtil()->drawRectFill(winRect, mProfile->mFillColor); GFXDrawUtil* drawUtil = GFX->getDrawUtil();
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->drawRectFill(winRect, mProfile->mFillColor);
GFX->getDrawUtil()->drawBitmapSR(mTextureObject, offset, mBitmapBounds[topBase]);
GFX->getDrawUtil()->drawBitmapSR(mTextureObject, Point2I(offset.x + getWidth() - mBitmapBounds[topBase+1].extent.x, offset.y), drawUtil->clearBitmapModulation();
drawUtil->drawBitmapSR(mTextureObject, offset, mBitmapBounds[topBase]);
drawUtil->drawBitmapSR(mTextureObject, Point2I(offset.x + getWidth() - mBitmapBounds[topBase+1].extent.x, offset.y),
mBitmapBounds[topBase + 1]); mBitmapBounds[topBase + 1]);
RectI destRect; RectI destRect;
@ -1308,7 +1310,7 @@ void GuiWindowCtrl::onRender(Point2I offset, const RectI &updateRect)
destRect.extent.y = mBitmapBounds[topBase + 2].extent.y; destRect.extent.y = mBitmapBounds[topBase + 2].extent.y;
RectI stretchRect = mBitmapBounds[topBase + 2]; RectI stretchRect = mBitmapBounds[topBase + 2];
stretchRect.inset(1,0); stretchRect.inset(1,0);
GFX->getDrawUtil()->drawBitmapStretchSR(mTextureObject, destRect, stretchRect); drawUtil->drawBitmapStretchSR(mTextureObject, destRect, stretchRect);
destRect.point.x = offset.x; destRect.point.x = offset.x;
destRect.point.y = offset.y + mBitmapBounds[topBase].extent.y; destRect.point.y = offset.y + mBitmapBounds[topBase].extent.y;
@ -1316,7 +1318,7 @@ void GuiWindowCtrl::onRender(Point2I offset, const RectI &updateRect)
destRect.extent.y = getHeight() - mBitmapBounds[topBase].extent.y - mBitmapBounds[BorderBottomLeft].extent.y; destRect.extent.y = getHeight() - mBitmapBounds[topBase].extent.y - mBitmapBounds[BorderBottomLeft].extent.y;
stretchRect = mBitmapBounds[BorderLeft]; stretchRect = mBitmapBounds[BorderLeft];
stretchRect.inset(0,1); stretchRect.inset(0,1);
GFX->getDrawUtil()->drawBitmapStretchSR(mTextureObject, destRect, stretchRect); drawUtil->drawBitmapStretchSR(mTextureObject, destRect, stretchRect);
destRect.point.x = offset.x + getWidth() - mBitmapBounds[BorderRight].extent.x; destRect.point.x = offset.x + getWidth() - mBitmapBounds[BorderRight].extent.x;
destRect.extent.x = mBitmapBounds[BorderRight].extent.x; destRect.extent.x = mBitmapBounds[BorderRight].extent.x;
@ -1325,10 +1327,10 @@ void GuiWindowCtrl::onRender(Point2I offset, const RectI &updateRect)
stretchRect = mBitmapBounds[BorderRight]; stretchRect = mBitmapBounds[BorderRight];
stretchRect.inset(0,1); stretchRect.inset(0,1);
GFX->getDrawUtil()->drawBitmapStretchSR(mTextureObject, destRect, stretchRect); drawUtil->drawBitmapStretchSR(mTextureObject, destRect, stretchRect);
GFX->getDrawUtil()->drawBitmapSR(mTextureObject, offset + Point2I(0, getHeight() - mBitmapBounds[BorderBottomLeft].extent.y), mBitmapBounds[BorderBottomLeft]); drawUtil->drawBitmapSR(mTextureObject, offset + Point2I(0, getHeight() - mBitmapBounds[BorderBottomLeft].extent.y), mBitmapBounds[BorderBottomLeft]);
GFX->getDrawUtil()->drawBitmapSR(mTextureObject, offset + getExtent() - mBitmapBounds[BorderBottomRight].extent, mBitmapBounds[BorderBottomRight]); drawUtil->drawBitmapSR(mTextureObject, offset + getExtent() - mBitmapBounds[BorderBottomRight].extent, mBitmapBounds[BorderBottomRight]);
destRect.point.x = offset.x + mBitmapBounds[BorderBottomLeft].extent.x; destRect.point.x = offset.x + mBitmapBounds[BorderBottomLeft].extent.x;
destRect.extent.x = getWidth() - mBitmapBounds[BorderBottomLeft].extent.x - mBitmapBounds[BorderBottomRight].extent.x; destRect.extent.x = getWidth() - mBitmapBounds[BorderBottomLeft].extent.x - mBitmapBounds[BorderBottomRight].extent.x;
@ -1338,13 +1340,13 @@ void GuiWindowCtrl::onRender(Point2I offset, const RectI &updateRect)
stretchRect = mBitmapBounds[BorderBottom]; stretchRect = mBitmapBounds[BorderBottom];
stretchRect.inset(1,0); stretchRect.inset(1,0);
GFX->getDrawUtil()->drawBitmapStretchSR(mTextureObject, destRect, stretchRect); drawUtil->drawBitmapStretchSR(mTextureObject, destRect, stretchRect);
// Draw the title // Draw the title
// dhc addition: copied/modded from renderJustifiedText, since we enforce a // dhc addition: copied/modded from renderJustifiedText, since we enforce a
// different color usage here. NOTE: it currently CAN overdraw the controls // different color usage here. NOTE: it currently CAN overdraw the controls
// if mis-positioned or 'scrunched' in a small width. // if mis-positioned or 'scrunched' in a small width.
GFX->getDrawUtil()->setBitmapModulation(mProfile->mFontColor); drawUtil->setBitmapModulation(mProfile->mFontColor);
S32 textWidth = mProfile->mFont->getStrWidth((const UTF8 *)mText); S32 textWidth = mProfile->mFont->getStrWidth((const UTF8 *)mText);
Point2I start(0,0); Point2I start(0,0);
@ -1359,7 +1361,7 @@ void GuiWindowCtrl::onRender(Point2I offset, const RectI &updateRect)
if( textWidth > winRect.extent.x ) start.set( 0, 0 ); if( textWidth > winRect.extent.x ) start.set( 0, 0 );
// center the vertical // center the vertical
// start.y = ( winRect.extent.y - ( font->getHeight() - 2 ) ) / 2; // start.y = ( winRect.extent.y - ( font->getHeight() - 2 ) ) / 2;
GFX->getDrawUtil()->drawText( mProfile->mFont, start + offset + mProfile->mTextOffset, mText ); drawUtil->drawText( mProfile->mFont, start + offset + mProfile->mTextOffset, mText );
// Deal with rendering the titlebar controls // Deal with rendering the titlebar controls
AssertFatal(root, "Unable to get the root GuiCanvas."); AssertFatal(root, "Unable to get the root GuiCanvas.");
@ -1378,8 +1380,8 @@ void GuiWindowCtrl::onRender(Point2I offset, const RectI &updateRect)
bmp += BmpHilite; bmp += BmpHilite;
} }
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapSR(mTextureObject, offset + mCloseButton.point, mBitmapBounds[bmp]); drawUtil->drawBitmapSR(mTextureObject, offset + mCloseButton.point, mBitmapBounds[bmp]);
} }
// Draw the maximize button // Draw the maximize button
@ -1397,8 +1399,8 @@ void GuiWindowCtrl::onRender(Point2I offset, const RectI &updateRect)
bmp += BmpHilite; bmp += BmpHilite;
} }
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapSR( mTextureObject, offset + mMaximizeButton.point, mBitmapBounds[bmp] ); drawUtil->drawBitmapSR( mTextureObject, offset + mMaximizeButton.point, mBitmapBounds[bmp] );
} }
// Draw the minimize button // Draw the minimize button
@ -1416,8 +1418,8 @@ void GuiWindowCtrl::onRender(Point2I offset, const RectI &updateRect)
bmp += BmpHilite; bmp += BmpHilite;
} }
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapSR( mTextureObject, offset + mMinimizeButton.point, mBitmapBounds[bmp] ); drawUtil->drawBitmapSR( mTextureObject, offset + mMinimizeButton.point, mBitmapBounds[bmp] );
} }
if( !mMinimized ) if( !mMinimized )

View file

@ -136,6 +136,8 @@ void GuiBitmapBorderCtrl::onRender(Point2I offset, const RectI &updateRect)
{ {
GFX->setClipRect(updateRect); GFX->setClipRect(updateRect);
GFXDrawUtil* drawUtil = GFX->getDrawUtil();
//draw the outline //draw the outline
RectI winRect; RectI winRect;
winRect.point = offset; winRect.point = offset;
@ -148,11 +150,11 @@ void GuiBitmapBorderCtrl::onRender(Point2I offset, const RectI &updateRect)
winRect.extent.y -= mBitmapBounds[BorderTop].extent.y + mBitmapBounds[BorderBottom].extent.y; winRect.extent.y -= mBitmapBounds[BorderTop].extent.y + mBitmapBounds[BorderBottom].extent.y;
if(mProfile->mOpaque) if(mProfile->mOpaque)
GFX->getDrawUtil()->drawRectFill(winRect, mProfile->mFillColor); drawUtil->drawRectFill(winRect, mProfile->mFillColor);
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapSR(mTextureObject, offset, mBitmapBounds[BorderTopLeft]); drawUtil->drawBitmapSR(mTextureObject, offset, mBitmapBounds[BorderTopLeft]);
GFX->getDrawUtil()->drawBitmapSR(mTextureObject, Point2I(offset.x + getWidth() - mBitmapBounds[BorderTopRight].extent.x, offset.y), drawUtil->drawBitmapSR(mTextureObject, Point2I(offset.x + getWidth() - mBitmapBounds[BorderTopRight].extent.x, offset.y),
mBitmapBounds[BorderTopRight]); mBitmapBounds[BorderTopRight]);
RectI destRect; RectI destRect;
@ -162,7 +164,7 @@ void GuiBitmapBorderCtrl::onRender(Point2I offset, const RectI &updateRect)
destRect.extent.y = mBitmapBounds[BorderTop].extent.y; destRect.extent.y = mBitmapBounds[BorderTop].extent.y;
RectI stretchRect = mBitmapBounds[BorderTop]; RectI stretchRect = mBitmapBounds[BorderTop];
stretchRect.inset(1,0); stretchRect.inset(1,0);
GFX->getDrawUtil()->drawBitmapStretchSR(mTextureObject, destRect, stretchRect); drawUtil->drawBitmapStretchSR(mTextureObject, destRect, stretchRect);
destRect.point.x = offset.x; destRect.point.x = offset.x;
destRect.point.y = offset.y + mBitmapBounds[BorderTopLeft].extent.y; destRect.point.y = offset.y + mBitmapBounds[BorderTopLeft].extent.y;
@ -170,7 +172,7 @@ void GuiBitmapBorderCtrl::onRender(Point2I offset, const RectI &updateRect)
destRect.extent.y = getHeight() - mBitmapBounds[BorderTopLeft].extent.y - mBitmapBounds[BorderBottomLeft].extent.y; destRect.extent.y = getHeight() - mBitmapBounds[BorderTopLeft].extent.y - mBitmapBounds[BorderBottomLeft].extent.y;
stretchRect = mBitmapBounds[BorderLeft]; stretchRect = mBitmapBounds[BorderLeft];
stretchRect.inset(0,1); stretchRect.inset(0,1);
GFX->getDrawUtil()->drawBitmapStretchSR(mTextureObject, destRect, stretchRect); drawUtil->drawBitmapStretchSR(mTextureObject, destRect, stretchRect);
destRect.point.x = offset.x + getWidth() - mBitmapBounds[BorderRight].extent.x; destRect.point.x = offset.x + getWidth() - mBitmapBounds[BorderRight].extent.x;
destRect.extent.x = mBitmapBounds[BorderRight].extent.x; destRect.extent.x = mBitmapBounds[BorderRight].extent.x;
@ -179,10 +181,10 @@ void GuiBitmapBorderCtrl::onRender(Point2I offset, const RectI &updateRect)
stretchRect = mBitmapBounds[BorderRight]; stretchRect = mBitmapBounds[BorderRight];
stretchRect.inset(0,1); stretchRect.inset(0,1);
GFX->getDrawUtil()->drawBitmapStretchSR(mTextureObject, destRect, stretchRect); drawUtil->drawBitmapStretchSR(mTextureObject, destRect, stretchRect);
GFX->getDrawUtil()->drawBitmapSR(mTextureObject, offset + Point2I(0, getHeight() - mBitmapBounds[BorderBottomLeft].extent.y), mBitmapBounds[BorderBottomLeft]); drawUtil->drawBitmapSR(mTextureObject, offset + Point2I(0, getHeight() - mBitmapBounds[BorderBottomLeft].extent.y), mBitmapBounds[BorderBottomLeft]);
GFX->getDrawUtil()->drawBitmapSR(mTextureObject, offset + getExtent() - mBitmapBounds[BorderBottomRight].extent, mBitmapBounds[BorderBottomRight]); drawUtil->drawBitmapSR(mTextureObject, offset + getExtent() - mBitmapBounds[BorderBottomRight].extent, mBitmapBounds[BorderBottomRight]);
destRect.point.x = offset.x + mBitmapBounds[BorderBottomLeft].extent.x; destRect.point.x = offset.x + mBitmapBounds[BorderBottomLeft].extent.x;
destRect.extent.x = getWidth() - mBitmapBounds[BorderBottomLeft].extent.x - mBitmapBounds[BorderBottomRight].extent.x; destRect.extent.x = getWidth() - mBitmapBounds[BorderBottomLeft].extent.x - mBitmapBounds[BorderBottomRight].extent.x;
@ -192,6 +194,6 @@ void GuiBitmapBorderCtrl::onRender(Point2I offset, const RectI &updateRect)
stretchRect = mBitmapBounds[BorderBottom]; stretchRect = mBitmapBounds[BorderBottom];
stretchRect.inset(1,0); stretchRect.inset(1,0);
GFX->getDrawUtil()->drawBitmapStretchSR(mTextureObject, destRect, stretchRect); drawUtil->drawBitmapStretchSR(mTextureObject, destRect, stretchRect);
} }
} }

View file

@ -56,6 +56,8 @@ void GuiGameListMenuCtrl::onRender(Point2I offset, const RectI &updateRect)
{ {
GuiGameListMenuProfile * profile = (GuiGameListMenuProfile *) mProfile; GuiGameListMenuProfile * profile = (GuiGameListMenuProfile *) mProfile;
GFXDrawUtil* drawUtil = GFX->getDrawUtil();
F32 xScale = (float) getWidth() / profile->getRowWidth(); F32 xScale = (float) getWidth() / profile->getRowWidth();
bool profileHasIcons = profile->hasArrows(); bool profileHasIcons = profile->hasArrows();
@ -121,19 +123,19 @@ void GuiGameListMenuCtrl::onRender(Point2I offset, const RectI &updateRect)
} }
// render the row bitmap // render the row bitmap
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretchSR(profile->mTextureObject, RectI(currentOffset, rowExtent), profile->getBitmapArrayRect(buttonTextureIndex)); drawUtil->drawBitmapStretchSR(profile->mTextureObject, RectI(currentOffset, rowExtent), profile->getBitmapArrayRect(buttonTextureIndex));
// render the row icon if it has one // render the row icon if it has one
if ((iconIndex != NO_ICON) && profileHasIcons && (! profile->getBitmapArrayRect((U32)iconIndex).extent.isZero())) if ((iconIndex != NO_ICON) && profileHasIcons && (! profile->getBitmapArrayRect((U32)iconIndex).extent.isZero()))
{ {
iconIndex += Profile::TEX_FIRST_ICON; iconIndex += Profile::TEX_FIRST_ICON;
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretchSR(profile->mTextureObject, RectI(currentOffset + iconOffset, iconExtent), profile->getBitmapArrayRect(iconIndex)); drawUtil->drawBitmapStretchSR(profile->mTextureObject, RectI(currentOffset + iconOffset, iconExtent), profile->getBitmapArrayRect(iconIndex));
} }
// render the row text // render the row text
GFX->getDrawUtil()->setBitmapModulation(fontColor); drawUtil->setBitmapModulation(fontColor);
renderJustifiedText(currentOffset + textOffset, textExtent, (*row)->mLabel); renderJustifiedText(currentOffset + textOffset, textExtent, (*row)->mLabel);
} }

View file

@ -249,8 +249,9 @@ bool GuiGradientCtrl::onAdd()
{ {
Parent::onAdd(); Parent::onAdd();
S32 l = getBounds().point.x + mSwatchFactor, r = getBounds().point.x + getBounds().extent.x - mSwatchFactor; RectI bounds = getBounds();
S32 t = getBounds().point.y, b = getBounds().point.y + getBounds().extent.y - mSwatchFactor; S32 l = bounds.point.x + mSwatchFactor, r = bounds.point.x + bounds.extent.x - mSwatchFactor;
S32 t = bounds.point.y, b = bounds.point.y + bounds.extent.y - mSwatchFactor;
mBlendRangeBox = RectI( Point2I(l, t), Point2I(r, b) ); mBlendRangeBox = RectI( Point2I(l, t), Point2I(r, b) );
setupDefaultRange(); setupDefaultRange();
@ -330,16 +331,18 @@ void GuiGradientCtrl::drawBlendRangeBox(RectI &bounds, bool vertical, Vector<Col
// Update local dimensions // Update local dimensions
mBlendRangeBox.point = globalToLocalCoord(Point2I(l, t)); mBlendRangeBox.point = globalToLocalCoord(Point2I(l, t));
mBlendRangeBox.extent = globalToLocalCoord(Point2I(r, b)); mBlendRangeBox.extent = globalToLocalCoord(Point2I(r, b));
ColorRange& firstColorRange = colorRange.first();
if(colorRange.size() == 1) // Only one color to draw if(colorRange.size() == 1) // Only one color to draw
{ {
PrimBuild::begin( GFXTriangleFan, 4 ); PrimBuild::begin( GFXTriangleFan, 4 );
PrimBuild::color( colorRange.first().swatch->getColor() ); PrimBuild::color(firstColorRange.swatch->getColor());
PrimBuild::vertex2i( l, t ); PrimBuild::vertex2i( l, t );
PrimBuild::vertex2i( l, b ); PrimBuild::vertex2i( l, b );
PrimBuild::color( colorRange.first().swatch->getColor() ); PrimBuild::color(firstColorRange.swatch->getColor());
PrimBuild::vertex2i( r, b ); PrimBuild::vertex2i( r, b );
PrimBuild::vertex2i( r, t ); PrimBuild::vertex2i( r, t );
@ -349,13 +352,13 @@ void GuiGradientCtrl::drawBlendRangeBox(RectI &bounds, bool vertical, Vector<Col
{ {
PrimBuild::begin( GFXTriangleFan, 4 ); PrimBuild::begin( GFXTriangleFan, 4 );
PrimBuild::color( colorRange.first().swatch->getColor() ); PrimBuild::color(firstColorRange.swatch->getColor());
PrimBuild::vertex2i( l, t ); PrimBuild::vertex2i( l, t );
PrimBuild::vertex2i( l, b ); PrimBuild::vertex2i( l, b );
PrimBuild::color( colorRange.first().swatch->getColor() ); PrimBuild::color(firstColorRange.swatch->getColor());
PrimBuild::vertex2i( l + colorRange.first().swatch->getPosition().x, b ); PrimBuild::vertex2i(l + firstColorRange.swatch->getPosition().x, b);
PrimBuild::vertex2i( l + colorRange.first().swatch->getPosition().x, t ); PrimBuild::vertex2i(l + firstColorRange.swatch->getPosition().x, t);
PrimBuild::end(); PrimBuild::end();
@ -377,13 +380,15 @@ void GuiGradientCtrl::drawBlendRangeBox(RectI &bounds, bool vertical, Vector<Col
PrimBuild::end(); PrimBuild::end();
} }
ColorRange& lastColorRange = colorRange.last();
PrimBuild::begin( GFXTriangleFan, 4 ); PrimBuild::begin( GFXTriangleFan, 4 );
PrimBuild::color( colorRange.last().swatch->getColor() ); PrimBuild::color(lastColorRange.swatch->getColor());
PrimBuild::vertex2i( l + colorRange.last().swatch->getPosition().x, t ); PrimBuild::vertex2i(l + lastColorRange.swatch->getPosition().x, t);
PrimBuild::vertex2i( l + colorRange.last().swatch->getPosition().x, b ); PrimBuild::vertex2i(l + lastColorRange.swatch->getPosition().x, b);
PrimBuild::color( colorRange.last().swatch->getColor() ); PrimBuild::color(lastColorRange.swatch->getColor());
PrimBuild::vertex2i( r, b ); PrimBuild::vertex2i( r, b );
PrimBuild::vertex2i( r, t ); PrimBuild::vertex2i( r, t );

View file

@ -852,6 +852,8 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
if ( mScrollDir != GuiScrollCtrl::None ) if ( mScrollDir != GuiScrollCtrl::None )
autoScroll(); autoScroll();
GFXDrawUtil* drawUtil = GFX->getDrawUtil();
RectI r( offset, getExtent() ); RectI r( offset, getExtent() );
if ( mInAction ) if ( mInAction )
{ {
@ -868,30 +870,30 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
else else
{ {
//renderSlightlyLoweredBox(r, mProfile); //renderSlightlyLoweredBox(r, mProfile);
GFX->getDrawUtil()->drawRectFill( r, mProfile->mFillColor ); drawUtil->drawRectFill( r, mProfile->mFillColor );
} }
// Draw a bitmap over the background? // Draw a bitmap over the background?
if ( mTextureDepressed ) if ( mTextureDepressed )
{ {
RectI rect(offset, mBitmapBounds); RectI rect(offset, mBitmapBounds);
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretch( mTextureDepressed, rect ); drawUtil->drawBitmapStretch( mTextureDepressed, rect );
} }
else if ( mTextureNormal ) else if ( mTextureNormal )
{ {
RectI rect(offset, mBitmapBounds); RectI rect(offset, mBitmapBounds);
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretch( mTextureNormal, rect ); drawUtil->drawBitmapStretch( mTextureNormal, rect );
} }
// Do we render a bitmap border or lines? // Do we render a bitmap border or lines?
if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) ) if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) )
{ {
GFX->getDrawUtil()->drawLine( l, t, l, b, colorWhite ); drawUtil->drawLine( l, t, l, b, colorWhite );
GFX->getDrawUtil()->drawLine( l, t, r2, t, colorWhite ); drawUtil->drawLine( l, t, r2, t, colorWhite );
GFX->getDrawUtil()->drawLine( l + 1, b, r2, b, mProfile->mBorderColor ); drawUtil->drawLine( l + 1, b, r2, b, mProfile->mBorderColor );
GFX->getDrawUtil()->drawLine( r2, t + 1, r2, b - 1, mProfile->mBorderColor ); drawUtil->drawLine( r2, t + 1, r2, b - 1, mProfile->mBorderColor );
} }
} }
@ -912,24 +914,24 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
} }
else else
{ {
GFX->getDrawUtil()->drawRectFill( r, mProfile->mFillColorHL ); drawUtil->drawRectFill( r, mProfile->mFillColorHL );
} }
// Draw a bitmap over the background? // Draw a bitmap over the background?
if ( mTextureNormal ) if ( mTextureNormal )
{ {
RectI rect( offset, mBitmapBounds ); RectI rect( offset, mBitmapBounds );
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretch( mTextureNormal, rect ); drawUtil->drawBitmapStretch( mTextureNormal, rect );
} }
// Do we render a bitmap border or lines? // Do we render a bitmap border or lines?
if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) ) if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) )
{ {
GFX->getDrawUtil()->drawLine( l, t, l, b, colorWhite ); drawUtil->drawLine( l, t, l, b, colorWhite );
GFX->getDrawUtil()->drawLine( l, t, r2, t, colorWhite ); drawUtil->drawLine( l, t, r2, t, colorWhite );
GFX->getDrawUtil()->drawLine( l + 1, b, r2, b, mProfile->mBorderColor ); drawUtil->drawLine( l + 1, b, r2, b, mProfile->mBorderColor );
GFX->getDrawUtil()->drawLine( r2, t + 1, r2, b - 1, mProfile->mBorderColor ); drawUtil->drawLine( r2, t + 1, r2, b - 1, mProfile->mBorderColor );
} }
} }
else else
@ -942,21 +944,21 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
} }
else else
{ {
GFX->getDrawUtil()->drawRectFill( r, mProfile->mFillColorNA ); drawUtil->drawRectFill( r, mProfile->mFillColorNA );
} }
// Draw a bitmap over the background? // Draw a bitmap over the background?
if ( mTextureNormal ) if ( mTextureNormal )
{ {
RectI rect(offset, mBitmapBounds); RectI rect(offset, mBitmapBounds);
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretch( mTextureNormal, rect ); drawUtil->drawBitmapStretch( mTextureNormal, rect );
} }
// Do we render a bitmap border or lines? // Do we render a bitmap border or lines?
if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) ) if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) )
{ {
GFX->getDrawUtil()->drawRect( r, mProfile->mBorderColorNA ); drawUtil->drawRect( r, mProfile->mBorderColorNA );
} }
} }
// renderSlightlyRaisedBox(r, mProfile); // Used to be the only 'else' condition to mInAction above. // renderSlightlyRaisedBox(r, mProfile); // Used to be the only 'else' condition to mInAction above.
@ -1027,8 +1029,8 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
{ {
Point2I coloredboxsize( 15, 10 ); Point2I coloredboxsize( 15, 10 );
RectI r( offset.x + mProfile->mTextOffset.x, offset.y + ( (getHeight() - coloredboxsize.y ) / 2 ), coloredboxsize.x, coloredboxsize.y ); RectI r( offset.x + mProfile->mTextOffset.x, offset.y + ( (getHeight() - coloredboxsize.y ) / 2 ), coloredboxsize.x, coloredboxsize.y );
GFX->getDrawUtil()->drawRectFill( r, boxColor); drawUtil->drawRectFill( r, boxColor);
GFX->getDrawUtil()->drawRect( r, ColorI(0,0,0)); drawUtil->drawRect( r, ColorI(0,0,0));
localStart.x += coloredboxsize.x + mProfile->mTextOffset.x; localStart.x += coloredboxsize.x + mProfile->mTextOffset.x;
} }
@ -1036,7 +1038,7 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
// Draw the text // Draw the text
Point2I globalStart = localToGlobalCoord( localStart ); Point2I globalStart = localToGlobalCoord( localStart );
ColorI fontColor = mActive ? ( mInAction ? mProfile->mFontColor : mProfile->mFontColorNA ) : mProfile->mFontColorNA; ColorI fontColor = mActive ? ( mInAction ? mProfile->mFontColor : mProfile->mFontColorNA ) : mProfile->mFontColorNA;
GFX->getDrawUtil()->setBitmapModulation( fontColor ); // was: (mProfile->mFontColor); drawUtil->setBitmapModulation( fontColor ); // was: (mProfile->mFontColor);
// Get the number of columns in the text // Get the number of columns in the text
S32 colcount = getColumnCount( mText, "\t" ); S32 colcount = getColumnCount( mText, "\t" );
@ -1048,7 +1050,7 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
// Draw the first column // Draw the first column
getColumn( mText, buff, 0, "\t" ); getColumn( mText, buff, 0, "\t" );
GFX->getDrawUtil()->drawText( mProfile->mFont, globalStart, buff, mProfile->mFontColors ); drawUtil->drawText( mProfile->mFont, globalStart, buff, mProfile->mFontColors );
// Draw the second column to the right // Draw the second column to the right
getColumn( mText, buff, 1, "\t" ); getColumn( mText, buff, 1, "\t" );
@ -1059,17 +1061,17 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
// right cap of the border. // right cap of the border.
RectI* bitmapBounds = mProfile->mBitmapArrayRects.address(); RectI* bitmapBounds = mProfile->mBitmapArrayRects.address();
Point2I textpos = localToGlobalCoord( Point2I( getWidth() - txt_w - bitmapBounds[2].extent.x, localStart.y ) ); Point2I textpos = localToGlobalCoord( Point2I( getWidth() - txt_w - bitmapBounds[2].extent.x, localStart.y ) );
GFX->getDrawUtil()->drawText( mProfile->mFont, textpos, buff, mProfile->mFontColors ); drawUtil->drawText( mProfile->mFont, textpos, buff, mProfile->mFontColors );
} else } else
{ {
Point2I textpos = localToGlobalCoord( Point2I( getWidth() - txt_w - 12, localStart.y ) ); Point2I textpos = localToGlobalCoord( Point2I( getWidth() - txt_w - 12, localStart.y ) );
GFX->getDrawUtil()->drawText( mProfile->mFont, textpos, buff, mProfile->mFontColors ); drawUtil->drawText( mProfile->mFont, textpos, buff, mProfile->mFontColors );
} }
} else } else
{ {
GFX->getDrawUtil()->drawText( mProfile->mFont, globalStart, mText, mProfile->mFontColors ); drawUtil->drawText( mProfile->mFont, globalStart, mText, mProfile->mFontColors );
} }
// If we're rendering a bitmap border, then it will take care of the arrow. // If we're rendering a bitmap border, then it will take care of the arrow.

View file

@ -1034,6 +1034,8 @@ void GuiPopUpMenuCtrlEx::onRender(Point2I offset, const RectI &updateRect)
if ( mScrollDir != GuiScrollCtrl::None ) if ( mScrollDir != GuiScrollCtrl::None )
autoScroll(); autoScroll();
GFXDrawUtil* drawUtil = GFX->getDrawUtil();
RectI r( offset, getExtent() ); RectI r( offset, getExtent() );
if ( mInAction ) if ( mInAction )
{ {
@ -1050,30 +1052,30 @@ void GuiPopUpMenuCtrlEx::onRender(Point2I offset, const RectI &updateRect)
else else
{ {
//renderSlightlyLoweredBox(r, mProfile); //renderSlightlyLoweredBox(r, mProfile);
GFX->getDrawUtil()->drawRectFill( r, mProfile->mFillColor ); drawUtil->drawRectFill( r, mProfile->mFillColor );
} }
// Draw a bitmap over the background? // Draw a bitmap over the background?
if ( mTextureDepressed ) if ( mTextureDepressed )
{ {
RectI rect(offset, mBitmapBounds); RectI rect(offset, mBitmapBounds);
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretch( mTextureDepressed, rect ); drawUtil->drawBitmapStretch( mTextureDepressed, rect );
} }
else if ( mTextureNormal ) else if ( mTextureNormal )
{ {
RectI rect(offset, mBitmapBounds); RectI rect(offset, mBitmapBounds);
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretch( mTextureNormal, rect ); drawUtil->drawBitmapStretch( mTextureNormal, rect );
} }
// Do we render a bitmap border or lines? // Do we render a bitmap border or lines?
if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) ) if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) )
{ {
GFX->getDrawUtil()->drawLine( l, t, l, b, colorWhite ); drawUtil->drawLine( l, t, l, b, colorWhite );
GFX->getDrawUtil()->drawLine( l, t, r2, t, colorWhite ); drawUtil->drawLine( l, t, r2, t, colorWhite );
GFX->getDrawUtil()->drawLine( l + 1, b, r2, b, mProfile->mBorderColor ); drawUtil->drawLine( l + 1, b, r2, b, mProfile->mBorderColor );
GFX->getDrawUtil()->drawLine( r2, t + 1, r2, b - 1, mProfile->mBorderColor ); drawUtil->drawLine( r2, t + 1, r2, b - 1, mProfile->mBorderColor );
} }
} }
@ -1094,24 +1096,24 @@ void GuiPopUpMenuCtrlEx::onRender(Point2I offset, const RectI &updateRect)
} }
else else
{ {
GFX->getDrawUtil()->drawRectFill( r, mProfile->mFillColorHL ); drawUtil->drawRectFill( r, mProfile->mFillColorHL );
} }
// Draw a bitmap over the background? // Draw a bitmap over the background?
if ( mTextureNormal ) if ( mTextureNormal )
{ {
RectI rect( offset, mBitmapBounds ); RectI rect( offset, mBitmapBounds );
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretch( mTextureNormal, rect ); drawUtil->drawBitmapStretch( mTextureNormal, rect );
} }
// Do we render a bitmap border or lines? // Do we render a bitmap border or lines?
if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) ) if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) )
{ {
GFX->getDrawUtil()->drawLine( l, t, l, b, colorWhite ); drawUtil->drawLine( l, t, l, b, colorWhite );
GFX->getDrawUtil()->drawLine( l, t, r2, t, colorWhite ); drawUtil->drawLine( l, t, r2, t, colorWhite );
GFX->getDrawUtil()->drawLine( l + 1, b, r2, b, mProfile->mBorderColor ); drawUtil->drawLine( l + 1, b, r2, b, mProfile->mBorderColor );
GFX->getDrawUtil()->drawLine( r2, t + 1, r2, b - 1, mProfile->mBorderColor ); drawUtil->drawLine( r2, t + 1, r2, b - 1, mProfile->mBorderColor );
} }
} }
else else
@ -1124,21 +1126,21 @@ void GuiPopUpMenuCtrlEx::onRender(Point2I offset, const RectI &updateRect)
} }
else else
{ {
GFX->getDrawUtil()->drawRectFill( r, mProfile->mFillColorNA ); drawUtil->drawRectFill( r, mProfile->mFillColorNA );
} }
// Draw a bitmap over the background? // Draw a bitmap over the background?
if ( mTextureNormal ) if ( mTextureNormal )
{ {
RectI rect(offset, mBitmapBounds); RectI rect(offset, mBitmapBounds);
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapStretch( mTextureNormal, rect ); drawUtil->drawBitmapStretch( mTextureNormal, rect );
} }
// Do we render a bitmap border or lines? // Do we render a bitmap border or lines?
if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) ) if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) )
{ {
GFX->getDrawUtil()->drawRect( r, mProfile->mBorderColorNA ); drawUtil->drawRect( r, mProfile->mBorderColorNA );
} }
} }
// renderSlightlyRaisedBox(r, mProfile); // Used to be the only 'else' condition to mInAction above. // renderSlightlyRaisedBox(r, mProfile); // Used to be the only 'else' condition to mInAction above.
@ -1209,8 +1211,8 @@ void GuiPopUpMenuCtrlEx::onRender(Point2I offset, const RectI &updateRect)
{ {
Point2I coloredboxsize( 15, 10 ); Point2I coloredboxsize( 15, 10 );
RectI r( offset.x + mProfile->mTextOffset.x, offset.y + ( (getHeight() - coloredboxsize.y ) / 2 ), coloredboxsize.x, coloredboxsize.y ); RectI r( offset.x + mProfile->mTextOffset.x, offset.y + ( (getHeight() - coloredboxsize.y ) / 2 ), coloredboxsize.x, coloredboxsize.y );
GFX->getDrawUtil()->drawRectFill( r, boxColor); drawUtil->drawRectFill( r, boxColor);
GFX->getDrawUtil()->drawRect( r, ColorI(0,0,0)); drawUtil->drawRect( r, ColorI(0,0,0));
localStart.x += coloredboxsize.x + mProfile->mTextOffset.x; localStart.x += coloredboxsize.x + mProfile->mTextOffset.x;
} }
@ -1218,7 +1220,7 @@ void GuiPopUpMenuCtrlEx::onRender(Point2I offset, const RectI &updateRect)
// Draw the text // Draw the text
Point2I globalStart = localToGlobalCoord( localStart ); Point2I globalStart = localToGlobalCoord( localStart );
ColorI fontColor = mActive ? ( mInAction ? mProfile->mFontColor : mProfile->mFontColorNA ) : mProfile->mFontColorNA; ColorI fontColor = mActive ? ( mInAction ? mProfile->mFontColor : mProfile->mFontColorNA ) : mProfile->mFontColorNA;
GFX->getDrawUtil()->setBitmapModulation( fontColor ); // was: (mProfile->mFontColor); drawUtil->setBitmapModulation( fontColor ); // was: (mProfile->mFontColor);
// Get the number of columns in the text // Get the number of columns in the text
S32 colcount = getColumnCount( mText, "\t" ); S32 colcount = getColumnCount( mText, "\t" );
@ -1230,7 +1232,7 @@ void GuiPopUpMenuCtrlEx::onRender(Point2I offset, const RectI &updateRect)
// Draw the first column // Draw the first column
getColumn( mText, buff, 0, "\t" ); getColumn( mText, buff, 0, "\t" );
GFX->getDrawUtil()->drawText( mProfile->mFont, globalStart, buff, mProfile->mFontColors ); drawUtil->drawText( mProfile->mFont, globalStart, buff, mProfile->mFontColors );
// Draw the second column to the right // Draw the second column to the right
getColumn( mText, buff, 1, "\t" ); getColumn( mText, buff, 1, "\t" );
@ -1241,17 +1243,17 @@ void GuiPopUpMenuCtrlEx::onRender(Point2I offset, const RectI &updateRect)
// right cap of the border. // right cap of the border.
RectI* bitmapBounds = mProfile->mBitmapArrayRects.address(); RectI* bitmapBounds = mProfile->mBitmapArrayRects.address();
Point2I textpos = localToGlobalCoord( Point2I( getWidth() - txt_w - bitmapBounds[2].extent.x, localStart.y ) ); Point2I textpos = localToGlobalCoord( Point2I( getWidth() - txt_w - bitmapBounds[2].extent.x, localStart.y ) );
GFX->getDrawUtil()->drawText( mProfile->mFont, textpos, buff, mProfile->mFontColors ); drawUtil->drawText( mProfile->mFont, textpos, buff, mProfile->mFontColors );
} else } else
{ {
Point2I textpos = localToGlobalCoord( Point2I( getWidth() - txt_w - 12, localStart.y ) ); Point2I textpos = localToGlobalCoord( Point2I( getWidth() - txt_w - 12, localStart.y ) );
GFX->getDrawUtil()->drawText( mProfile->mFont, textpos, buff, mProfile->mFontColors ); drawUtil->drawText( mProfile->mFont, textpos, buff, mProfile->mFontColors );
} }
} else } else
{ {
GFX->getDrawUtil()->drawText( mProfile->mFont, globalStart, mText, mProfile->mFontColors ); drawUtil->drawText( mProfile->mFont, globalStart, mText, mProfile->mFontColors );
} }
// If we're rendering a bitmap border, then it will take care of the arrow. // If we're rendering a bitmap border, then it will take care of the arrow.

View file

@ -363,6 +363,8 @@ void GuiSliderCtrl::onRender(Point2I offset, const RectI &updateRect)
Point2I ext(getWidth() - mShiftExtent, getHeight()); Point2I ext(getWidth() - mShiftExtent, getHeight());
RectI thumb = mThumb; RectI thumb = mThumb;
GFXDrawUtil* drawUtil = GFX->getDrawUtil();
if( mHasTexture ) if( mHasTexture )
{ {
if(mTicks > 0) if(mTicks > 0)
@ -402,12 +404,12 @@ void GuiSliderCtrl::onRender(Point2I offset, const RectI &updateRect)
S32 index = SliderButtonNormal; S32 index = SliderButtonNormal;
if(mMouseOver) if(mMouseOver)
index = SliderButtonHighlight; index = SliderButtonHighlight;
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
//left border //left border
GFX->getDrawUtil()->drawBitmapSR(mProfile->mTextureObject, Point2I(offset.x,offset.y), mBitmapBounds[SliderLineLeft]); drawUtil->drawBitmapSR(mProfile->mTextureObject, Point2I(offset.x,offset.y), mBitmapBounds[SliderLineLeft]);
//right border //right border
GFX->getDrawUtil()->drawBitmapSR(mProfile->mTextureObject, Point2I(offset.x + getWidth() - mBitmapBounds[SliderLineRight].extent.x, offset.y), mBitmapBounds[SliderLineRight]); drawUtil->drawBitmapSR(mProfile->mTextureObject, Point2I(offset.x + getWidth() - mBitmapBounds[SliderLineRight].extent.x, offset.y), mBitmapBounds[SliderLineRight]);
//draw our center piece to our slider control's border and stretch it //draw our center piece to our slider control's border and stretch it
@ -421,11 +423,11 @@ void GuiSliderCtrl::onRender(Point2I offset, const RectI &updateRect)
stretchRect = mBitmapBounds[SliderLineCenter]; stretchRect = mBitmapBounds[SliderLineCenter];
stretchRect.inset(1,0); stretchRect.inset(1,0);
GFX->getDrawUtil()->drawBitmapStretchSR(mProfile->mTextureObject, destRect, stretchRect); drawUtil->drawBitmapStretchSR(mProfile->mTextureObject, destRect, stretchRect);
//draw our control slider button //draw our control slider button
thumb.point += pos; thumb.point += pos;
GFX->getDrawUtil()->drawBitmapSR(mProfile->mTextureObject,Point2I(thumb.point.x,offset.y ),mBitmapBounds[index]); drawUtil->drawBitmapSR(mProfile->mTextureObject,Point2I(thumb.point.x,offset.y ),mBitmapBounds[index]);
} }
else if (getWidth() >= getHeight()) else if (getWidth() >= getHeight())
@ -490,8 +492,8 @@ void GuiSliderCtrl::onRender(Point2I offset, const RectI &updateRect)
else if(textStart.x + txt_w > offset.x+getWidth()) else if(textStart.x + txt_w > offset.x+getWidth())
textStart.x -=((textStart.x + txt_w) - (offset.x+getWidth())); textStart.x -=((textStart.x + txt_w) - (offset.x+getWidth()));
GFX->getDrawUtil()->setBitmapModulation(mProfile->mFontColor); drawUtil->setBitmapModulation(mProfile->mFontColor);
GFX->getDrawUtil()->drawText(mProfile->mFont, textStart, buf, mProfile->mFontColors); drawUtil->drawText(mProfile->mFont, textStart, buf, mProfile->mFontColors);
} }
renderChildControls(offset, updateRect); renderChildControls(offset, updateRect);
} }

View file

@ -465,6 +465,8 @@ bool GuiControl::defaultTooltipRender( const Point2I &hoverPos, const Point2I &c
GFont *font = mTooltipProfile->mFont; GFont *font = mTooltipProfile->mFont;
GFXDrawUtil* drawUtil = GFX->getDrawUtil();
// Support for multi-line tooltip text... // Support for multi-line tooltip text...
Vector<U32> startLineOffsets, lineLengths; Vector<U32> startLineOffsets, lineLengths;
@ -521,12 +523,12 @@ bool GuiControl::defaultTooltipRender( const Point2I &hoverPos, const Point2I &c
GFX->setClipRect( rect ); GFX->setClipRect( rect );
// Draw Filler bit, then border on top of that // Draw Filler bit, then border on top of that
GFX->getDrawUtil()->drawRectFill( rect, mTooltipProfile->mFillColor ); drawUtil->drawRectFill( rect, mTooltipProfile->mFillColor );
GFX->getDrawUtil()->drawRect( rect, mTooltipProfile->mBorderColor ); drawUtil->drawRect( rect, mTooltipProfile->mBorderColor );
// Draw the text centered in the tool tip box... // Draw the text centered in the tool tip box...
GFX->getDrawUtil()->setBitmapModulation( mTooltipProfile->mFontColor ); drawUtil->setBitmapModulation( mTooltipProfile->mFontColor );
for ( U32 i = 0; i < lineLengths.size(); i++ ) for ( U32 i = 0; i < lineLengths.size(); i++ )
{ {
@ -534,7 +536,7 @@ bool GuiControl::defaultTooltipRender( const Point2I &hoverPos, const Point2I &c
const UTF8 *line = renderTip.c_str() + startLineOffsets[i]; const UTF8 *line = renderTip.c_str() + startLineOffsets[i];
U32 lineLen = lineLengths[i]; U32 lineLen = lineLengths[i];
GFX->getDrawUtil()->drawTextN( font, start + offset, line, lineLen, mProfile->mFontColors ); drawUtil->drawTextN( font, start + offset, line, lineLen, mProfile->mFontColors );
} }
GFX->setClipRect( oldClip ); GFX->setClipRect( oldClip );

View file

@ -41,15 +41,17 @@ void renderRaisedBox( const RectI &bounds, GuiControlProfile *profile )
S32 l = bounds.point.x, r = bounds.point.x + bounds.extent.x - 1; S32 l = bounds.point.x, r = bounds.point.x + bounds.extent.x - 1;
S32 t = bounds.point.y, b = bounds.point.y + bounds.extent.y - 1; S32 t = bounds.point.y, b = bounds.point.y + bounds.extent.y - 1;
GFX->getDrawUtil()->drawRectFill( bounds, profile->mFillColor); GFXDrawUtil* drawUtil = GFX->getDrawUtil();
GFX->getDrawUtil()->drawLine(l, t, l, b - 1, colorWhite);
GFX->getDrawUtil()->drawLine(l, t, r - 1, t, colorWhite);
GFX->getDrawUtil()->drawLine(l, b, r, b, colorBlack); drawUtil->drawRectFill( bounds, profile->mFillColor);
GFX->getDrawUtil()->drawLine(r, b - 1, r, t, colorBlack); drawUtil->drawLine(l, t, l, b - 1, colorWhite);
drawUtil->drawLine(l, t, r - 1, t, colorWhite);
GFX->getDrawUtil()->drawLine(l + 1, b - 1, r - 1, b - 1, profile->mBorderColor); drawUtil->drawLine(l, b, r, b, colorBlack);
GFX->getDrawUtil()->drawLine(r - 1, b - 2, r - 1, t + 1, profile->mBorderColor); drawUtil->drawLine(r, b - 1, r, t, colorBlack);
drawUtil->drawLine(l + 1, b - 1, r - 1, b - 1, profile->mBorderColor);
drawUtil->drawLine(r - 1, b - 2, r - 1, t + 1, profile->mBorderColor);
} }
void renderSlightlyRaisedBox( const RectI &bounds, GuiControlProfile *profile ) void renderSlightlyRaisedBox( const RectI &bounds, GuiControlProfile *profile )
@ -70,16 +72,18 @@ void renderLoweredBox( const RectI &bounds, GuiControlProfile *profile )
S32 l = bounds.point.x, r = bounds.point.x + bounds.extent.x - 1; S32 l = bounds.point.x, r = bounds.point.x + bounds.extent.x - 1;
S32 t = bounds.point.y, b = bounds.point.y + bounds.extent.y - 1; S32 t = bounds.point.y, b = bounds.point.y + bounds.extent.y - 1;
GFX->getDrawUtil()->drawRectFill( bounds, profile->mFillColor); GFXDrawUtil* drawUtil = GFX->getDrawUtil();
GFX->getDrawUtil()->drawLine(l, b, r, b, colorWhite); drawUtil->drawRectFill( bounds, profile->mFillColor);
GFX->getDrawUtil()->drawLine(r, b - 1, r, t, colorWhite);
GFX->getDrawUtil()->drawLine(l, t, r - 1, t, colorBlack); drawUtil->drawLine(l, b, r, b, colorWhite);
GFX->getDrawUtil()->drawLine(l, t + 1, l, b - 1, colorBlack); drawUtil->drawLine(r, b - 1, r, t, colorWhite);
GFX->getDrawUtil()->drawLine(l + 1, t + 1, r - 2, t + 1, profile->mBorderColor); drawUtil->drawLine(l, t, r - 1, t, colorBlack);
GFX->getDrawUtil()->drawLine(l + 1, t + 2, l + 1, b - 2, profile->mBorderColor); drawUtil->drawLine(l, t + 1, l, b - 1, colorBlack);
drawUtil->drawLine(l + 1, t + 1, r - 2, t + 1, profile->mBorderColor);
drawUtil->drawLine(l + 1, t + 2, l + 1, b - 2, profile->mBorderColor);
} }
void renderSlightlyLoweredBox( const RectI &bounds, GuiControlProfile *profile ) void renderSlightlyLoweredBox( const RectI &bounds, GuiControlProfile *profile )
@ -87,11 +91,13 @@ void renderSlightlyLoweredBox( const RectI &bounds, GuiControlProfile *profile )
S32 l = bounds.point.x + 1, r = bounds.point.x + bounds.extent.x - 1; S32 l = bounds.point.x + 1, r = bounds.point.x + bounds.extent.x - 1;
S32 t = bounds.point.y + 1, b = bounds.point.y + bounds.extent.y - 1; S32 t = bounds.point.y + 1, b = bounds.point.y + bounds.extent.y - 1;
GFX->getDrawUtil()->drawRectFill( bounds, profile->mFillColor); GFXDrawUtil* drawUtil = GFX->getDrawUtil();
GFX->getDrawUtil()->drawLine(l, b, r, b, profile->mBorderColor);
GFX->getDrawUtil()->drawLine(r, t, r, b - 1, profile->mBorderColor); drawUtil->drawRectFill( bounds, profile->mFillColor);
GFX->getDrawUtil()->drawLine(l, t, l, b - 1, profile->mBorderColor); drawUtil->drawLine(l, b, r, b, profile->mBorderColor);
GFX->getDrawUtil()->drawLine(l + 1, t, r - 1, t, profile->mBorderColor); drawUtil->drawLine(r, t, r, b - 1, profile->mBorderColor);
drawUtil->drawLine(l, t, l, b - 1, profile->mBorderColor);
drawUtil->drawLine(l + 1, t, r - 1, t, profile->mBorderColor);
} }
void renderBorder( const RectI &bounds, GuiControlProfile *profile ) void renderBorder( const RectI &bounds, GuiControlProfile *profile )

View file

@ -1278,12 +1278,13 @@ void GuiMenuBar::onMouseUp(const GuiEvent &event)
void GuiMenuBar::onRender(Point2I offset, const RectI &updateRect) void GuiMenuBar::onRender(Point2I offset, const RectI &updateRect)
{ {
RectI ctrlRect(offset, getExtent()); RectI ctrlRect(offset, getExtent());
GFXDrawUtil* drawUtil = GFX->getDrawUtil();
//if opaque, fill the update rect with the fill color //if opaque, fill the update rect with the fill color
if (mProfile->mOpaque) if (mProfile->mOpaque)
GFX->getDrawUtil()->drawRectFill(RectI(offset, getExtent()), mProfile->mFillColor); drawUtil->drawRectFill(RectI(offset, getExtent()), mProfile->mFillColor);
//if there's a border, draw the border //if there's a border, draw the border
if (mProfile->mBorder) if (mProfile->mBorder)
@ -1327,20 +1328,20 @@ void GuiMenuBar::onRender(Point2I offset, const RectI &updateRect)
Point2I bitmapstart(start); Point2I bitmapstart(start);
bitmapstart.y = walk->bounds.point.y + ( walk->bounds.extent.y - rect.extent.y ) / 2; bitmapstart.y = walk->bounds.point.y + ( walk->bounds.extent.y - rect.extent.y ) / 2;
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
GFX->getDrawUtil()->drawBitmapSR( mProfile->mTextureObject, offset + bitmapstart, rect); drawUtil->drawBitmapSR( mProfile->mTextureObject, offset + bitmapstart, rect);
// Should we also draw the text? // Should we also draw the text?
if(!walk->drawBitmapOnly) if(!walk->drawBitmapOnly)
{ {
start.x += mBitmapMargin; start.x += mBitmapMargin;
GFX->getDrawUtil()->setBitmapModulation( fontColor ); drawUtil->setBitmapModulation( fontColor );
GFX->getDrawUtil()->drawText( mProfile->mFont, start + offset, walk->text, mProfile->mFontColors ); drawUtil->drawText( mProfile->mFont, start + offset, walk->text, mProfile->mFontColors );
} }
} else } else
{ {
GFX->getDrawUtil()->setBitmapModulation( fontColor ); drawUtil->setBitmapModulation( fontColor );
GFX->getDrawUtil()->drawText( mProfile->mFont, start + offset, walk->text, mProfile->mFontColors ); drawUtil->drawText( mProfile->mFont, start + offset, walk->text, mProfile->mFontColors );
} }
} }

View file

@ -287,33 +287,35 @@ void GuiRectHandles::onRender(Point2I offset, const RectI &updateRect)
Point2I size(extent.x*mHandleRect.extent.x, extent.y*mHandleRect.extent.y); Point2I size(extent.x*mHandleRect.extent.x, extent.y*mHandleRect.extent.y);
RectI box(offset+pos, size); RectI box(offset+pos, size);
GFXDrawUtil* drawUtil = GFX->getDrawUtil();
// Draw border // Draw border
GFX->getDrawUtil()->drawRect(box, handleColor); drawUtil->drawRect(box, handleColor);
// Draw each handle // Draw each handle
Point2I handleSize(mHandleSize, mHandleSize); Point2I handleSize(mHandleSize, mHandleSize);
RectI handleRect(box.point, handleSize); RectI handleRect(box.point, handleSize);
GFX->getDrawUtil()->drawRectFill(handleRect, handleColor); // Upper left drawUtil->drawRectFill(handleRect, handleColor); // Upper left
handleRect.point = Point2I(box.point.x+size.x-handleSize.x, box.point.y); handleRect.point = Point2I(box.point.x+size.x-handleSize.x, box.point.y);
GFX->getDrawUtil()->drawRectFill(handleRect, handleColor); // Upper right drawUtil->drawRectFill(handleRect, handleColor); // Upper right
handleRect.point = Point2I(box.point.x, box.point.y+size.y-handleSize.y); handleRect.point = Point2I(box.point.x, box.point.y+size.y-handleSize.y);
GFX->getDrawUtil()->drawRectFill(handleRect, handleColor); // Lower left drawUtil->drawRectFill(handleRect, handleColor); // Lower left
handleRect.point = Point2I(box.point.x+size.x-handleSize.x, box.point.y+size.y-handleSize.y); handleRect.point = Point2I(box.point.x+size.x-handleSize.x, box.point.y+size.y-handleSize.y);
GFX->getDrawUtil()->drawRectFill(handleRect, handleColor); // Lower right drawUtil->drawRectFill(handleRect, handleColor); // Lower right
Point2I halfSize = size / 2; Point2I halfSize = size / 2;
Point2I halfHandleSize = handleSize / 2; Point2I halfHandleSize = handleSize / 2;
handleRect.point = Point2I(box.point.x+halfSize.x-halfHandleSize.x, box.point.y); handleRect.point = Point2I(box.point.x+halfSize.x-halfHandleSize.x, box.point.y);
GFX->getDrawUtil()->drawRectFill(handleRect, handleColor); // Upper middle drawUtil->drawRectFill(handleRect, handleColor); // Upper middle
handleRect.point = Point2I(box.point.x+halfSize.x-halfHandleSize.x, box.point.y+size.y-handleSize.y); handleRect.point = Point2I(box.point.x+halfSize.x-halfHandleSize.x, box.point.y+size.y-handleSize.y);
GFX->getDrawUtil()->drawRectFill(handleRect, handleColor); // Lower middle drawUtil->drawRectFill(handleRect, handleColor); // Lower middle
handleRect.point = Point2I(box.point.x, box.point.y+halfSize.y-halfHandleSize.y); handleRect.point = Point2I(box.point.x, box.point.y+halfSize.y-halfHandleSize.y);
GFX->getDrawUtil()->drawRectFill(handleRect, handleColor); // Left middle drawUtil->drawRectFill(handleRect, handleColor); // Left middle
handleRect.point = Point2I(box.point.x+size.x-handleSize.x, box.point.y+halfSize.y-halfHandleSize.y); handleRect.point = Point2I(box.point.x+size.x-handleSize.x, box.point.y+halfSize.y-halfHandleSize.y);
GFX->getDrawUtil()->drawRectFill(handleRect, handleColor); // Right middle drawUtil->drawRectFill(handleRect, handleColor); // Right middle
handleRect.point = Point2I(box.point.x+halfSize.x-halfHandleSize.x, box.point.y+halfSize.y-halfHandleSize.y); handleRect.point = Point2I(box.point.x+halfSize.x-halfHandleSize.x, box.point.y+halfSize.y-halfHandleSize.y);
GFX->getDrawUtil()->drawRectFill(handleRect, handleColor); // Middle drawUtil->drawRectFill(handleRect, handleColor); // Middle
renderChildControls(offset, updateRect); renderChildControls(offset, updateRect);
} }

View file

@ -330,10 +330,11 @@ void GuiShapeEdPreview::setCurrentDetail(S32 dl)
{ {
if ( mModel ) if ( mModel )
{ {
S32 smallest = mModel->getShape()->mSmallestVisibleDL; TSShape* shape = mModel->getShape();
mModel->getShape()->mSmallestVisibleDL = mModel->getShape()->details.size()-1; S32 smallest = shape->mSmallestVisibleDL;
shape->mSmallestVisibleDL = shape->details.size() - 1;
mModel->setCurrentDetail( dl ); mModel->setCurrentDetail( dl );
mModel->getShape()->mSmallestVisibleDL = smallest; shape->mSmallestVisibleDL = smallest;
// Match the camera distance to this detail if necessary // Match the camera distance to this detail if necessary
//@todo if ( !gui->mFixedDetail ) //@todo if ( !gui->mFixedDetail )
@ -359,19 +360,21 @@ bool GuiShapeEdPreview::setObjectModel(const char* modelName)
mModel = new TSShapeInstance( model, true ); mModel = new TSShapeInstance( model, true );
AssertFatal( mModel, avar("GuiShapeEdPreview: Failed to load model %s. Please check your model name and load a valid model.", modelName )); AssertFatal( mModel, avar("GuiShapeEdPreview: Failed to load model %s. Please check your model name and load a valid model.", modelName ));
TSShape* shape = mModel->getShape();
// Initialize camera values: // Initialize camera values:
mOrbitPos = mModel->getShape()->center; mOrbitPos = shape->center;
// Set camera move and zoom speed according to model size // Set camera move and zoom speed according to model size
mMoveSpeed = mModel->getShape()->radius / sMoveScaler; mMoveSpeed = shape->radius / sMoveScaler;
mZoomSpeed = mModel->getShape()->radius / sZoomScaler; mZoomSpeed = shape->radius / sZoomScaler;
// Reset node selection // Reset node selection
mHoverNode = -1; mHoverNode = -1;
mSelectedNode = -1; mSelectedNode = -1;
mSelectedObject = -1; mSelectedObject = -1;
mSelectedObjDetail = 0; mSelectedObjDetail = 0;
mProjectedNodes.setSize( mModel->getShape()->nodes.size() ); mProjectedNodes.setSize( shape->nodes.size() );
// Reset detail stats // Reset detail stats
mCurrentDL = 0; mCurrentDL = 0;
@ -683,9 +686,11 @@ void GuiShapeEdPreview::refreshShape()
mModel->initNodeTransforms(); mModel->initNodeTransforms();
mModel->initMeshObjects(); mModel->initMeshObjects();
mProjectedNodes.setSize( mModel->getShape()->nodes.size() ); TSShape* shape = mModel->getShape();
if ( mSelectedObject >= mModel->getShape()->objects.size() ) mProjectedNodes.setSize( shape->nodes.size() );
if ( mSelectedObject >= shape->objects.size() )
{ {
mSelectedObject = -1; mSelectedObject = -1;
mSelectedObjDetail = 0; mSelectedObjDetail = 0;
@ -694,22 +699,22 @@ void GuiShapeEdPreview::refreshShape()
// Re-compute the collision mesh stats // Re-compute the collision mesh stats
mColMeshes = 0; mColMeshes = 0;
mColPolys = 0; mColPolys = 0;
for ( S32 i = 0; i < mModel->getShape()->details.size(); i++ ) for ( S32 i = 0; i < shape->details.size(); i++ )
{ {
const TSShape::Detail& det = mModel->getShape()->details[i]; const TSShape::Detail& det = shape->details[i];
const String& detName = mModel->getShape()->getName( det.nameIndex ); const String& detName = shape->getName( det.nameIndex );
if ( ( det.subShapeNum < 0 ) || !detName.startsWith( "collision-" ) ) if ( ( det.subShapeNum < 0 ) || !detName.startsWith( "collision-" ) )
continue; continue;
mColPolys += det.polyCount; mColPolys += det.polyCount;
S32 od = det.objectDetailNum; S32 od = det.objectDetailNum;
S32 start = mModel->getShape()->subShapeFirstObject[det.subShapeNum]; S32 start = shape->subShapeFirstObject[det.subShapeNum];
S32 end = start + mModel->getShape()->subShapeNumObjects[det.subShapeNum]; S32 end = start + shape->subShapeNumObjects[det.subShapeNum];
for ( S32 j = start; j < end; j++ ) for ( S32 j = start; j < end; j++ )
{ {
const TSShape::Object &obj = mModel->getShape()->objects[j]; const TSShape::Object &obj = shape->objects[j];
const TSMesh* mesh = ( od < obj.numMeshes ) ? mModel->getShape()->meshes[obj.startMeshIndex + od] : NULL; const TSMesh* mesh = ( od < obj.numMeshes ) ? shape->meshes[obj.startMeshIndex + od] : NULL;
if ( mesh ) if ( mesh )
mColMeshes++; mColMeshes++;
} }
@ -1542,10 +1547,12 @@ void GuiShapeEdPreview::renderSunDirection() const
GFXStateBlockDesc desc; GFXStateBlockDesc desc;
desc.setZReadWrite( true, true ); desc.setZReadWrite( true, true );
GFX->getDrawUtil()->drawArrow( desc, start, end, color ); GFXDrawUtil* drawUtil = GFX->getDrawUtil();
GFX->getDrawUtil()->drawArrow( desc, start + up, end + up, color );
GFX->getDrawUtil()->drawArrow( desc, start + right, end + right, color ); drawUtil->drawArrow( desc, start, end, color );
GFX->getDrawUtil()->drawArrow( desc, start + up + right, end + up + right, color ); drawUtil->drawArrow( desc, start + up, end + up, color );
drawUtil->drawArrow( desc, start + right, end + right, color );
drawUtil->drawArrow( desc, start + up + right, end + up + right, color );
} }
} }

View file

@ -206,8 +206,10 @@ void GuiProgressBitmapCtrl::onRender(Point2I offset, const RectI &updateRect)
mDim = getHeight(); mDim = getHeight();
else else
mDim = getWidth(); mDim = getWidth();
GFXDrawUtil* drawUtil = GFX->getDrawUtil();
GFX->getDrawUtil()->clearBitmapModulation(); drawUtil->clearBitmapModulation();
if(mNumberOfBitmaps == 1) if(mNumberOfBitmaps == 1)
{ {
@ -218,14 +220,14 @@ void GuiProgressBitmapCtrl::onRender(Point2I offset, const RectI &updateRect)
//drawing stretch bitmap //drawing stretch bitmap
RectI progressRect = ctrlRect; RectI progressRect = ctrlRect;
progressRect.extent.x = width; progressRect.extent.x = width;
GFX->getDrawUtil()->drawBitmapStretchSR(mProfile->mTextureObject, progressRect, mProfile->mBitmapArrayRects[0]); drawUtil->drawBitmapStretchSR(mProfile->mTextureObject, progressRect, mProfile->mBitmapArrayRects[0]);
} }
} }
else if(mNumberOfBitmaps >= 3) else if(mNumberOfBitmaps >= 3)
{ {
//drawing left-end bitmap //drawing left-end bitmap
RectI progressRectLeft(ctrlRect.point.x, ctrlRect.point.y, mDim, mDim); RectI progressRectLeft(ctrlRect.point.x, ctrlRect.point.y, mDim, mDim);
GFX->getDrawUtil()->drawBitmapStretchSR(mProfile->mTextureObject, progressRectLeft, mProfile->mBitmapArrayRects[0]); drawUtil->drawBitmapStretchSR(mProfile->mTextureObject, progressRectLeft, mProfile->mBitmapArrayRects[0]);
//draw the progress with image //draw the progress with image
S32 width = (S32)((F32)(getWidth()) * mProgress); S32 width = (S32)((F32)(getWidth()) * mProgress);
@ -237,11 +239,11 @@ void GuiProgressBitmapCtrl::onRender(Point2I offset, const RectI &updateRect)
progressRect.extent.x = (width - mDim - mDim); progressRect.extent.x = (width - mDim - mDim);
if (progressRect.extent.x < 0) if (progressRect.extent.x < 0)
progressRect.extent.x = 0; progressRect.extent.x = 0;
GFX->getDrawUtil()->drawBitmapStretchSR(mProfile->mTextureObject, progressRect, mProfile->mBitmapArrayRects[1]); drawUtil->drawBitmapStretchSR(mProfile->mTextureObject, progressRect, mProfile->mBitmapArrayRects[1]);
//drawing right-end bitmap //drawing right-end bitmap
RectI progressRectRight(progressRect.point.x + progressRect.extent.x, ctrlRect.point.y, mDim, mDim ); RectI progressRectRight(progressRect.point.x + progressRect.extent.x, ctrlRect.point.y, mDim, mDim );
GFX->getDrawUtil()->drawBitmapStretchSR(mProfile->mTextureObject, progressRectRight, mProfile->mBitmapArrayRects[2]); drawUtil->drawBitmapStretchSR(mProfile->mTextureObject, progressRectRight, mProfile->mBitmapArrayRects[2]);
} }
} }
else else
@ -249,7 +251,7 @@ void GuiProgressBitmapCtrl::onRender(Point2I offset, const RectI &updateRect)
//if there's a border, draw it //if there's a border, draw it
if (mProfile->mBorder) if (mProfile->mBorder)
GFX->getDrawUtil()->drawRect(ctrlRect, mProfile->mBorderColor); drawUtil->drawRect(ctrlRect, mProfile->mBorderColor);
Parent::onRender( offset, updateRect ); Parent::onRender( offset, updateRect );

View file

@ -575,12 +575,13 @@ void MessageVector::registerSpectator(SpectatorCallback callBack, void *spectato
} }
mSpectators.increment(); mSpectators.increment();
mSpectators.last().callback = callBack; SpectatorRef& lastSpectatorRef = mSpectators.last();
mSpectators.last().key = spectatorKey; lastSpectatorRef.callback = callBack;
lastSpectatorRef.key = spectatorKey;
// Need to message this spectator of all the lines currently inserted... // Need to message this spectator of all the lines currently inserted...
for (i = 0; i < mMessageLines.size(); i++) { for (i = 0; i < mMessageLines.size(); i++) {
(*mSpectators.last().callback)(mSpectators.last().key, (*lastSpectatorRef.callback)(lastSpectatorRef.key,
LineInserted, i); LineInserted, i);
} }
} }

View file

@ -1449,14 +1449,15 @@ void TerrainEditor::renderSelection( const Selection & sel, const ColorF & inCol
// walk the points in the selection // walk the points in the selection
for(U32 i = 0; i < sel.size(); i++) for(U32 i = 0; i < sel.size(); i++)
{ {
Point2I gPos = sel[i].mGridPoint.gridPos; GridPoint selectedGridPoint = sel[i].mGridPoint;
Point2I gPos = selectedGridPoint.gridPos;
GFXVertexPC *verts = &(vertexBuffer[i * 5]); GFXVertexPC *verts = &(vertexBuffer[i * 5]);
bool center = gridToWorld(sel[i].mGridPoint, verts[0].point); bool center = gridToWorld(selectedGridPoint, verts[0].point);
gridToWorld(Point2I(gPos.x + 1, gPos.y), verts[1].point, sel[i].mGridPoint.terrainBlock); gridToWorld(Point2I(gPos.x + 1, gPos.y), verts[1].point, selectedGridPoint.terrainBlock);
gridToWorld(Point2I(gPos.x + 1, gPos.y + 1), verts[2].point, sel[i].mGridPoint.terrainBlock); gridToWorld(Point2I(gPos.x + 1, gPos.y + 1), verts[2].point, selectedGridPoint.terrainBlock);
gridToWorld(Point2I(gPos.x, gPos.y + 1), verts[3].point, sel[i].mGridPoint.terrainBlock); gridToWorld(Point2I(gPos.x, gPos.y + 1), verts[3].point, selectedGridPoint.terrainBlock);
verts[4].point = verts[0].point; verts[4].point = verts[0].point;
F32 weight = sel[i].mWeight; F32 weight = sel[i].mWeight;

View file

@ -1631,10 +1631,11 @@ void WorldEditor::renderScreenObj( SceneObject *obj, const Point3F& projPos, con
// Save an IconObject for performing icon-click testing later. // Save an IconObject for performing icon-click testing later.
mIcons.increment(); mIcons.increment();
mIcons.last().object = obj; IconObject& lastIcon = mIcons.last();
mIcons.last().rect = renderRect; lastIcon.object = obj;
mIcons.last().dist = projPos.z; lastIcon.rect = renderRect;
mIcons.last().alpha = iconAlpha; lastIcon.dist = projPos.z;
lastIcon.alpha = iconAlpha;
} }
// //

View file

@ -1012,13 +1012,14 @@ void SceneLighting::processCache()
// go through and remove the best candidate first (sorted reverse) // go through and remove the best candidate first (sorted reverse)
while(((curCacheSize >> 10) > quota) && files.size()) while(((curCacheSize >> 10) > quota) && files.size())
{ {
curCacheSize -= files.last().mFileObject->getSize(); CacheEntry& lastFile = files.last();
curCacheSize -= lastFile.mFileObject->getSize();
// no sneaky names // no sneaky names
if(!dStrstr(files.last().mFileName, "..")) if (!dStrstr(lastFile.mFileName, ".."))
{ {
Con::warnf("Removing lighting file '%s'.", files.last().mFileName); Con::warnf("Removing lighting file '%s'.", lastFile.mFileName);
dFileDelete(files.last().mFileName); dFileDelete(lastFile.mFileName);
} }
files.pop_back(); files.pop_back();

View file

@ -811,14 +811,16 @@ void PostEffect::_setupConstants( const SceneRenderState *state )
lightDir.y * (6378.0f * 1000.0f), lightDir.y * (6378.0f * 1000.0f),
lightDir.z * (6378.0f * 1000.0f) ); lightDir.z * (6378.0f * 1000.0f) );
RectI viewPort = GFX->getViewport();
// Get the screen space sun position. // Get the screen space sun position.
MathUtils::mProjectWorldToScreen( lightPos, &sunPos, GFX->getViewport(), tmp, proj ); MathUtils::mProjectWorldToScreen(lightPos, &sunPos, viewPort, tmp, proj);
// And normalize it to the 0 to 1 range. // And normalize it to the 0 to 1 range.
sunPos.x -= (F32)GFX->getViewport().point.x; sunPos.x -= (F32)viewPort.point.x;
sunPos.y -= (F32)GFX->getViewport().point.y; sunPos.y -= (F32)viewPort.point.y;
sunPos.x /= (F32)GFX->getViewport().extent.x; sunPos.x /= (F32)viewPort.extent.x;
sunPos.y /= (F32)GFX->getViewport().extent.y; sunPos.y /= (F32)viewPort.extent.y;
mShaderConsts->set( mScreenSunPosSC, Point2F( sunPos.x, sunPos.y ) ); mShaderConsts->set( mScreenSunPosSC, Point2F( sunPos.x, sunPos.y ) );
} }

View file

@ -815,8 +815,10 @@ bool SceneCullingState::isOccludedByTerrain( SceneObject* object ) const
if( !terrain ) if( !terrain )
continue; continue;
MatrixF terrWorldTransform = terrain->getWorldTransform();
Point3F localCamPos = getCameraState().getViewPosition(); Point3F localCamPos = getCameraState().getViewPosition();
terrain->getWorldTransform().mulP( localCamPos ); terrWorldTransform.mulP(localCamPos);
F32 height; F32 height;
terrain->getHeight( Point2F( localCamPos.x, localCamPos.y ), &height ); terrain->getHeight( Point2F( localCamPos.x, localCamPos.y ), &height );
bool aboveTerrain = ( height <= localCamPos.z ); bool aboveTerrain = ( height <= localCamPos.z );
@ -837,10 +839,10 @@ bool SceneCullingState::isOccludedByTerrain( SceneObject* object ) const
Point3F ll(rBox.maxExtents.x, rBox.minExtents.y, rBox.maxExtents.z); Point3F ll(rBox.maxExtents.x, rBox.minExtents.y, rBox.maxExtents.z);
Point3F lr(rBox.maxExtents.x, rBox.maxExtents.y, rBox.maxExtents.z); Point3F lr(rBox.maxExtents.x, rBox.maxExtents.y, rBox.maxExtents.z);
terrain->getWorldTransform().mulP(ul); terrWorldTransform.mulP(ul);
terrain->getWorldTransform().mulP(ur); terrWorldTransform.mulP(ur);
terrain->getWorldTransform().mulP(ll); terrWorldTransform.mulP(ll);
terrain->getWorldTransform().mulP(lr); terrWorldTransform.mulP(lr);
Point3F xBaseL0_s = ul - localCamPos; Point3F xBaseL0_s = ul - localCamPos;
Point3F xBaseL0_e = lr - localCamPos; Point3F xBaseL0_e = lr - localCamPos;

View file

@ -1353,15 +1353,16 @@ F32 SceneContainer::containerSearchCurrRadiusDist()
return 0.0; return 0.0;
Point3F pos; Point3F pos;
(*mSearchList[mCurrSearchPos])->getWorldBox().getCenter(&pos); Box3F worldBox = (*mSearchList[mCurrSearchPos])->getWorldBox();
worldBox.getCenter(&pos);
F32 dist = (pos - mSearchReferencePoint).len(); F32 dist = (pos - mSearchReferencePoint).len();
F32 min = (*mSearchList[mCurrSearchPos])->getWorldBox().len_x(); F32 min = worldBox.len_x();
if ((*mSearchList[mCurrSearchPos])->getWorldBox().len_y() < min) if (worldBox.len_y() < min)
min = (*mSearchList[mCurrSearchPos])->getWorldBox().len_y(); min = worldBox.len_y();
if ((*mSearchList[mCurrSearchPos])->getWorldBox().len_z() < min) if (worldBox.len_z() < min)
min = (*mSearchList[mCurrSearchPos])->getWorldBox().len_z(); min = worldBox.len_z();
dist -= min; dist -= min;
if (dist < 0) if (dist < 0)

View file

@ -279,10 +279,11 @@ void TerrainConvex::getFeatures(const MatrixF& mat,const VectorF& n, ConvexFeatu
cf->mFaceList.increment(numFaces); cf->mFaceList.increment(numFaces);
for (i = 0; i < numFaces; i++) for (i = 0; i < numFaces; i++)
{ {
cf->mFaceList[faceListStart + i].normal = normal[fp[i * 4 + 0]]; ConvexFeature::Face& face = cf->mFaceList[faceListStart + i];
cf->mFaceList[faceListStart + i].vertex[0] = vertexCount + fp[i * 4 + 1]; face.normal = normal[fp[i * 4 + 0]];
cf->mFaceList[faceListStart + i].vertex[1] = vertexCount + fp[i * 4 + 2]; face.vertex[0] = vertexCount + fp[i * 4 + 1];
cf->mFaceList[faceListStart + i].vertex[2] = vertexCount + fp[i * 4 + 3]; face.vertex[1] = vertexCount + fp[i * 4 + 2];
face.vertex[2] = vertexCount + fp[i * 4 + 3];
} }
} }

View file

@ -283,11 +283,12 @@ void TSShapeLoader::recurseSubshape(AppNode* appNode, S32 parentIndex, bool recu
// Create the 3space node // Create the 3space node
shape->nodes.increment(); shape->nodes.increment();
shape->nodes.last().nameIndex = shape->addName(nodeName); TSShape::Node& lastNode = shape->nodes.last();
shape->nodes.last().parentIndex = parentIndex; lastNode.nameIndex = shape->addName(nodeName);
shape->nodes.last().firstObject = -1; lastNode.parentIndex = parentIndex;
shape->nodes.last().firstChild = -1; lastNode.firstObject = -1;
shape->nodes.last().nextSibling = -1; lastNode.firstChild = -1;
lastNode.nextSibling = -1;
// Add the AppNode to a matching list (so AppNodes can be accessed using 3space // Add the AppNode to a matching list (so AppNodes can be accessed using 3space
// node indices) // node indices)
@ -323,12 +324,14 @@ void TSShapeLoader::recurseSubshape(AppNode* appNode, S32 parentIndex, bool recu
appNode->getBool("BB::INCLUDE_POLES", includePoles); appNode->getBool("BB::INCLUDE_POLES", includePoles);
S32 detIndex = shape->addDetail( "bbDetail", size, -1 ); S32 detIndex = shape->addDetail( "bbDetail", size, -1 );
shape->details[detIndex].bbEquatorSteps = numEquatorSteps;
shape->details[detIndex].bbPolarSteps = numPolarSteps; TSShape::Detail& detIndexDetail = shape->details[detIndex];
shape->details[detIndex].bbDetailLevel = dl; detIndexDetail.bbEquatorSteps = numEquatorSteps;
shape->details[detIndex].bbDimension = dim; detIndexDetail.bbPolarSteps = numPolarSteps;
shape->details[detIndex].bbIncludePoles = includePoles; detIndexDetail.bbDetailLevel = dl;
shape->details[detIndex].bbPolarAngle = polarAngle; detIndexDetail.bbDimension = dim;
detIndexDetail.bbIncludePoles = includePoles;
detIndexDetail.bbPolarAngle = polarAngle;
} }
} }
} }
@ -462,10 +465,11 @@ void TSShapeLoader::generateObjects()
if (!lastName || (meshNames[iMesh] != *lastName)) if (!lastName || (meshNames[iMesh] != *lastName))
{ {
shape->objects.increment(); shape->objects.increment();
shape->objects.last().nameIndex = shape->addName(meshNames[iMesh]); TSShape::Object& lastObject = shape->objects.last();
shape->objects.last().nodeIndex = subshape->objNodes[iMesh]; lastObject.nameIndex = shape->addName(meshNames[iMesh]);
shape->objects.last().startMeshIndex = appMeshes.size(); lastObject.nodeIndex = subshape->objNodes[iMesh];
shape->objects.last().numMeshes = 0; lastObject.startMeshIndex = appMeshes.size();
lastObject.numMeshes = 0;
lastName = &meshNames[iMesh]; lastName = &meshNames[iMesh];
} }
@ -1190,10 +1194,12 @@ void TSShapeLoader::install()
shape->meshes.push_back(NULL); shape->meshes.push_back(NULL);
shape->objects.increment(); shape->objects.increment();
shape->objects.last().nameIndex = shape->addName("dummy");
shape->objects.last().nodeIndex = 0; TSShape::Object& lastObject = shape->objects.last();
shape->objects.last().startMeshIndex = 0; lastObject.nameIndex = shape->addName("dummy");
shape->objects.last().numMeshes = 1; lastObject.nodeIndex = 0;
lastObject.startMeshIndex = 0;
lastObject.numMeshes = 1;
shape->objectStates.increment(); shape->objectStates.increment();
shape->objectStates.last().frameIndex = 0; shape->objectStates.last().frameIndex = 0;

View file

@ -88,16 +88,18 @@ void TSShapeInstance::animateNodes(S32 ss)
{ {
TSThread * th = mThreadList[i]; TSThread * th = mThreadList[i];
if (th->getSequence()->isBlend()) const TSShape::Sequence* threadSequence = th->getSequence();
if (threadSequence->isBlend())
{ {
// blend sequences need default (if not set by other sequence) // blend sequences need default (if not set by other sequence)
// break rather than continue because the rest will be blends too // break rather than continue because the rest will be blends too
firstBlend = i; firstBlend = i;
break; break;
} }
rotBeenSet.takeAway(th->getSequence()->rotationMatters); rotBeenSet.takeAway(threadSequence->rotationMatters);
tranBeenSet.takeAway(th->getSequence()->translationMatters); tranBeenSet.takeAway(threadSequence->translationMatters);
scaleBeenSet.takeAway(th->getSequence()->scaleMatters); scaleBeenSet.takeAway(threadSequence->scaleMatters);
} }
rotBeenSet.takeAway(mCallbackNodes); rotBeenSet.takeAway(mCallbackNodes);
rotBeenSet.takeAway(mHandsOffNodes); rotBeenSet.takeAway(mHandsOffNodes);
@ -576,9 +578,12 @@ void TSShapeInstance::handleBlendSequence(TSThread * thread, S32 a, S32 b)
S32 jrot=0; S32 jrot=0;
S32 jtrans=0; S32 jtrans=0;
S32 jscale=0; S32 jscale=0;
TSIntegerSet nodeMatters = thread->getSequence()->translationMatters;
nodeMatters.overlap(thread->getSequence()->rotationMatters); const TSShape::Sequence* threadSequence = thread->getSequence();
nodeMatters.overlap(thread->getSequence()->scaleMatters);
TSIntegerSet nodeMatters = threadSequence->translationMatters;
nodeMatters.overlap(threadSequence->rotationMatters);
nodeMatters.overlap(threadSequence->scaleMatters);
nodeMatters.takeAway(mHandsOffNodes); nodeMatters.takeAway(mHandsOffNodes);
S32 start = nodeMatters.start(); S32 start = nodeMatters.start();
S32 end = b; S32 end = b;
@ -587,50 +592,50 @@ void TSShapeInstance::handleBlendSequence(TSThread * thread, S32 a, S32 b)
// skip nodes outside of this detail // skip nodes outside of this detail
if (start<a || mDisableBlendNodes.test(nodeIndex)) if (start<a || mDisableBlendNodes.test(nodeIndex))
{ {
if (thread->getSequence()->rotationMatters.test(nodeIndex)) if (threadSequence->rotationMatters.test(nodeIndex))
jrot++; jrot++;
if (thread->getSequence()->translationMatters.test(nodeIndex)) if (threadSequence->translationMatters.test(nodeIndex))
jtrans++; jtrans++;
if (thread->getSequence()->scaleMatters.test(nodeIndex)) if (threadSequence->scaleMatters.test(nodeIndex))
jscale++; jscale++;
continue; continue;
} }
MatrixF mat(true); MatrixF mat(true);
if (thread->getSequence()->rotationMatters.test(nodeIndex)) if (threadSequence->rotationMatters.test(nodeIndex))
{ {
QuatF q1,q2; QuatF q1,q2;
mShape->getRotation(*thread->getSequence(),thread->keyNum1,jrot,&q1); mShape->getRotation(*threadSequence,thread->keyNum1,jrot,&q1);
mShape->getRotation(*thread->getSequence(),thread->keyNum2,jrot,&q2); mShape->getRotation(*threadSequence,thread->keyNum2,jrot,&q2);
QuatF quat; QuatF quat;
TSTransform::interpolate(q1,q2,thread->keyPos,&quat); TSTransform::interpolate(q1,q2,thread->keyPos,&quat);
TSTransform::setMatrix(quat,&mat); TSTransform::setMatrix(quat,&mat);
jrot++; jrot++;
} }
if (thread->getSequence()->translationMatters.test(nodeIndex)) if (threadSequence->translationMatters.test(nodeIndex))
{ {
const Point3F & p1 = mShape->getTranslation(*thread->getSequence(),thread->keyNum1,jtrans); const Point3F & p1 = mShape->getTranslation(*threadSequence,thread->keyNum1,jtrans);
const Point3F & p2 = mShape->getTranslation(*thread->getSequence(),thread->keyNum2,jtrans); const Point3F & p2 = mShape->getTranslation(*threadSequence,thread->keyNum2,jtrans);
Point3F p; Point3F p;
TSTransform::interpolate(p1,p2,thread->keyPos,&p); TSTransform::interpolate(p1,p2,thread->keyPos,&p);
mat.setColumn(3,p); mat.setColumn(3,p);
jtrans++; jtrans++;
} }
if (thread->getSequence()->scaleMatters.test(nodeIndex)) if (threadSequence->scaleMatters.test(nodeIndex))
{ {
if (thread->getSequence()->animatesUniformScale()) if (threadSequence->animatesUniformScale())
{ {
F32 s1 = mShape->getUniformScale(*thread->getSequence(),thread->keyNum1,jscale); F32 s1 = mShape->getUniformScale(*threadSequence,thread->keyNum1,jscale);
F32 s2 = mShape->getUniformScale(*thread->getSequence(),thread->keyNum2,jscale); F32 s2 = mShape->getUniformScale(*threadSequence,thread->keyNum2,jscale);
F32 scale = TSTransform::interpolate(s1,s2,thread->keyPos); F32 scale = TSTransform::interpolate(s1,s2,thread->keyPos);
TSTransform::applyScale(scale,&mat); TSTransform::applyScale(scale,&mat);
} }
else if (animatesAlignedScale()) else if (animatesAlignedScale())
{ {
Point3F s1 = mShape->getAlignedScale(*thread->getSequence(),thread->keyNum1,jscale); Point3F s1 = mShape->getAlignedScale(*threadSequence,thread->keyNum1,jscale);
Point3F s2 = mShape->getAlignedScale(*thread->getSequence(),thread->keyNum2,jscale); Point3F s2 = mShape->getAlignedScale(*threadSequence,thread->keyNum2,jscale);
Point3F scale; Point3F scale;
TSTransform::interpolate(s1,s2,thread->keyPos,&scale); TSTransform::interpolate(s1,s2,thread->keyPos,&scale);
TSTransform::applyScale(scale,&mat); TSTransform::applyScale(scale,&mat);
@ -638,8 +643,8 @@ void TSShapeInstance::handleBlendSequence(TSThread * thread, S32 a, S32 b)
else else
{ {
TSScale s1,s2; TSScale s1,s2;
mShape->getArbitraryScale(*thread->getSequence(),thread->keyNum1,jscale,&s1); mShape->getArbitraryScale(*threadSequence,thread->keyNum1,jscale,&s1);
mShape->getArbitraryScale(*thread->getSequence(),thread->keyNum2,jscale,&s2); mShape->getArbitraryScale(*threadSequence,thread->keyNum2,jscale,&s2);
TSScale scale; TSScale scale;
TSTransform::interpolate(s1,s2,thread->keyPos,&scale); TSTransform::interpolate(s1,s2,thread->keyPos,&scale);
TSTransform::applyScale(scale,&mat); TSTransform::applyScale(scale,&mat);
@ -686,15 +691,17 @@ void TSShapeInstance::animateVisibility(S32 ss)
{ {
TSThread * th = mThreadList[i]; TSThread * th = mThreadList[i];
const TSShape::Sequence* threadSequence = th->getSequence();
// For better or worse, object states are stored together (frame, // For better or worse, object states are stored together (frame,
// matFrame, visibility all in one structure). Thus, indexing into // matFrame, visibility all in one structure). Thus, indexing into
// object state array for animation for any of these attributes needs to // object state array for animation for any of these attributes needs to
// take into account whether or not the other attributes are also animated. // take into account whether or not the other attributes are also animated.
// The object states should eventually be separated (like the node states were) // The object states should eventually be separated (like the node states were)
// in order to save memory and save the following step. // in order to save memory and save the following step.
TSIntegerSet objectMatters = th->getSequence()->frameMatters; TSIntegerSet objectMatters = threadSequence->frameMatters;
objectMatters.overlap(th->getSequence()->matFrameMatters); objectMatters.overlap(threadSequence->matFrameMatters);
objectMatters.overlap(th->getSequence()->visMatters); objectMatters.overlap(threadSequence->visMatters);
// skip to beginning of this sub-shape // skip to beginning of this sub-shape
S32 j=0; S32 j=0;
@ -702,10 +709,10 @@ void TSShapeInstance::animateVisibility(S32 ss)
S32 end = b; S32 end = b;
for (S32 objectIndex = start; objectIndex<end; objectMatters.next(objectIndex), j++) for (S32 objectIndex = start; objectIndex<end; objectMatters.next(objectIndex), j++)
{ {
if (!beenSet.test(objectIndex) && th->getSequence()->visMatters.test(objectIndex)) if (!beenSet.test(objectIndex) && threadSequence->visMatters.test(objectIndex))
{ {
F32 state1 = mShape->getObjectState(*th->getSequence(),th->keyNum1,j).vis; F32 state1 = mShape->getObjectState(*threadSequence,th->keyNum1,j).vis;
F32 state2 = mShape->getObjectState(*th->getSequence(),th->keyNum2,j).vis; F32 state2 = mShape->getObjectState(*threadSequence,th->keyNum2,j).vis;
if ((state1-state2) * (state1-state2) > 0.99f) if ((state1-state2) * (state1-state2) > 0.99f)
// goes from 0 to 1 -- discreet jump // goes from 0 to 1 -- discreet jump
mMeshObjects[objectIndex].visible = th->keyPos<0.5f ? state1 : state2; mMeshObjects[objectIndex].visible = th->keyPos<0.5f ? state1 : state2;
@ -747,15 +754,17 @@ void TSShapeInstance::animateFrame(S32 ss)
{ {
TSThread * th = mThreadList[i]; TSThread * th = mThreadList[i];
const TSShape::Sequence* threadSequence = th->getSequence();
// For better or worse, object states are stored together (frame, // For better or worse, object states are stored together (frame,
// matFrame, visibility all in one structure). Thus, indexing into // matFrame, visibility all in one structure). Thus, indexing into
// object state array for animation for any of these attributes needs to // object state array for animation for any of these attributes needs to
// take into account whether or not the other attributes are also animated. // take into account whether or not the other attributes are also animated.
// The object states should eventually be separated (like the node states were) // The object states should eventually be separated (like the node states were)
// in order to save memory and save the following step. // in order to save memory and save the following step.
TSIntegerSet objectMatters = th->getSequence()->frameMatters; TSIntegerSet objectMatters = threadSequence->frameMatters;
objectMatters.overlap(th->getSequence()->matFrameMatters); objectMatters.overlap(threadSequence->matFrameMatters);
objectMatters.overlap(th->getSequence()->visMatters); objectMatters.overlap(threadSequence->visMatters);
// skip to beginning of this sub-shape // skip to beginning of this sub-shape
S32 j=0; S32 j=0;
@ -763,10 +772,10 @@ void TSShapeInstance::animateFrame(S32 ss)
S32 end = b; S32 end = b;
for (S32 objectIndex = start; objectIndex<end; objectMatters.next(objectIndex), j++) for (S32 objectIndex = start; objectIndex<end; objectMatters.next(objectIndex), j++)
{ {
if (!beenSet.test(objectIndex) && th->getSequence()->frameMatters.test(objectIndex)) if (!beenSet.test(objectIndex) && threadSequence->frameMatters.test(objectIndex))
{ {
S32 key = (th->keyPos<0.5f) ? th->keyNum1 : th->keyNum2; S32 key = (th->keyPos<0.5f) ? th->keyNum1 : th->keyNum2;
mMeshObjects[objectIndex].frame = mShape->getObjectState(*th->getSequence(),key,j).frameIndex; mMeshObjects[objectIndex].frame = mShape->getObjectState(*threadSequence,key,j).frameIndex;
// record change so that later threads don't over-write us... // record change so that later threads don't over-write us...
beenSet.set(objectIndex); beenSet.set(objectIndex);
@ -802,15 +811,17 @@ void TSShapeInstance::animateMatFrame(S32 ss)
{ {
TSThread * th = mThreadList[i]; TSThread * th = mThreadList[i];
const TSShape::Sequence* threadSequence = th->getSequence();
// For better or worse, object states are stored together (frame, // For better or worse, object states are stored together (frame,
// matFrame, visibility all in one structure). Thus, indexing into // matFrame, visibility all in one structure). Thus, indexing into
// object state array for animation for any of these attributes needs to // object state array for animation for any of these attributes needs to
// take into account whether or not the other attributes are also animated. // take into account whether or not the other attributes are also animated.
// The object states should eventually be separated (like the node states were) // The object states should eventually be separated (like the node states were)
// in order to save memory and save the following step. // in order to save memory and save the following step.
TSIntegerSet objectMatters = th->getSequence()->frameMatters; TSIntegerSet objectMatters = threadSequence->frameMatters;
objectMatters.overlap(th->getSequence()->matFrameMatters); objectMatters.overlap(threadSequence->matFrameMatters);
objectMatters.overlap(th->getSequence()->visMatters); objectMatters.overlap(threadSequence->visMatters);
// skip to beginining of this sub-shape // skip to beginining of this sub-shape
S32 j=0; S32 j=0;
@ -818,10 +829,10 @@ void TSShapeInstance::animateMatFrame(S32 ss)
S32 end = b; S32 end = b;
for (S32 objectIndex = start; objectIndex<end; objectMatters.next(objectIndex), j++) for (S32 objectIndex = start; objectIndex<end; objectMatters.next(objectIndex), j++)
{ {
if (!beenSet.test(objectIndex) && th->getSequence()->matFrameMatters.test(objectIndex)) if (!beenSet.test(objectIndex) && threadSequence->matFrameMatters.test(objectIndex))
{ {
S32 key = (th->keyPos<0.5f) ? th->keyNum1 : th->keyNum2; S32 key = (th->keyPos<0.5f) ? th->keyNum1 : th->keyNum2;
mMeshObjects[objectIndex].matFrame = mShape->getObjectState(*th->getSequence(),key,j).matFrameIndex; mMeshObjects[objectIndex].matFrame = mShape->getObjectState(*threadSequence,key,j).matFrameIndex;
// record change so that later threads don't over-write us... // record change so that later threads don't over-write us...
beenSet.set(objectIndex); beenSet.set(objectIndex);

View file

@ -171,19 +171,21 @@ void TSShapeInstance::dump(Stream & stream)
bool foundSkin = false; bool foundSkin = false;
for (i=0; i<mShape->objects.size(); i++) for (i=0; i<mShape->objects.size(); i++)
{ {
if (mShape->objects[i].nodeIndex<0) // must be a skin TSShape::Object& currentObject = mShape->objects[i];
if (currentObject.nodeIndex<0) // must be a skin
{ {
if (!foundSkin) if (!foundSkin)
dumpLine("\r\n Skins:\r\n"); dumpLine("\r\n Skins:\r\n");
foundSkin=true; foundSkin=true;
const char * skinName = ""; const char * skinName = "";
S32 nameIndex = mShape->objects[i].nameIndex; S32 nameIndex = currentObject.nameIndex;
if (nameIndex>=0) if (nameIndex>=0)
skinName = mShape->getName(nameIndex); skinName = mShape->getName(nameIndex);
dumpLine(avar(" Skin %s with following details: ",skinName)); dumpLine(avar(" Skin %s with following details: ",skinName));
for (S32 num=0; num<mShape->objects[i].numMeshes; num++) for (S32 num=0; num<currentObject.numMeshes; num++)
{ {
if (mShape->meshes[mShape->objects[i].startMeshIndex + num]) if (mShape->meshes[currentObject.startMeshIndex + num])
dumpLine(avar(" %i",(S32)mShape->details[num].size)); dumpLine(avar(" %i",(S32)mShape->details[num].size));
} }
dumpLine("\r\n"); dumpLine("\r\n");

View file

@ -447,11 +447,13 @@ bool TSMesh::getFeatures( S32 frame, const MatrixF& mat, const VectorF&, ConvexF
cf->mVertexList[base + indices[start + j + 2]]); cf->mVertexList[base + indices[start + j + 2]]);
cf->mFaceList.increment(); cf->mFaceList.increment();
cf->mFaceList.last().normal = plane;
cf->mFaceList.last().vertex[0] = base + indices[start + j + 0]; ConvexFeature::Face& lastFace = cf->mFaceList.last();
cf->mFaceList.last().vertex[1] = base + indices[start + j + 1]; lastFace.normal = plane;
cf->mFaceList.last().vertex[2] = base + indices[start + j + 2];
lastFace.vertex[0] = base + indices[start + j + 0];
lastFace.vertex[1] = base + indices[start + j + 1];
lastFace.vertex[2] = base + indices[start + j + 2];
for ( U32 l = 0; l < 3; l++ ) for ( U32 l = 0; l < 3; l++ )
{ {
@ -514,8 +516,9 @@ bool TSMesh::getFeatures( S32 frame, const MatrixF& mat, const VectorF&, ConvexF
S32 k; S32 k;
for ( k = 0; k < cf->mEdgeList.size(); k++ ) for ( k = 0; k < cf->mEdgeList.size(); k++ )
{ {
if ( cf->mEdgeList[k].vertex[0] == newEdge0 && ConvexFeature::Edge currentEdge = cf->mEdgeList[k];
cf->mEdgeList[k].vertex[1] == newEdge1) if (currentEdge.vertex[0] == newEdge0 &&
currentEdge.vertex[1] == newEdge1)
{ {
found = true; found = true;
break; break;
@ -1437,10 +1440,12 @@ void TSSkinMesh::createBatchData()
} }
bt->_tmpVec->increment(); bt->_tmpVec->increment();
bt->_tmpVec->last().vert = batchData.initialVerts[curTransform.vertexIndex];
bt->_tmpVec->last().normal = batchData.initialNorms[curTransform.vertexIndex]; BatchData::BatchedVertWeight& tempLast = bt->_tmpVec->last();
bt->_tmpVec->last().weight = transformOp.weight; tempLast.vert = batchData.initialVerts[curTransform.vertexIndex];
bt->_tmpVec->last().vidx = curTransform.vertexIndex; tempLast.normal = batchData.initialNorms[curTransform.vertexIndex];
tempLast.weight = transformOp.weight;
tempLast.vidx = curTransform.vertexIndex;
} }
} }

View file

@ -443,10 +443,11 @@ void MeshFit::addSphere( F32 radius, const Point3F& center )
mesh->computeBounds(); mesh->computeBounds();
mMeshes.increment(); mMeshes.increment();
mMeshes.last().type = MeshFit::Sphere; MeshFit::Mesh& lastMesh = mMeshes.last();
mMeshes.last().transform.identity(); lastMesh.type = MeshFit::Sphere;
mMeshes.last().transform.setPosition( center ); lastMesh.transform.identity();
mMeshes.last().tsmesh = mesh; lastMesh.transform.setPosition(center);
lastMesh.tsmesh = mesh;
} }
void MeshFit::fitSphere() void MeshFit::fitSphere()
@ -603,11 +604,12 @@ void MeshFit::fitK_DOP( const Vector<Point3F>& planes )
// Create TSMesh from convex hull // Create TSMesh from convex hull
mMeshes.increment(); mMeshes.increment();
mMeshes.last().type = MeshFit::Hull; MeshFit::Mesh& lastMesh = mMeshes.last();
mMeshes.last().transform.identity(); lastMesh.type = MeshFit::Hull;
mMeshes.last().tsmesh = createTriMesh( result.mOutputVertices, result.mNumOutputVertices, lastMesh.transform.identity();
lastMesh.tsmesh = createTriMesh(result.mOutputVertices, result.mNumOutputVertices,
result.mIndices, result.mNumFaces ); result.mIndices, result.mNumFaces );
mMeshes.last().tsmesh->computeBounds(); lastMesh.tsmesh->computeBounds();
} }
//--------------------------- //---------------------------
@ -702,10 +704,11 @@ void MeshFit::fitConvexHulls( U32 depth, F32 mergeThreshold, F32 concavityThresh
{ {
// Create TSMesh from convex hull // Create TSMesh from convex hull
mMeshes.increment(); mMeshes.increment();
mMeshes.last().type = MeshFit::Hull; MeshFit::Mesh& lastMesh = mMeshes.last();
mMeshes.last().transform.identity(); lastMesh.type = MeshFit::Hull;
mMeshes.last().tsmesh = createTriMesh( result.mVertices, result.mVcount, result.mIndices, result.mTcount ); lastMesh.transform.identity();
mMeshes.last().tsmesh->computeBounds(); lastMesh.tsmesh = createTriMesh(result.mVertices, result.mVcount, result.mIndices, result.mTcount);
lastMesh.tsmesh->computeBounds();
} }
} }

View file

@ -286,13 +286,15 @@ void TSThread::activateTriggers(F32 a, F32 b)
S32 bIndex = numTriggers+firstTrigger; // initialized to handle case where pos past all triggers S32 bIndex = numTriggers+firstTrigger; // initialized to handle case where pos past all triggers
for (i=firstTrigger; i<numTriggers+firstTrigger; i++) for (i=firstTrigger; i<numTriggers+firstTrigger; i++)
{ {
TSShape::Trigger currentTrigger = shape->triggers[i];
// is a between this trigger and previous one... // is a between this trigger and previous one...
if (a>lastPos && a<=shape->triggers[i].pos) if (a>lastPos && a <= currentTrigger.pos)
aIndex = i; aIndex = i;
// is b between this trigger and previous one... // is b between this trigger and previous one...
if (b>lastPos && b<=shape->triggers[i].pos) if (b>lastPos && b <= currentTrigger.pos)
bIndex = i; bIndex = i;
lastPos = shape->triggers[i].pos; lastPos = currentTrigger.pos;
} }
// activate triggers between aIndex and bIndex (depends on direction) // activate triggers between aIndex and bIndex (depends on direction)
@ -578,19 +580,21 @@ void TSShapeInstance::transitionToSequence(TSThread * thread, S32 seq, F32 pos,
setDirty(AllDirtyMask); setDirty(AllDirtyMask);
mGroundThread = NULL; mGroundThread = NULL;
if (mScaleCurrentlyAnimated && !thread->getSequence()->animatesScale()) const TSShape::Sequence* threadSequence = thread->getSequence();
if (mScaleCurrentlyAnimated && !threadSequence->animatesScale())
checkScaleCurrentlyAnimated(); checkScaleCurrentlyAnimated();
else if (!mScaleCurrentlyAnimated && thread->getSequence()->animatesScale()) else if (!mScaleCurrentlyAnimated && threadSequence->animatesScale())
mScaleCurrentlyAnimated=true; mScaleCurrentlyAnimated=true;
mTransitionRotationNodes.overlap(thread->transitionData.oldRotationNodes); mTransitionRotationNodes.overlap(thread->transitionData.oldRotationNodes);
mTransitionRotationNodes.overlap(thread->getSequence()->rotationMatters); mTransitionRotationNodes.overlap(threadSequence->rotationMatters);
mTransitionTranslationNodes.overlap(thread->transitionData.oldTranslationNodes); mTransitionTranslationNodes.overlap(thread->transitionData.oldTranslationNodes);
mTransitionTranslationNodes.overlap(thread->getSequence()->translationMatters); mTransitionTranslationNodes.overlap(threadSequence->translationMatters);
mTransitionScaleNodes.overlap(thread->transitionData.oldScaleNodes); mTransitionScaleNodes.overlap(thread->transitionData.oldScaleNodes);
mTransitionScaleNodes.overlap(thread->getSequence()->scaleMatters); mTransitionScaleNodes.overlap(threadSequence->scaleMatters);
// if we aren't already in the list of transition threads, add us now // if we aren't already in the list of transition threads, add us now
S32 i; S32 i;

View file

@ -182,10 +182,11 @@ BOOL Win32WindowManager::MonitorRegionEnumProc(HMONITOR hMonitor, HDC hdcMonitor
Vector<RectI> * regions = (Vector<RectI>*)dwData; Vector<RectI> * regions = (Vector<RectI>*)dwData;
regions->increment(); regions->increment();
regions->last().point.x = lprcMonitor->left; RectI& lastRegion = regions->last();
regions->last().point.y = lprcMonitor->top; lastRegion.point.x = lprcMonitor->left;
regions->last().extent.x = lprcMonitor->right - lprcMonitor->left; lastRegion.point.y = lprcMonitor->top;
regions->last().extent.y = lprcMonitor->bottom - lprcMonitor->top; lastRegion.extent.x = lprcMonitor->right - lprcMonitor->left;
lastRegion.extent.y = lprcMonitor->bottom - lprcMonitor->top;
return true; return true;
} }