From c07cfb5d07e4716c2eceef8d3deb56a4590fca8b Mon Sep 17 00:00:00 2001 From: Andrew Brown Date: Fri, 30 Sep 2011 19:22:02 -0400 Subject: [PATCH] docs repo started --- Makefile | 132 +++++++++ building.rst | 3 + conf.py | 216 +++++++++++++++ design/cube_parts.png | Bin 0 -> 16375 bytes design/cube_parts.svg | 299 ++++++++++++++++++++ design/designdoc.rst | 226 +++++++++++++++ design/dirt_side.png | Bin 0 -> 3455 bytes design/dirt_top.png | Bin 0 -> 1907 bytes design/pixelfix.png | Bin 0 -> 5174 bytes design/pixelfix.svg | 206 ++++++++++++++ design/tessellation.png | Bin 0 -> 21740 bytes design/tessellation.svg | 321 ++++++++++++++++++++++ design/texturecubing.png | Bin 0 -> 7748 bytes design/texturecubing.svg | 278 +++++++++++++++++++ design/texturesidesteps.png | Bin 0 -> 10108 bytes design/texturesidesteps.svg | 401 +++++++++++++++++++++++++++ design/texturetopsteps.png | Bin 0 -> 16551 bytes design/texturetopsteps.svg | 531 ++++++++++++++++++++++++++++++++++++ index.rst | 47 ++++ quickstart.rst | 77 ++++++ running.rst | 3 + 21 files changed, 2740 insertions(+) create mode 100644 Makefile create mode 100644 building.rst create mode 100644 conf.py create mode 100644 design/cube_parts.png create mode 100644 design/cube_parts.svg create mode 100644 design/designdoc.rst create mode 100644 design/dirt_side.png create mode 100644 design/dirt_top.png create mode 100644 design/pixelfix.png create mode 100644 design/pixelfix.svg create mode 100644 design/tessellation.png create mode 100644 design/tessellation.svg create mode 100644 design/texturecubing.png create mode 100644 design/texturecubing.svg create mode 100644 design/texturesidesteps.png create mode 100644 design/texturesidesteps.svg create mode 100644 design/texturetopsteps.png create mode 100644 design/texturetopsteps.svg create mode 100644 index.rst create mode 100644 quickstart.rst create mode 100644 running.rst diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e1e0086 --- /dev/null +++ b/Makefile @@ -0,0 +1,132 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest + +default: html + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Overviewer.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Overviewer.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Overviewer" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Overviewer" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + make -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/building.rst b/building.rst new file mode 100644 index 0000000..1cf84f2 --- /dev/null +++ b/building.rst @@ -0,0 +1,3 @@ +=================================== +Building the Overviewer from Source +=================================== diff --git a/conf.py b/conf.py new file mode 100644 index 0000000..794c403 --- /dev/null +++ b/conf.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- +# +# Overviewer documentation build configuration file, created by +# sphinx-quickstart on Thu Sep 22 10:19:03 2011. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Overviewer' +copyright = u'2011, Andrew Brown and Contributors' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.3.0' +# The full version, including alpha/beta/rc tags. +release = '0.3.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Overviewerdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'Overviewer.tex', u'Overviewer Documentation', + u'Andrew Brown and Contributors', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'overviewer', u'Overviewer Documentation', + [u'Andrew Brown and Contributors'], 1) +] diff --git a/design/cube_parts.png b/design/cube_parts.png new file mode 100644 index 0000000000000000000000000000000000000000..e33c971234ba24267d806d113a8effb91bacd5b7 GIT binary patch literal 16375 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

