C3D_Mtx* Sprite::getMatrix() { if (dirtyMatrix) { dirtyMatrix = false; Mtx_Identity(&modelview); Mtx_Scale(&modelview, scaleX, scaleY, 1.f); Mtx_Translate(&modelview, posX, posY, 0); } return &modelview; }
void OSystem_3DS::updateFocus() { if (_focusClearTime && getMillis() - _focusClearTime > 5000) { _focusClearTime = 0; _focusDirty = true; _focusRect = Common::Rect(_gameWidth, _gameHeight); } if (_focusDirty) { float duration = 1.f / 20.f; // Focus animation in frame duration float w = 400.f; float h = 240.f; float ratio = _focusRect.width() / _focusRect.height(); if (ratio > w/h) { _focusTargetScaleX = w / _focusRect.width(); float newHeight = (float)_focusRect.width() / w/h; _focusTargetScaleY = h / newHeight; _focusTargetPosX = _focusTargetScaleX * _focusRect.left; _focusTargetPosY = _focusTargetScaleY * ((float)_focusRect.top - (newHeight - _focusRect.height())/2.f); } else { _focusTargetScaleY = h / _focusRect.height(); float newWidth = (float)_focusRect.height() * w/h; _focusTargetScaleX = w / newWidth; _focusTargetPosY = _focusTargetScaleY * _focusRect.top; _focusTargetPosX = _focusTargetScaleX * ((float)_focusRect.left - (newWidth - _focusRect.width())/2.f); } if (_focusTargetPosX < 0 && _focusTargetScaleY != 240.f / _gameHeight) _focusTargetPosX = 0; if (_focusTargetPosY < 0 && _focusTargetScaleX != 400.f / _gameWidth) _focusTargetPosY = 0; _focusStepPosX = duration * (_focusTargetPosX - _focusPosX); _focusStepPosY = duration * (_focusTargetPosY - _focusPosY); _focusStepScaleX = duration * (_focusTargetScaleX - _focusScaleX); _focusStepScaleY = duration * (_focusTargetScaleY - _focusScaleY); } if (_focusDirty || _focusPosX != _focusTargetPosX || _focusPosY != _focusTargetPosY || _focusScaleX != _focusTargetScaleX || _focusScaleY != _focusTargetScaleY) { _focusDirty = false; if ((_focusStepPosX > 0 && _focusPosX > _focusTargetPosX) || (_focusStepPosX < 0 && _focusPosX < _focusTargetPosX)) _focusPosX = _focusTargetPosX; else if (_focusPosX != _focusTargetPosX) _focusPosX += _focusStepPosX; if ((_focusStepPosY > 0 && _focusPosY > _focusTargetPosY) || (_focusStepPosY < 0 && _focusPosY < _focusTargetPosY)) _focusPosY = _focusTargetPosY; else if (_focusPosY != _focusTargetPosY) _focusPosY += _focusStepPosY; if ((_focusStepScaleX > 0 && _focusScaleX > _focusTargetScaleX) || (_focusStepScaleX < 0 && _focusScaleX < _focusTargetScaleX)) _focusScaleX = _focusTargetScaleX; else if (_focusScaleX != _focusTargetScaleX) _focusScaleX += _focusStepScaleX; if ((_focusStepScaleY > 0 && _focusScaleY > _focusTargetScaleY) || (_focusStepScaleY < 0 && _focusScaleY < _focusTargetScaleY)) _focusScaleY = _focusTargetScaleY; else if (_focusScaleY != _focusTargetScaleY) _focusScaleY += _focusStepScaleY; Mtx_Identity(&_focusMatrix); Mtx_Translate(&_focusMatrix, -_focusPosX, -_focusPosY, 0); Mtx_Scale(&_focusMatrix, _focusScaleX, _focusScaleY, 1.f); } }