1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
# -*- indent-tabs-mode: t -*-
# Soya 3D tutorial
# Copyright (C) 2001-2004 Jean-Baptiste LAMY
#
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# basic-savingfile-cerealizer-1: Save a file with cerealizer : save the rotating volume
# This lesson saves the rotating model of lesson basic-2 into a file, using Cerealizer.
# Of course, you need to install Cerealizer (a secure Pickle-like module), from:
#
# http://home.gna.org/oomadness/en/cerealizer/index.html
# Imports Soya and Cerealizer.
import sys, os, os.path, soya
import cerealizer
# Create a class of rotating volume. See tuto basic-2 for more information on this.
# Notice that you can add attribute to your class, and they will be automatically saved.
class RotatingVolume(soya.Volume):
def advance_time(self, proportion):
soya.Volume.advance_time(self, proportion)
self.rotate_y(proportion * 5.0)
# Register the RotatingVolume class as safe for Cerealizer.
cerealizer.register(RotatingVolume)
# The cerealizer.register accept any Python classes. Wether a class inherits from a Soya class
# (such as, here, Volume) or not, doesn't change anything.
# However, if your class inherits from World, Image, Shape, Material, you have to do something
# special if you want to use YourClass.get() or YourClass.save(). This involves actually any
# SavedInAPath object, i.e. any object Soya saves in a specific subpath of soya.path.
#
# E.g. for a World, you should do:
#
#import soya.cerealizer4soya
#class YourWorld(soya.World):
# pass
#cerealizer.register(YourWorld, soya.cerealizer4soya.SavedInAPathHandler(YourWorld))
#
# And then you can use YourWorld.get("filename") and so on.
#
# If you want the file to be saved in a different subdirectory of soya.path, e.g.
# data/your_worlds/ instead of data/worlds/, do:
#
#class YourWorld(soya.World):
# DIRNAME = "your_worlds"
# The rest of the file is executed ONLY if this file is run as a script.
# This allows to import this file as a module, for defining the RotatingVolume class.
if __name__ == "__main__":
# Inits Soya and sets the data directory.
soya.init()
soya.path.append(os.path.join(os.path.dirname(sys.argv[0]), "data"))
# Sets the file format soya uses for saving file.
#
# The default configuration is to use cPickle for saving files, and to support loading
# files saved either by cPickle or Cerealizer (if available).
#
# The complete syntax is set_file_format(saving_format, loading_format), where loading_format
# is optional and can be either a single format, or a list of format.
# There are currently 2 supported formats: cPickle and Cerealizer.
# See set_file_format's __doc__ for more information.
soya.set_file_format(cerealizer)
# Creates the scene.
scene = soya.World()
# Loads the sword model.
sword_model = soya.Shape.get("sword")
# Creates a rotating volume in the scene, using the sword model.
sword = RotatingVolume(scene, sword_model)
# Creates a light.
light = soya.Light(scene)
light.set_xyz(0.5, 0.0, 2.0)
# Set the scene filename. It is just the name of the file, soya adds automatically
# a directory path as well as a ".data" extention.
scene.filename = "a_scene_with_a_rotating_volume"
# Saves the scene. The file is created in the <soya.path[0]>/worlds/ directory, here:
#
# tutorial/data/worlds/a_scene_with_a_rotating_volume.data
#
# The file is ALWAYS saved in the FIRST path listed in soya.path (which is, as sys.path,
# a list of path).
#
# Soya separates the "set filename" and the "save" step, because it allows you to set the
# filename once, and then to save the object several times without having to remind its
# filename.
#
# Notice that, while saving the scene, Soya will save a reference to the "sword" Shape we
# have used above. However, the data of this Shape are NOT dupplicated.
scene.save()
# Creates a camera.
#
# For technical reasons, camera are not saveable yet. This is not really a problem since the
# camera is not really scene-dependent by rather configuration-dependent.
# We thus add the camera AFTER saving the scene.
camera = soya.Camera(scene)
camera.z = 3.0
soya.set_root_widget(camera)
soya.Idler(scene).idle()
# That's all -- after running this tutorial, you should have a
# tutorial/data/worlds/a_scene_with_a_rotating_volume.data file. The easiest way to verify
# that this file is REALLY a Cerealizer file, is to open the file and check if it begins
# by the magic string "cereal1".
|