ya2 · news · projects · code · about

some cleaning
[pmachines.git] / ya2 / p3d / gfx.py
CommitLineData
8ee66edd 1import datetime
e65a09cf 2from logging import info
8ee66edd 3from os import getcwd
e65a09cf
FC
4from panda3d.core import AntialiasAttrib, PandaNode, LightRampAttrib, \
5 NodePath, Point2, Point3, Texture
cb700bcc 6# from ya2.lib.p3d.p3d import LibP3d
8ee66edd
FC
7
8
64eae9c7
FC
9def set_srgb(model):
10 for texture in model.find_all_textures():
11 if texture.get_format() in [Texture.F_rgba, Texture.F_rgbm]:
12 texture.set_format(Texture.F_srgb_alpha)
13 elif texture.get_format() in [Texture.F_rgb]:
14 texture.set_format(Texture.F_srgb)
15
16
cb700bcc 17# class RenderToTexture:
8ee66edd 18
cb700bcc
FC
19# def __init__(self, size=(256, 256)):
20# self.__set_buffer(size)
21# self.__set_display_region()
22# self.__set_camera()
23# self.__set_root()
24# self.display_region.set_camera(self.camera)
8ee66edd 25
cb700bcc
FC
26# def __set_buffer(self, size):
27# self.buffer = base.win.make_texture_buffer('result buffer', size[0],
28# size[1])
29# self.buffer.set_sort(-100)
8ee66edd 30
cb700bcc
FC
31# def __set_display_region(self):
32# self.display_region = self.buffer.make_display_region()
33# self.display_region.set_sort(20)
8ee66edd 34
cb700bcc
FC
35# def __set_camera(self):
36# self.camera = NodePath(Camera('camera 2d'))
37# lens = OrthographicLens()
38# lens.set_film_size(1, 1)
39# lens.set_near_far(-1000, 1000)
40# self.camera.node().set_lens(lens)
8ee66edd 41
cb700bcc
FC
42# def __set_root(self):
43# self.root = NodePath('root')
44# self.root.set_depth_test(False)
45# self.root.set_depth_write(False)
46# self.camera.reparent_to(self.root)
8ee66edd 47
cb700bcc
FC
48# @property
49# def texture(self): return self.buffer.get_texture()
8ee66edd 50
cb700bcc
FC
51# def destroy(self):
52# base.graphicsEngine.remove_window(self.buffer)
53# if base.win: # if you close the window during a race
54# base.win.remove_display_region(self.display_region)
55# list(map(lambda node: node.remove_node(), [self.camera, self.root]))
8ee66edd
FC
56
57
58class P3dGfxMgr:
59
e65a09cf
FC
60 # def __init__(self, model_path, antialiasing, shaders, srgb):
61 # self.root = P3dNode(render)
62 # self.__srgb = srgb
63 # self.callbacks = {}
64 # self.filters = None
65 # get_model_path().append_directory(model_path)
66 # if LibP3d.runtime():
67 # root_dir = LibP3d.p3dpath(dirname(__file__))
68 # paths = [root_dir + '/' + model_path, root_dir]
69 # list(map(get_model_path().append_directory, paths))
70 # render.set_shader_auto()
71 # # render.set_two_sided(True) # it breaks shadows
72 # if antialiasing: render.set_antialias(AntialiasAttrib.MAuto)
73 # if shaders and base.win:
74 # self.filters = CommonFilters(base.win, base.cam)
75
76 # def load_model(self, filename, callback=None, anim=None):
77 # ext = '.bam' if exists(filename + '.bam') else ''
78 # if anim:
79 # anim_dct = {'anim': filename + '-Anim' + ext}
80 # node = P3dNode(self.set_srgb(Actor(filename + ext, anim_dct)))
81 # elif callback:
82 # callb = lambda model: callback(P3dNode(self.set_srgb(model)))
83 # node = loader.loadModel(filename + ext, callback=callb)
84 # else:
85 # node = P3dNode(self.set_srgb(
86 # loader.loadModel(LibP3d.p3dpath(filename + ext))))
87 # return node
8ee66edd
FC
88
89 def set_srgb(self, model):
90 if self.__srgb:
91 for texture in model.find_all_textures():
92 if texture.get_format() in [Texture.F_rgba, Texture.F_rgbm]:
93 texture.set_format(Texture.F_srgb_alpha)
94 elif texture.get_format() in [Texture.F_rgb]:
95 texture.set_format(Texture.F_srgb)
96 return model
97
98 @staticmethod
99 def toggle_aa():
100 aa_not_none = render.get_antialias() != AntialiasAttrib.MNone
101 if render.has_antialias() and aa_not_none:
102 render.clear_antialias()
e65a09cf
FC
103 else:
104 render.set_antialias(AntialiasAttrib.MAuto, 1)
8ee66edd
FC
105
106 def set_toon(self):
107 tmp_node = NodePath(PandaNode('temp node'))
108 tmp_node.set_attrib(LightRampAttrib.make_single_threshold(.5, .4))
109 tmp_node.set_shader_auto()
110 base.cam.node().set_initial_state(tmp_node.get_state())
111 self.filters.set_cartoon_ink(separation=1)
112
113 def set_bloom(self):
e65a09cf
FC
114 if not base.win:
115 return
8ee66edd
FC
116 self.filters.setBloom(
117 blend=(.3, .4, .3, 0), mintrigger=.6, maxtrigger=1.0, desat=.6,
118 intensity=1.0, size='medium')
119 # default: (.3, .4, .3, 0), .6, 1, .6, 1, 'medium'
120
121 @staticmethod
122 def pos2d(node):
123 p3d = base.cam.get_relative_point(node.node, Point3(0, 0, 0))
124 p2d = Point2()
125 return p2d if base.camLens.project(p3d, p2d) else None
126
13263131
FC
127 @staticmethod
128 def screen_coord(pos):
129 new_node = NodePath('temp')
130 new_node.set_pos(pos)
131 coord3d = new_node.get_pos(base.cam)
132 new_node.remove_node()
133 coord2d = Point2()
134 base.camLens.project(coord3d, coord2d)
135 coord_r2d = Point3(coord2d[0], 0, coord2d[1])
e65a09cf
FC
136 coord_a2d = base.aspect2d.get_relative_point(
137 render2d, coord_r2d)
13263131
FC
138 return coord_a2d[0], coord_a2d[2]
139
140 @staticmethod
141 def world_from_to(pos):
142 p_from, p_to = Point3(), Point3() # in camera coordinates
143 base.camLens.extrude(pos, p_from, p_to)
e65a09cf
FC
144 p_from = render.get_relative_point(
145 base.cam, p_from) # global coords
146 p_to = render.get_relative_point(
147 base.cam, p_to) # global coords
13263131
FC
148 return p_from, p_to
149
8ee66edd
FC
150 @property
151 def shader_support(self):
152 return base.win.get_gsg().get_supports_basic_shaders()
153
154 def screenshot(self, path=None):
155 time = datetime.datetime.now().strftime('%y%m%d%H%M%S')
e65a09cf
FC
156 # res = base.win.save_screenshot(
157 # Filename(path or ("yocto%s.png" % time)))
158 # debug('screenshot %s (%s)' % (path or ("yocto%s.png" % time), res))
159 res = base.screenshot(
160 path or ("pmachines%s.png" % time), False)
161 info('screenshot %s (%s; %s)' % (path or ("pmachines%s.png" % time),
162 res, getcwd()))
8ee66edd
FC
163
164 @staticmethod
e65a09cf
FC
165 def enable_shader():
166 render.set_shader_auto()
8ee66edd
FC
167
168 @staticmethod
e65a09cf
FC
169 def disable_shader():
170 render.set_shader_off()
8ee66edd
FC
171
172 @staticmethod
173 def print_stats(two_d=True, three_d=True, analyze=True, ls=True):
174 '''Print graphics stats. They use standard output (from p3d).'''
175 info = []
176 if two_d and analyze:
e65a09cf 177 info += [('render2d.analyze', base.render2d.analyze)]
8ee66edd 178 if three_d and analyze:
e65a09cf 179 info += [('render.analyze', base.render.analyze)]
8ee66edd 180 if two_d and ls:
e65a09cf 181 info += [('render2d.ls', base.render2d.ls)]
8ee66edd 182 if three_d and ls:
e65a09cf 183 info += [('render.ls', base.render.ls)]
8ee66edd
FC
184 for elm in info:
185 print('\n\n#####\n%s()' % elm[0])
186 elm[1]()
187
188
cb700bcc 189# class P3dNode:
8ee66edd 190
cb700bcc
FC
191# def __init__(self, nodepath):
192# self.nodepath = nodepath
193# self.node.set_python_tag('libnode', self)
8ee66edd 194
cb700bcc
FC
195# def set_collide_mask(self, mask): return self.node.set_collide_mask(mask)
196# def set_x(self, val): return self.node.set_x(val)
197# def set_y(self, val): return self.node.set_y(val)
198# def set_z(self, val): return self.node.set_z(val)
199# def set_hpr(self, val): return self.node.set_hpr(val)
200# def set_h(self, val): return self.node.set_h(val)
201# def set_p(self, val): return self.node.set_p(val)
202# def set_r(self, val): return self.node.set_r(val)
203# def set_scale(self, val): return self.node.set_scale(val)
204# def set_transparency(self, val): return self.node.set_transparency(val)
205# def set_alpha_scale(self, val): return self.node.set_alpha_scale(val)
206# def set_texture(self, texturestage, texture):
207# return self.node.set_texture(texturestage, texture)
208# def has_tag(self, name): return self.node.has_tag(name)
209# def get_tag(self, name): return self.node.get_tag(name)
210# def get_python_tag(self, name): return self.node.get_python_tag(name)
211# def remove_node(self): return self.node.remove_node()
212# def flatten_strong(self): return self.node.flatten_strong()
213# def clear_model_nodes(self): return self.node.clear_model_nodes()
214# def show(self): return self.node.show()
215# def set_depth_offset(self, val): return self.node.set_depth_offset(val)
216# def loop(self, val): return self.node.loop(val)
217# def cleanup(self): return self.node.cleanup()
218# def write_bam_file(self, fname): return self.node.write_bam_file(fname)
8ee66edd 219
cb700bcc
FC
220# def attach_node(self, name):
221# return P3dNode(self.node.attach_new_node(name))
8ee66edd 222
cb700bcc
FC
223# def add_shape(self, shape):
224# return self.node.node().add_shape(shape._mesh_shape)
225# #TODO: don't access a protected member
8ee66edd 226
cb700bcc
FC
227# @property
228# def name(self): return self.node.get_name()
8ee66edd 229
cb700bcc
FC
230# @property
231# def node(self): return self.nodepath
8ee66edd 232
cb700bcc
FC
233# @property
234# def p3dnode(self): return self.node.node()
8ee66edd 235
cb700bcc
FC
236# def set_pos(self, pos): return self.node.set_pos(pos._vec)
237# #TODO: don't access a protected member
8ee66edd 238
cb700bcc
FC
239# def get_pos(self, other=None):
240# return self.node.get_pos(* [] if other is None else [other.node])
8ee66edd 241
cb700bcc
FC
242# @property
243# def x(self): return self.node.get_x()
8ee66edd 244
cb700bcc
FC
245# @property
246# def y(self): return self.node.get_y()
8ee66edd 247
cb700bcc
FC
248# @property
249# def z(self): return self.node.get_z()
8ee66edd 250
cb700bcc
FC
251# @property
252# def hpr(self): return self.node.get_hpr()
8ee66edd 253
cb700bcc
FC
254# @property
255# def h(self): return self.node.get_h()
8ee66edd 256
cb700bcc
FC
257# @property
258# def p(self): return self.node.get_p()
8ee66edd 259
cb700bcc
FC
260# @property
261# def r(self): return self.node.get_r()
8ee66edd 262
cb700bcc
FC
263# @property
264# def scale(self): return self.node.get_scale()
8ee66edd 265
cb700bcc
FC
266# @property
267# def is_empty(self): return self.node.is_empty()
8ee66edd 268
cb700bcc
FC
269# def get_relative_vector(self, node, vec):
270# return self.node.get_relative_vector(node.node, vec)
8ee66edd 271
cb700bcc 272# def set_material(self, mat): return self.node.set_material(mat, 1)
8ee66edd 273
cb700bcc
FC
274# def set_python_tag(self, name, val):
275# return self.node.set_python_tag(name, val)
8ee66edd 276
cb700bcc
FC
277# def get_distance(self, other_node):
278# return self.node.get_distance(other_node.node)
8ee66edd 279
cb700bcc 280# def reparent_to(self, parent): return self.node.reparent_to(parent.node)
8ee66edd 281
cb700bcc
FC
282# def wrt_reparent_to(self, parent):
283# return self.node.wrt_reparent_to(parent.node)
8ee66edd 284
cb700bcc
FC
285# @staticmethod
286# def __get_pandanode(nodepath):
287# if nodepath.has_python_tag('libnode'):
288# return nodepath.get_python_tag('libnode')
289# return P3dNode(nodepath)
8ee66edd 290
cb700bcc
FC
291# def find_all_matches(self, name):
292# nodes = self.node.find_all_matches(name)
293# return [self.__get_pandanode(node) for node in nodes]
8ee66edd 294
cb700bcc
FC
295# def find(self, name):
296# model = self.node.find(name)
297# if model: return self.__get_pandanode(model)
8ee66edd 298
cb700bcc 299# def optimize(self):
e65a09cf
FC
300# # crash with texture.set_format
301# self.node.prepare_scene(base.win.get_gsg())
cb700bcc 302# self.node.premunge_scene(base.win.get_gsg())
8ee66edd 303
cb700bcc
FC
304# def hide(self, mask=None):
305# return self.node.hide(*[] if mask is None else [mask])
8ee66edd 306
cb700bcc
FC
307# @property
308# def tight_bounds(self): return self.node.get_tight_bounds()
8ee66edd 309
cb700bcc
FC
310# @property
311# def parent(self): return self.node.get_parent()
8ee66edd 312
cb700bcc
FC
313# @property
314# def children(self): return self.node.get_children()
8ee66edd 315
cb700bcc 316# def destroy(self): return self.node.remove_node()
8ee66edd 317
8ee66edd 318
cb700bcc
FC
319# class P3dAnimNode:
320
321# def __init__(self, filepath, anim_dct):
322# self.node = Actor(filepath, anim_dct)
323
324# def loop(self, val): return self.node.loop(val)
325
326# def reparent_to(self, node): self.node.reparent_to(node)
327
328# @property
329# def name(self): return self.node.get_name()
8ee66edd 330
cb700bcc
FC
331# def optimize(self):
332# self.node.prepare_scene(base.win.get_gsg())
333# self.node.premunge_scene(base.win.get_gsg())
8ee66edd 334
cb700bcc
FC
335# def set_omni(self):
336# self.node.node().set_bounds(OmniBoundingVolume())
337# self.node.node().set_final(True)
8ee66edd 338
cb700bcc 339# def destroy(self): self.node.cleanup()
8ee66edd
FC
340
341
cb700bcc 342# class P3dAmbientLight:
8ee66edd 343
cb700bcc
FC
344# def __init__(self, color):
345# ambient_lgt = P3DAmbientLight('ambient light')
346# ambient_lgt.set_color(color)
347# self.ambient_np = render.attach_new_node(ambient_lgt)
348# render.set_light(self.ambient_np)
8ee66edd 349
cb700bcc
FC
350# def destroy(self):
351# render.clear_light(self.ambient_np)
352# self.ambient_np.remove_node()
8ee66edd
FC
353
354
cb700bcc 355# class P3dSpotlight:
8ee66edd 356
cb700bcc
FC
357# def __init__(self, mask=None):
358# self.spot_lgt = render.attach_new_node(P3DSpotlight('spot'))
359# snode = self.spot_lgt.node()
360# snode.set_scene(render)
361# snode.set_shadow_caster(True, 1024, 1024)
362# snode.get_lens().set_fov(40)
363# snode.get_lens().set_near_far(20, 200)
364# if mask: snode.set_camera_mask(mask)
365# render.set_light(self.spot_lgt)
8ee66edd 366
cb700bcc 367# def set_pos(self, pos): return self.spot_lgt.set_pos(*pos)
8ee66edd 368
cb700bcc 369# def look_at(self, pos): return self.spot_lgt.look_at(*pos)
8ee66edd 370
cb700bcc 371# def set_color(self, color): return self.spot_lgt.set_color(*color)
8ee66edd 372
cb700bcc
FC
373# def destroy(self):
374# render.clear_light(self.spot_lgt)
375# self.spot_lgt.remove_node()