al;o4h683X4s4FX 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 Mp00i_>zopr0KC%p&j0`b literal 0 HcmV?d00001 diff --git a/design/cube_parts.svg b/design/cube_parts.svg new file mode 100644 index 0000000..698ee28 --- /dev/null +++ b/design/cube_parts.svg @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 24 + 24 + + + + + + + + + + diff --git a/design/designdoc.rst b/design/designdoc.rst new file mode 100644 index 0000000..32b6840 --- /dev/null +++ b/design/designdoc.rst @@ -0,0 +1,226 @@ +==================== +Design Documentation +==================== +So you'd like a technical overview of how The Overviewer works, huh? You've come +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. + +This document is probably a good read to anyone that wants to get involved in +Overviewer development. + +So let's get started! + +Background Info +=============== +The Overviewer's task is to take Minecraft worlds and render them into a set of tiles that can be displayed with a Google Maps interface. + +A Minecraft world extends indefinitely along the two horizontal axes, and are +exactly 128 units high. Minecraft worlds are made of cubes, where each slot in +the world's grid has a type that determines what it is (grass, stone, ...). +This makes worlds relatively uncomplicated to render, the Overviewer simply +determines what cubes to draw and where. Since everything in Minecraft is +aligned to a strict grid, placement and rendering decisions are completely +deterministic and can be performed in an iterative fashon. + +The coordinate system for Minecraft has three axes. The X and Z axes are the +horizontal axes. They extend indefinitely towards both positive and negative +infinity. (There are practical limits, but no theoretical limits). The Y axis +extends from 0 to 127, which corresponds with the world height limit. Each +block in Minecraft has a coordinate address, e.g. the block at 15,78,-35 refers +to 15 along the X axis, -35 along the Z axis, and 78 units up from bedrock. + +The world is divided up into *chunks*. A chunk is a 16 by 16 area of the world +that extends from bedrock to sky. In other words, a 16,128,16 "chunk" of the +world. Chunks also have an address, but in only 2 dimensions. To find the which +chunk a block is in, simply divide its X and Z coordinates by 16 and take the +floor. + +Minecraft worlds are generated on-the-fly by the chunk. This means not all +chunks will exist. There is no pattern to chunk generation, the game simply +generates them as needed. + +Chunks are stored on-disk in region files. A Minecraft region is a "region" of +32 by 32 chunks. Regions have their own address, and for a particular chunk one +can find its region by dividing its coordinates by 32 and taking the floor. A +region may contain all 1024 of its chunks, or only a subset of them, since not +all chunks may exist. The absence of a region file indicates none of its chunks +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). + +.. [#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. + +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. + +1. Render each block +2. Render the chunks from the blocks +3. Render the tiles of the map from the chunks +4. Shrink and combine the tiles for the other zoom levels + +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. + +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. + +.. 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 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 +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. + +This can be seen in the function :func:`textures.transform_image`. It takes +these steps: + +1. The texture is re-sized to 17 by 17 pixels. This is done because the diagonal + of a square with sides 17 is approximately 24, which is the target size for + the bounding box of the cube image. So when it's rotated, it will be the + correct width. + +2. The image is rotated 45 degrees about its center. + +3. The image is scaled on the vertical axis by a factor of 1/2. + +This produces an image of size 24 by 12 as seen in the following sequence. + +.. image:: texturetopsteps.png + :alt: The 4 steps for transforming a texture square into the top of the cube. + +The final image, shown below, becomes the top of the cube. + +.. image:: dirt_top.png + :alt: Top of dirt + +On the left is the top of the dirt block at actual size after the +transformation, the right is the same but blown up by a factor of 10 with no +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. + +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. + +2. The 12 by 12 square is sheared by a factor of 1.5 in the Y direction, + producing an image that is bounded by a 12 by 18 pixel square. + +.. image:: texturesidesteps.png + :alt: Texture being sheared for the side of the cube. + +This image is simply flipped along the horizontal axis for the other visible +side of the cube. + +.. image:: dirt_side.png + :alt: The sides of the dirt block + +Again, the left are the two sides of the dirt block at actual size, the right is +scaled with no interpolation by a factor of 10 to show the pixels. + +An Entire Cube +-------------- +These three images, the top and two sides, are pasted into a single 24 by 24 +pixel image to get the cube, as shown. + +However, notice from the middle of the three images in the sequence below that +the images as transformed don't fit together exactly. There is some overlap when +put in the 24 by 24 box in which they must fit. + +.. image:: cube_parts.png + :alt: How the cube parts fit together + +There is one more complication. The cubes don't tessellate perfectly. This +diagram illustrates when a cube is positioned next to another. The lower cubes +are 18 pixels lower and 12 pixels to either side, which is half the width and +3/4 the height respectively. + +.. image:: tessellation.png + :alt: Cubes don't tessellate perfectly + +The solution is to manually touch up those 6 pixels. 3 pixels are added on the +upper left of each cube, 3 on the lower right. Therefore, they all line up +perfectly! + +This is done at the end of :func:`textures._build_block` + +.. image:: pixelfix.png + :alt: The 6 pixels manually added to each cube. + +Chunk Rendering +=============== +.. This goes over the rendering of a chunk + +Tile Rendering +============== +.. Covers the placement of chunk images on a tile + +Reading the Data Files +====================== +.. + Covers how to extract the blocks of each chunk from the region files. Also + covers the nbt file stuff. + +Image Composition +================= +.. + Covers the issues I had with PIL's image composition and why we needed + something fancier. + +Multiprocessing +=============== +.. + Covers how the Overviewer utilizes multiple processors to render faster + +Caching +======= +.. How the overviewer determines what needs to be rendered and what doesn't + +Lighting +======== + +Cave Mode +========= diff --git a/design/dirt_side.png b/design/dirt_side.png new file mode 100644 index 0000000000000000000000000000000000000000..0634307179dd2c64fea40a81818232418e8e1dd3 GIT binary patch literal 3455 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 literal 0 HcmV?d00001 diff --git a/design/dirt_top.png b/design/dirt_top.png new file mode 100644 index 0000000000000000000000000000000000000000..118fc543f9b39541fac6875d4124f12b5814681f GIT binary patch literal 1907 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 literal 0 HcmV?d00001 diff --git a/design/pixelfix.svg b/design/pixelfix.svg new file mode 100644 index 0000000..0d7fd98 --- /dev/null +++ b/design/pixelfix.svg @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/design/tessellation.png b/design/tessellation.png new file mode 100644 index 0000000000000000000000000000000000000000..6ecb2956d4c2a283a795c26e6dc56c2ac148b6ee GIT binary patch literal 21740 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 QrUJ?hp00i_>zopr0G((7)Bpeg literal 0 HcmV?d00001 diff --git a/design/tessellation.svg b/design/tessellation.svg new file mode 100644 index 0000000..b407e16 --- /dev/null +++ b/design/tessellation.svg @@ -0,0 +1,321 @@ + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/design/texturecubing.png b/design/texturecubing.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8f8fbccbfe9582035f8d9f226ff599d385a908 GIT binary patch literal 7748 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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + 16 + 16 + 24 + 24 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/design/texturesidesteps.png b/design/texturesidesteps.png new file mode 100644 index 0000000000000000000000000000000000000000..2903b5877911f7d3dc91616b6e1a0fe7b1253768 GIT binary patch literal 10108 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 literal 0 HcmV?d00001 diff --git a/design/texturesidesteps.svg b/design/texturesidesteps.svg new file mode 100644 index 0000000..fdb73f2 --- /dev/null +++ b/design/texturesidesteps.svg @@ -0,0 +1,401 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + 16 + + + + + + + + + + + + + + + + + + + 18 + + + + + + + + + 12 + + 12 + + + + + + + + + + + + + + + + + 12 + + + + + + + diff --git a/design/texturetopsteps.png b/design/texturetopsteps.png new file mode 100644 index 0000000000000000000000000000000000000000..bb896104f13fb7e54b8eef8cd0806008f12ef35a GIT binary patch literal 16551 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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + 16 + 16 + + + + + + + + + + + + + + + + + + + 24 + + + + + + + + + + 24 + + + + + + + + + + + 17 + + + 17 + + + + + + + + + + + + + + + + + + + + + + + + + + 24 + + + + + + + 12 + + + + + + + + + + + + diff --git a/index.rst b/index.rst new file mode 100644 index 0000000..f6a68d0 --- /dev/null +++ b/index.rst @@ -0,0 +1,47 @@ +======================== +The Minecraft Overviewer +======================== + +Introduction +============ +The Minecraft Overviewer is a command-line tool for rendering high-resolution +maps of Minecraft worlds. It generates a set of static html and image files and +uses the Google Maps API to display a nice interactive map. + +The Overviewer has been in active development for over a year and has many +features, including day and night lighting, cave rendering, mineral overlays, +and many plugins for even more features! It is written mostly in Python with +critical sections in C as an extension module. + +For a simple example of what your renders will look like, head over to `The +"Exmaple" Map `_. For more user-contributed +examples, see `The Example Wiki Page `_. + +Download +======== +The Overviewer works with Linux, Mac, and Windows! We provide Windows and Debian +built executables available for download on our `Github Homepage`_. + +To get your copy, head over to our `Github Homepage`_. If you are familiar with Git, you can clone the repository from there. If you would like a Debian or Windows executable, click on the Downloads link, or go `directly there `_. + +.. _Github Homepage: https://github.com/overviewer/Minecraft-Overviewer + +Documentation +============= + +.. toctree:: + :maxdepth: 2 + + quickstart + building + running + design/designdoc + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/quickstart.rst b/quickstart.rst new file mode 100644 index 0000000..859ff4f --- /dev/null +++ b/quickstart.rst @@ -0,0 +1,77 @@ +================ +Quickstart Guide +================ + +This guide is aimed at new users that want to get started using Minecraft +Overviewer. It is *not* meant to explain everything, but it should help you +generate your first map. + +Getting the Overviewer +====================== + +Head to our `Github Homepage `_. You can either download the Windows package if you're running Windows, install the Debian package if you're running Debian or Ubuntu, or Git-clone the source. Building from source should be as simple as a `python setup.py build` but for more information, see `Building the Overviewer from Source `_. + +Quick-link for Git Source. (Clone this) + git://github.com/overviewer/Minecraft-Overviewer.git + +Rendering your First Map +======================== + +Overviewer is a command-line application, and so it needs to be run from the command line. If you installed Overviewer from a package manager, the command is ``overviewer.py``. If you downloaded it manually, open a terminal window and navigate to wherever you downloaded Overviewer. For pre-compiled Windows builds, the command is ``overviewer.exe``. For other systems, it's ``./overviewer.py``. + +To generate your map, run:: + + overviewer.exe WorldName path\to\output\ # on windows, or + ./overviewer.py WorldName path/to/output/ # on other systems + +where ``WorldName`` is the name of the world you want to render, and +``path/to/output`` is the place where you want to store the rendered world. The +first render can take a while, depending on the size of your world. You can, if +you want to, provide a path to the world you want to render, instead of +providing a world name and having Overviewer auto-discover the world path. + +When the render is done, open up *index.html* using your web-browser of choice. Pretty cool, huh? You can even upload this map to a web server to share with others! Simply upload the entire folder to a web server and point your users to index.html! + +Incremental updates are just as easy, and a lot faster. If you go and change something inside your world, run the command again and Overviewer will automatically rerender only what's needed. + +Running Overviewer on a Server +------------------------------ + +There are special considerations when running Overviewer on a server. For +information on how to do this, see `Running Overviewer on a Server`_. + +.. _Running Overviewer on a Server: https://github.com/overviewer/Minecraft-Overviewer/wiki/Running-Overviewer-on-a-Server + +Extra Features +============== + +Overviewer has a lot of features beyond generating the simple map we started with. Here's information on two of them. + +Render Modes +------------ + +Overviewer supports many different rendermodes. Run `./overviewer.py --list-rendermodes` to get a list. Two of the most popular rendermodes are *lighting* and *night*, which draw shadows for the corresponding time of day. To tell Overviewer what rendermode to use, run + + ./overviewer.py --rendermodes=lighting WorldName output/dir/ + +You can also specify multiple rendermodes at once, and Overviewer will render +them all and let you toggle between them on the generated web page. To get both +*lighting* and *night* on the same page, run:: + + ./overviewer.py --rendermodes=lighting,night WorldName output/dir/ + +Biomes +------ + +Minecraft Overviewer has support for using the biome info from the `Minecraft +Biome Extractor`_. If you run the biome extractor on your world, during the +next run Overviewer will automatically recognize the biome info and use it to +colorize your grass and leaves appropriately. This will only appear on updated +chunks, though; to colorize the entire world you will need to rerender from +scratch by deleting the old render. + +**Note**: as of Minecraft 1.8, you currently need to use a patched Biome +Extractor that can be found `here `_, or `here on GitHub +`_. + +.. _Minecraft Biome Extractor: http://www.minecraftforum.net/viewtopic.php?f=25&t=80902 diff --git a/running.rst b/running.rst new file mode 100644 index 0000000..378f042 --- /dev/null +++ b/running.rst @@ -0,0 +1,3 @@ +====================== +Running the Overviewer +======================