Commit | Line | Data |
---|---|---|
8ee66edd | 1 | import datetime |
e65a09cf | 2 | from logging import info |
8ee66edd | 3 | from os import getcwd |
e65a09cf FC |
4 | from 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 |
9 | def 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 | ||
58 | class 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() |