From 817532b031cb9a15ccf27ff66d8031b31abce200 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Wed, 15 Jun 2011 23:39:36 -0600 Subject: Add Python client. --- dimension/Makefile.am | 23 ++++++++ dimension/dimension.in | 125 +++++++++++++++++++++++++++++++++++++++ dimension/tests/Makefile.am | 30 ++++++++++ dimension/tests/complex.dmnsn | 71 ++++++++++++++++++++++ dimension/tests/demo.dmnsn | 134 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 383 insertions(+) create mode 100644 dimension/Makefile.am create mode 100644 dimension/dimension.in create mode 100644 dimension/tests/Makefile.am create mode 100644 dimension/tests/complex.dmnsn create mode 100644 dimension/tests/demo.dmnsn (limited to 'dimension') 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 ## +## ## +## 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 . ## +########################################################################### + +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 # +# # +# 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 . # +######################################################################### + +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 ## +## ## +## 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 . ## +########################################################################### + +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 # +# # +# 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 . # +######################################################################### + +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 # +# # +# 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 . # +######################################################################### + +# 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), + }, + ), + ] +) -- cgit v1.2.3