From 061db039c1f4437a3c77ca45eb09bc1716ecddb5 Mon Sep 17 00:00:00 2001 From: Andrew Brown Date: Sat, 1 Oct 2011 01:02:13 -0400 Subject: [PATCH] touch-up to the wording and figures in design doc --- design/cube_parts.png | Bin 16375 -> 17193 bytes design/cube_parts.svg | 95 ++++++++++++++++++++++++++++-------------- design/designdoc.rst | 69 +++++++++++++++--------------- 3 files changed, 99 insertions(+), 65 deletions(-) diff --git a/design/cube_parts.png b/design/cube_parts.png index e33c971234ba24267d806d113a8effb91bacd5b7..19e4ef414fb14fb383d82936fe2caf4b7c3290b5 100644 GIT binary patch literal 17193 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 literal 16375 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

al;o4h683X4s4FX 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 Mp00i_>zopr0KC%p&j0`b diff --git a/design/cube_parts.svg b/design/cube_parts.svg index 698ee28..81749b7 100644 --- a/design/cube_parts.svg +++ b/design/cube_parts.svg @@ -17,8 +17,8 @@ inkscape:version="0.48.1 r9760" sodipodi:docname="cube_parts.svg" inkscape:export-filename="/home/andrew/mc/overviewerdocs/design/cube_parts.png" - inkscape:export-xdpi="67.92453" - inkscape:export-ydpi="67.92453"> + inkscape:export-xdpi="63.639942" + inkscape:export-ydpi="63.639942"> + id="g4606" + transform="translate(0,20.000003)"> + id="g4614" + transform="translate(-5,2.6171874e-6)"> 24 + x="990" + y="677.36218">24 24 + x="1150" + y="537.36218">24 + 25 + + + + diff --git a/design/designdoc.rst b/design/designdoc.rst index 32b6840..17eac0f 100644 --- a/design/designdoc.rst +++ b/design/designdoc.rst @@ -6,9 +6,9 @@ to the right place! This document's scope does not cover the details of the code. The code is fairly well commented and not difficult to understand. Instead, this document is -intended to give an explanation to how the Overviewer was designed and how all -the pieces fit together. Think of this document as commenting on how all the -high level pieces of the code work. +intended to give an explanation to how the Overviewer was designed, why certain +decisions were made, and how all the pieces fit together. Think of this document +as commenting on how all the high level pieces of the code work. This document is probably a good read to anyone that wants to get involved in Overviewer development. @@ -54,15 +54,14 @@ exist. About the Rendering =================== -Minecraft worlds are rendered in an approximated Isometric projection -[#isomorphicref]_, or -what I call the "Sim City projection" [#isomorphicnote]_. In the original design, the projection -acts as if your eye is infinitely far away looking down at the world at a 45 -degree angle in the South-East direction (now, the world can be rendered at any -of the 4 oblique directions). +Minecraft worlds are rendered in an approximated Isometric projection at an +oblique angle. In the original design, the projection acts as if your eye is +infinitely far away looking down at the world at a 45 degree angle in the +South-East direction (now, the world can be rendered at any of the 4 oblique +directions). -.. [#isomorphicref] http://en.wikipedia.org/wiki/Isometric_projection -.. [#isomorphicnote] To be honest, I'm not entirely sure it's technically an isomorphic projection. There are a lot of very similar projections. +.. image:: screenshot.png + :alt: A screenshot of Overviewer output In order to render a Minecraft world, there are a few steps that need to happen. These steps are explained in detail in the next few sections. @@ -76,28 +75,27 @@ Block Rendering =============== .. This section shows how each block is pre-rendered -The first step is rendering the blocks from the textures. Each block is built -and cached in global variables of the :mod:`textures` module. +The first step is rendering the blocks from the textures. Each block is "built" +from its textures into an image of a cube and cached in global variables of the +:mod:`textures` module. -Textures come in the size 16 by 16 [#f1]_. In order to render a cube out of -this, I apply an `affine transformation`_ to the texture in order to skew it to -the right shape. +Textures come in the size 16 by 16 (higher resolution textures are resized and +the process remains the same). In order to render a cube out of this, an `affine +transformation`_ is applied to the texture in order to transform it to the top, +left, and right faces of the cube. .. image:: texturecubing.png :alt: A texture gets rendered into a cube -.. [#f1] - Textures can come in other sizes and are re-sized so this section applies - just the same. - .. _affine transformation: http://en.wikipedia.org/wiki/Affine_transformation -The result is an image of a cube that is 24 by 24 pixels large. This particular -size for the cubes was chosen for an important reason: 24 is divisible by 2 and -by 4. This makes placement much easier. E.g. in order to draw two cubes that are -next to each other in the world, one are drawn exactly 12 pixels over and 6 -pixels down from the other. These kind of placement decisions all happen on -exact pixel boundaries. +The result is an image of a cube that is 24 by 24 pixels in size. This +particular size for the cubes was chosen for an important reason: 24 is +divisible by 2 and by 4. This makes placement much easier. E.g. in order to draw +two cubes that are next to each other in the world, one is drawn exactly 12 +pixels over and 6 pixels down from the other. All placements of the cubes happen +on exact pixel boundaries and no further resolution is lost beyond the initial +transformations. The transformation happens in two stages. First, the texture is transformed for the top of the cube. Then the texture is transformed for the left side of the @@ -105,11 +103,12 @@ cube, which is mirrored for the right side of the cube. Top Transformation ------------------ -The transformation from the top is a simple `affine transformation`_. It is -actually several affine transformations: a re-size, a rotation, and a scaling; -but since multiple affine transformations can be chained together simply by -multiplying the transformation matrices together, only one transformation is -actually done. + +The transformation for the top face of the cube is a simple `affine +transformation`_ from the original square texture. It is actually several affine +transformations: a re-size, a rotation, and a scaling; but since multiple affine +transformations can be chained together simply by multiplying the transformation +matrices together, only one transformation is actually done. This can be seen in the function :func:`textures.transform_image`. It takes these steps: @@ -139,9 +138,11 @@ interpolation to show the pixels. Side Transformation ------------------- -The texture square is transformed for the sides of the cube in -:func:`textures.transform_image_side`. This is another `affine transformation`_, -but this time only two transformations are done: a re-size and a shear. + +The texture square is transformed for the sides of the cube in the +:func:`textures.transform_image_side` function. This is another `affine +transformation`_, but this time only two transformations are done: a re-size and +a shear. 1. First the texture is re-sized to 12 by 12 pixels. This is half the width of 24 so it will have the correct width after the shear.