File: basic-savingfile-cerealizer-1.py

package info (click to toggle)
soya-doc 0.11.1-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 4,080 kB
  • ctags: 805
  • sloc: python: 3,380; makefile: 5
file content (146 lines) | stat: -rw-r--r-- 5,137 bytes parent folder | download
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".