File: Modifier.py

package info (click to toggle)
esys-particle 2.1-4
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 7,284 kB
  • sloc: cpp: 77,304; python: 5,647; makefile: 1,176; sh: 10
file content (134 lines) | stat: -rw-r--r-- 4,131 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
#############################################################
##                                                         ##
## Copyright (c) 2003-2011 by The University of Queensland ##
## Earth Systems Science Computational Centre (ESSCC)      ##
## http://www.uq.edu.au/esscc                              ##
##                                                         ##
## Primary Business: Brisbane, Queensland, Australia       ##
## Licensed under the Open Software License version 3.0    ##
## http://www.opensource.org/licenses/osl-3.0.php          ##
##                                                         ##
#############################################################

"""
Defines classes which relate to I{modifying} renderable objects.
"""

from esys.lsm.vis import core
from Color        import RgbColor

class Modifiable(core.Modifiable):
    def __init__(self):
        core.Modifiable.__init__(self)

    def apply(self, modifier):
        if (isinstance(modifier, RgbColor)):
            modifier = Pigment(modifier)
        core.Modifiable.apply(self, modifier)

    def applySingle(self, modifier):
        if (isinstance(modifier, RgbColor)):
            modifier = Pigment(modifier)
        core.Modifiable.applySingle(self, modifier)

    def writeSdl(self, f):
        for modifier in self.getModifierList():
            modifier.writeSdl(f)

class Modifier(core.Modifier):
    def __init__(self):
        pass

    def writeSdl(self, f):
        core.raiseNotImplementedError("Not implemented.")

class Pigment(Modifier):
    def __init__(self, pigment, transmit=0.0):
        self.pigment  = pigment
        self.transmit = transmit

    def writeSdl(self, f):
        f.write("pigment {")
        self.pigment.writeSdl(f)
        if (self.transmit > 0.0):
            f.write(" image_map { transmit ")
            f.write(str(self.transmit) + "}")
        f.write("}")

class Finish(Modifier):
    def __init__(
        self,
        ambient=0.2,
        diffuse=0.5,
        reflection=0.25,
        specular=0.4,
        roughness=0.01
    ):
        self.ambient    = ambient
        self.diffuse    = diffuse
        self.reflection = reflection
        self.specular   = specular
        self.roughness  = roughness

    def writeSdl(self, f):
        f.write("finish {")
        f.write(" ambient ")
        f.write(str(self.ambient))
        f.write(" diffuse ")
        f.write(str(self.diffuse))
        f.write(" reflection ")
        f.write(str(self.reflection))
        f.write(" specular ")
        f.write(str(self.specular))
        f.write(" roughness ")
        f.write(str(self.roughness))
        f.write("}")

class Orientation(Modifier):
    def __init__(self, matrix=None):
        self.matrix = [[1.0,0.0,0.0], [0.0,1.0,0.0], [0.0,0.0,1.0], [0.0,0.0,0.0]]
        if (matrix != None):
            for i in range(0, matrix.getNumRows()):
                for j in range (0, matrix.getNumCols()):
                    self.matrix[j][i] = matrix(i,j)

    def writeSdl(self, f):
        f.write("matrix <")
        f.write("  %s," % ",".join(map(str,self.matrix[0])))
        f.write("  %s," % ",".join(map(str,self.matrix[1])))
        f.write("  %s," % ",".join(map(str,self.matrix[2])))
        f.write("  %s" % ",".join(map(str,self.matrix[3])))
        f.write(">")

class Scale(Modifier):
    def __init__(self, scale=1.0):
        if (hasattr(scale,"__iter__")):
            self.scale = tuple(scale)
        else:
            self.scale = (scale,scale,scale)

    def writeSdl(self, f):
        f.write(" scale <%s> " % ",".join(map(str,self.scale)))

class Pattern:
    def __init__(self):
        pass

class Checker(Pattern,Modifiable):
    def __init__(self, color0=None, color1=None):
        Pattern.__init__(self)
        Modifiable.__init__(self)
        self.color0 = color0
        self.color1 = color1

    def writeSdl(self, f):
        f.write("checker ")
        if (self.color0 != None):
            self.color0.writeSdl(f)
            f.write(" ")
        if (self.color1 != None):
            self.color1.writeSdl(f)
        Modifiable.writeSdl(self, f)