summaryrefslogtreecommitdiffstats
path: root/dimension
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@gmail.com>2011-06-15 23:39:36 -0600
committerTavian Barnes <tavianator@gmail.com>2011-06-16 00:08:01 -0600
commit817532b031cb9a15ccf27ff66d8031b31abce200 (patch)
treeac311c96e4bf403b7fcc05589a8f3d97ca2172da /dimension
parent438e4c497d5a9f8e9fd75ea63fb05eac860c2708 (diff)
downloaddimension-817532b031cb9a15ccf27ff66d8031b31abce200.tar.xz
Add Python client.
Diffstat (limited to 'dimension')
-rw-r--r--dimension/Makefile.am23
-rw-r--r--dimension/dimension.in125
-rw-r--r--dimension/tests/Makefile.am30
-rw-r--r--dimension/tests/complex.dmnsn71
-rw-r--r--dimension/tests/demo.dmnsn134
5 files changed, 383 insertions, 0 deletions
diff --git a/dimension/Makefile.am b/dimension/Makefile.am
new file mode 100644
index 0000000..6d1a7af
--- /dev/null
+++ b/dimension/Makefile.am
@@ -0,0 +1,23 @@
+###########################################################################
+## Copyright (C) 2011 Tavian Barnes <tavianator@tavianator.com> ##
+## ##
+## This file is part of The Dimension Build Suite. ##
+## ##
+## The Dimension Build Suite 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 3 of the ##
+## License, or (at your option) any later version. ##
+## ##
+## The Dimension Build Suite 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, see <http://www.gnu.org/licenses/>. ##
+###########################################################################
+
+SUBDIRS = . \
+ tests
+
+python_PYTHON = dimension
diff --git a/dimension/dimension.in b/dimension/dimension.in
new file mode 100644
index 0000000..1f26db0
--- /dev/null
+++ b/dimension/dimension.in
@@ -0,0 +1,125 @@
+#!/usr/bin/python3
+
+#########################################################################
+# Copyright (C) 2010-2011 Tavian Barnes <tavianator@tavianator.com> #
+# #
+# This file is part of Dimension. #
+# #
+# Dimension 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 3 of the License, or (at #
+# your option) any later version. #
+# #
+# Dimension 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, see <http://www.gnu.org/licenses/>. #
+#########################################################################
+
+import argparse
+import os.path
+
+# Parse the command line
+
+_parser = argparse.ArgumentParser(
+ description = '@PACKAGE_NAME@ @PACKAGE_VERSION@',
+ conflict_handler = 'resolve', # For -h as height instead of help
+)
+
+_parser.add_argument('-V', '--version', action = 'version',
+ version = '@PACKAGE_NAME@ @PACKAGE_VERSION@')
+
+_parser.add_argument('-w', '--width', action = 'store', default = 768,
+ help = 'image width')
+_parser.add_argument('-h', '--height', action = 'store', default = 480,
+ help = 'image height')
+
+_parser.add_argument('-v', '--verbose', action = 'store_true',
+ help = 'print more information')
+_parser.add_argument('-q', '--quiet', action = 'store_true',
+ help = 'print less information')
+
+_parser.add_argument('--strict', action = 'store_true',
+ help = 'treat warnings as errors')
+_parser.add_argument('--threads', action = 'store',
+ help = 'the number of threads to render with')
+
+_parser.add_argument('-o', '--output', action = 'store',
+ help = 'the output image file')
+_parser.add_argument('input', action = 'store',
+ help = 'the input scene description file')
+
+_args = _parser.parse_args()
+
+# Default output is basename(input).png
+if _args.output is None:
+ _noext = os.path.splitext(os.path.basename(_args.input))[0]
+ _args.output = _noext + '.png'
+
+# Imports available to scripts
+from math import *
+from dimension import *
+
+# --strict option
+die_on_warnings(_args.strict)
+
+# Defaults
+objects = []
+lights = []
+default_texture = Texture(finish = Ambient(0.1) + Diffuse(0.6))
+default_interior = Interior()
+background = Black
+sky_sphere = None
+recursion_limit = None
+
+# Execute the input script
+if not _args.quiet:
+ print('Parsing scene ...')
+
+parse_timer = Timer()
+with open(_args.input) as _fh:
+ exec(compile(_fh.read(), _args.input, 'exec'))
+parse_timer.complete()
+
+# Make the canvas
+canvas = Canvas(width = _args.width, height = _args.height)
+canvas.optimize_PNG()
+
+# Make the scene object
+scene = Scene(canvas = canvas,
+ objects = objects,
+ lights = lights,
+ camera = camera)
+scene.default_texture = default_texture
+scene.background = background
+if sky_sphere is not None:
+ scene.sky_sphere = sky_sphere
+if recursion_limit is not None:
+ scene.recursion_limit = recursion_limit
+if _args.threads is not None:
+ scene.nthreads = _args.threads
+
+# Raytrace the scene
+if not _args.quiet:
+ if scene.nthreads == 1:
+ print('Rendering scene ...')
+ else:
+ print('Rendering scene (using %d threads) ...' % scene.nthreads)
+
+scene.raytrace()
+
+# Write the output file
+export_timer = Timer()
+canvas.write_PNG(_args.output)
+export_timer.complete()
+
+# Print execution times
+if _args.verbose:
+ print()
+ print('Parsing time: ', parse_timer)
+ print('Bounding time: ', scene.bounding_timer)
+ print('Rendering time: ', scene.render_timer)
+ print('Exporting time: ', export_timer)
diff --git a/dimension/tests/Makefile.am b/dimension/tests/Makefile.am
new file mode 100644
index 0000000..147df24
--- /dev/null
+++ b/dimension/tests/Makefile.am
@@ -0,0 +1,30 @@
+###########################################################################
+## Copyright (C) 2009-2011 Tavian Barnes <tavianator@tavianator.com> ##
+## ##
+## This file is part of The Dimension Build Suite. ##
+## ##
+## The Dimension Build Suite 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 3 of the ##
+## License, or (at your option) any later version. ##
+## ##
+## The Dimension Build Suite 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, see <http://www.gnu.org/licenses/>. ##
+###########################################################################
+
+TESTS = demo.dmnsn \
+ complex.dmnsn
+TEST_EXTENSIONS = .dmnsn
+DMNSN_LOG_COMPILER = $(top_builddir)/dimension/dimension
+AM_DMNSN_LOG_FLAGS = --strict
+TESTS_ENVIRONMENT = PYTHONPATH=$(top_builddir)/libdimension-python/.libs
+
+EXTRA_DIST = $(TESTS)
+
+clean-local:
+ rm -f *.png
diff --git a/dimension/tests/complex.dmnsn b/dimension/tests/complex.dmnsn
new file mode 100644
index 0000000..261052e
--- /dev/null
+++ b/dimension/tests/complex.dmnsn
@@ -0,0 +1,71 @@
+#########################################################################
+# Copyright (C) 2010-2011 Tavian Barnes <tavianator@tavianator.com> #
+# #
+# This file is part of The Dimension Test Suite. #
+# #
+# The Dimension Test Suite 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 3 of the #
+# License, or (at your option) any later version. #
+# #
+# The Dimension Test Suite 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, see <http://www.gnu.org/licenses/>. #
+#########################################################################
+
+camera = PerspectiveCamera(location = (3, 6, -11),
+ look_at = 0)
+
+background = 0.5*Color(0.73, 0.90, 0.97)
+
+light_color = 0.25*White
+lights.append(PointLight(location = (-3, 0, -5), color = light_color))
+lights.append(PointLight(location = (-1, 0, -5), color = light_color))
+lights.append(PointLight(location = ( 1, 0, -5), color = light_color))
+lights.append(PointLight(location = ( 3, 0, -5), color = light_color))
+
+lights.append(PointLight(location = (-3, 5, -5), color = light_color))
+lights.append(PointLight(location = (-1, 5, -5), color = light_color))
+lights.append(PointLight(location = ( 1, 5, -5), color = light_color))
+lights.append(PointLight(location = ( 3, 5, -5), color = light_color))
+
+objects.append(
+ Plane(
+ normal = Y, distance = -4,
+
+ texture = Texture(
+ pigment = Color(0.73, 0.90, 0.97),
+ finish = Ambient(0.5),
+ )
+ )
+)
+
+def make_sphere(x, y, z, size):
+ size -= 1
+
+ dx = sin(2*pi*x/size)
+ dy = sin(2*pi*y/size)
+ dz = sin(2*pi*z/size)
+ return Sphere(
+ center = 5*Vector(x, y, z)/size
+ + Vector(dy + dz, dx + dz, dx + dy)/4
+ - Vector(2.5, 2.5, 2.5),
+ radius = 2/size,
+
+ texture = Texture(
+ pigment = Color(x/size, y/size, z/size),
+ finish = Ambient(0.25) + Reflection(0.5)
+ )
+ )
+
+size = 10;
+for x in range(size):
+ for y in range(size):
+ for z in range(size):
+ objects.append(make_sphere(x, y, z, size))
+
+recursion_limit = 2*size
diff --git a/dimension/tests/demo.dmnsn b/dimension/tests/demo.dmnsn
new file mode 100644
index 0000000..47c0d76
--- /dev/null
+++ b/dimension/tests/demo.dmnsn
@@ -0,0 +1,134 @@
+#########################################################################
+# Copyright (C) 2010-2011 Tavian Barnes <tavianator@tavianator.com> #
+# #
+# This file is part of The Dimension Test Suite. #
+# #
+# The Dimension Test Suite 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 3 of the #
+# License, or (at your option) any later version. #
+# #
+# The Dimension Test Suite 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, see <http://www.gnu.org/licenses/>. #
+#########################################################################
+
+# Camera
+camera = PerspectiveCamera(location = (0, 0.25, -4),
+ look_at = 0)
+camera.transform(rotate(53*Y))
+
+# Lights
+lights = [
+ PointLight(location = (-15, 20, 10), color = White),
+]
+
+# Objects
+
+hollow_cube = Difference(
+ [
+ Box(
+ (-1, -1, -1), (1, 1, 1),
+
+ texture = Texture(
+ pigment = Color(0, 0, 1, trans = 0.75, filter = 1/3),
+ finish = Reflection(0.5),
+ ),
+ interior = Interior(
+ ior = 1.1,
+ ),
+ )
+ .transform(rotate(45*X)),
+
+ Sphere(
+ center = 0, radius = 1.25,
+ texture = Texture(
+ pigment = Green,
+ finish = Phong(strength = 0.2, size = 40),
+ ),
+ )
+ ],
+)
+
+arrow = Union(
+ [
+ Cylinder(bottom = -1.25*Y, top = 1.25*Y, radius = 0.1),
+ Cone(
+ bottom = 1.25*Y, bottom_radius = 0.1,
+ top = 1.5*Y, top_radius = 0,
+ open = True
+ ),
+ ],
+ texture = Texture(
+ pigment = ColorMap(
+ Gradient(Y),
+ {
+ 0/6: Red,
+ 1/6: Orange,
+ 2/6: Yellow,
+ 3/6: Green,
+ 4/6: Blue,
+ 5/6: Magenta,
+ 6/6: Red,
+ },
+ )
+ .transform(scale(1, 2.75, 1))
+ .transform(translate(-1.25*Y)),
+ ),
+)
+arrow.transform(rotate(-45*X))
+
+torii = Union(
+ [
+ Torus(major_radius = 0.15, minor_radius = 0.05)
+ .transform(translate(-Y)),
+
+ Torus(major_radius = 0.15, minor_radius = 0.05),
+
+ Torus(major_radius = 0.15, minor_radius = 0.05)
+ .transform(translate(Y)),
+ ],
+ texture = Texture(
+ pigment = Blue,
+ finish = Ambient(1),
+ ),
+)
+torii.transform(rotate(-45*X))
+
+ground = Plane(
+ normal = Y, distance = -2,
+
+ texture = Texture(
+ pigment = PigmentMap(
+ Checker(),
+ [
+ White,
+ ColorMap(Checker(), [Black, White]).transform(scale(1/3))
+ ],
+ ),
+ ),
+)
+
+objects = [
+ hollow_cube,
+ arrow,
+ torii,
+ ground,
+]
+
+# Sky sphere
+sky_sphere = SkySphere(
+ [
+ ColorMap(
+ pattern = Gradient(Y),
+ map = {
+ 0: Orange,
+ 0.35: Color(0, 0.1, 0.2, trans = 0.1, filter = 0.0),
+ },
+ ),
+ ]
+)