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 Mtx_Translate(C3D_Mtx* mtx, float x, float y, float z) { C3D_Mtx tm, om; Mtx_Identity(&tm); tm.r[0].w = x; tm.r[1].w = y; tm.r[2].w = z; Mtx_Multiply(&om, mtx, &tm); Mtx_Copy(mtx, &om); }
Sprite::Sprite() : dirtyPixels(true) , dirtyMatrix(true) , actualWidth(0) , actualHeight(0) , posX(0) , posY(0) , scaleX(1.f) , scaleY(1.f) { Mtx_Identity(&modelview); vertices = (vertex *)linearAlloc(sizeof(vertex) * 4); }
void Mtx_Ortho(C3D_Mtx* mtx, float left, float right, float top, float bottom, float near, float far) { C3D_Mtx mp; Mtx_Zeros(&mp); // Build standard orthogonal projection matrix mp.r[0].x = 2.0f / (right - left); mp.r[0].w = (left + right) / (left - right); mp.r[1].y = 2.0f / (top - bottom); mp.r[1].w = (bottom + top) / (bottom - top); mp.r[2].z = 2.0f / (far - near); mp.r[2].w = (near + far) / (near - far); mp.r[3].w = 1.0f; // Fix depth range to [-1, 0] C3D_Mtx mp2; Mtx_Identity(&mp2); mp2.r[2].z = 0.5; mp2.r[2].w = -0.5; Mtx_Multiply(mtx, &mp2, &mp); }
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); } }