aboutsummaryrefslogtreecommitdiff
path: root/engines/zvision
diff options
context:
space:
mode:
authorrichiesams2013-07-24 11:13:57 -0500
committerrichiesams2013-08-04 13:32:33 -0500
commitcd51b646f39fb826f5d618c6d61c996844f628dd (patch)
treedc8f1850f48bd5fbf5e7814fda85e608ff520242 /engines/zvision
parent9e6b2dfc12706f4b367fedf951759c8be0ab5e90 (diff)
downloadscummvm-rg350-cd51b646f39fb826f5d618c6d61c996844f628dd.tar.gz
scummvm-rg350-cd51b646f39fb826f5d618c6d61c996844f628dd.tar.bz2
scummvm-rg350-cd51b646f39fb826f5d618c6d61c996844f628dd.zip
ZVISION: Create a class for handling all render table logic
Aka, creating the lookup tables, storing the current render state, and eventually doing the image mutations.
Diffstat (limited to 'engines/zvision')
-rw-r--r--engines/zvision/render_table.cpp95
-rw-r--r--engines/zvision/render_table.h69
2 files changed, 164 insertions, 0 deletions
diff --git a/engines/zvision/render_table.cpp b/engines/zvision/render_table.cpp
new file mode 100644
index 0000000000..1baf9514a3
--- /dev/null
+++ b/engines/zvision/render_table.cpp
@@ -0,0 +1,95 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "common/scummsys.h"
+
+#include "zvision/render_table.h"
+
+
+namespace ZVision {
+
+RenderTable::RenderTable(uint32 numRows, uint32 numColumns)
+ : _numRows(numRows),
+ _numColumns(numColumns) {
+ assert(numRows != 0 && numColumns != 0);
+
+ _internalBuffer = new Common::Point[numRows * numColumns];
+}
+
+RenderTable::~RenderTable() {
+ delete[] _internalBuffer;
+}
+
+void RenderTable::setRenderState(RenderState newState) {
+ _renderState = newState;
+
+ switch (newState) {
+ case PANORAMA:
+ _panoramaOptions.fieldOfView = 60;
+ _panoramaOptions.linearScale = 1;
+ generatePanoramaLookupTable();
+ break;
+ case TILT:
+ generateTiltLookupTable();
+ break;
+ case FLAT:
+ // Intentionally left empty
+ break;
+ }
+}
+
+void RenderTable::generatePanoramaLookupTable() {
+ float fieldOfView = _panoramaOptions.fieldOfView;
+ float scale = _panoramaOptions.linearScale;
+
+ memset(_internalBuffer, 0, _numRows * _numColumns * sizeof(uint16));
+
+ float halfWidth = (float)_numColumns / 2.0f;
+ float halfHeight = (float)_numRows / 2.0f;
+
+ float fovRadians = (fieldOfView * M_PI / 180.0f);
+ float halfHeightOverTan = halfHeight / tan(fovRadians);
+ float tanOverHalfHeight = tan(fovRadians) / halfHeight;
+
+ for (uint32 x = 0; x < _numRows; x++) {
+ // Add an offset of 0.01 to overcome zero tan/atan issue (vertical line on half of screen)
+ float xPos = (float)x - halfWidth + 0.01;
+ float tempX = atan(xPos*tanOverHalfHeight);
+
+ int32 newX = floor(scale * halfHeightOverTan * tempX);// + half_w);
+ float cosX = cos(tempX);
+
+ for (uint32 y = 0; y < _numColumns; y++) {
+ int32 newY = floor(halfHeight + (y - halfHeight) * cosX);
+
+ uint32 index = x * _numColumns + y;
+ _internalBuffer[index].x = newX; //pixel index
+ _internalBuffer[index].y = newY; //pixel index
+ }
+ }
+}
+
+void RenderTable::generateTiltLookupTable() {
+
+}
+
+} // End of namespace ZVision
diff --git a/engines/zvision/render_table.h b/engines/zvision/render_table.h
new file mode 100644
index 0000000000..9d54551c3b
--- /dev/null
+++ b/engines/zvision/render_table.h
@@ -0,0 +1,69 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef ZVISION_RENDER_TABLE_H
+#define ZVISION_RENDER_TABLE_H
+
+#include "common/types.h"
+#include "common/rect.h"
+
+namespace ZVision {
+
+class RenderTable {
+public:
+ RenderTable(uint32 numRows, uint32 numColumns);
+ ~RenderTable();
+
+public:
+ enum RenderState {
+ PANORAMA,
+ TILT,
+ FLAT
+ };
+
+private:
+ uint32 _numColumns, _numRows;
+ Common::Point *_internalBuffer;
+ RenderState _renderState;
+
+ struct {
+ uint16 fieldOfView;
+ uint16 linearScale;
+ } _panoramaOptions;
+
+ // TODO: See if tilt and panorama need to have separate options
+ struct {
+ uint16 fieldOfView;
+ uint16 linearScale;
+ } _tiltOptions;
+
+public:
+ void setRenderState(RenderState newState);
+
+private:
+ void generatePanoramaLookupTable();
+ void generateTiltLookupTable();
+};
+
+} // End of namesapce ZVision
+
+#endif