def get_drawLevel(self, assy_or_part): """ Get the recommended sphere drawingLevel to use for drawing assy_or_part in self. @param assy_or_part: an Assembly, or its current .part, a Part """ #bruce 090306 split out of ChunkDrawer, optimized for shaders #bruce 090309 revised if self.permit_shaders and \ self.glprefs.sphereShader_desired() and \ drawing_globals.sphereShader_available(): # drawLevel doesn't matter (not used by shaders), # so return a constant value to avoid accessing assy.drawLevel, # and therefore (I hope) avoid recomputing the number of atoms # in assy. But in case of bugs in which this ends up being used, # let this constant be the usual level "2". # [todo: use a symbolic constant, probably there is one already] return 2 else: return assy_or_part.drawLevel # this might recompute it # (if that happens and grabs the pref value, I think this won't # subscribe our Chunks' display list to it, since we're called # outside the begin/ends for those, and that's good, since they # include this in havelist instead, which avoids some unneeded # redrawing, e.g. if pref changed and changed back while # displaying a different Part. [bruce 060215]) pass
def schedule_sphere(color, pos, radius, detailLevel, opacity = 1.0, testloop = 0): """ Schedule a sphere for rendering whenever ColorSorter thinks is appropriate. """ if _DEBUG and ColorSorter._parent_csdl and ColorSorter._parent_csdl.reentrant: print "bare_prim sphere:", ColorSorter._gl_name_stack[-1], \ color, pos, radius, ColorSorter._debug_transforms() if ColorSorter._parent_csdl and ColorSorter._parent_csdl.reentrant: # todo: use different flag than .reentrant pos = ColorSorter._transform_point(pos) if ColorSorter.glpane.glprefs.use_c_renderer and ColorSorter.sorting: if len(color) == 3: lcolor = (color[0], color[1], color[2], opacity) else: lcolor = color ColorSorter._cur_shapelist.add_sphere( lcolor, pos, radius, ColorSorter._gl_name_stack[-1]) # 20060208 grantham - I happen to know that one detailLevel # is chosen for all spheres, I just record it over and # over here, and use the last one for the render if (ColorSorter.sphereLevel > -1 and ColorSorter.sphereLevel != detailLevel): raise ValueError, \ "unexpected different sphere LOD levels within same frame" ColorSorter.sphereLevel = detailLevel pass else: # Non-C-coded material rendering (might be sorted and/or use shaders) sphereBatches = ( ColorSorter._permit_shaders and ColorSorter.glpane.glprefs.sphereShader_desired() and drawing_globals.sphereShader_available() ) if len(color) == 3: lcolor = (color[0], color[1], color[2], opacity) else: lcolor = color pass if sphereBatches and ColorSorter._parent_csdl: # Russ 080925: Added. # Collect lists of primitives in the CSDL, rather than sending # them down through the ColorSorter schedule methods into DLs. assert ColorSorter.sorting # since _parent_csdl is present ColorSorter._parent_csdl.addSphere( pos, radius, lcolor, # glnames come from ColorSorter.pushName() ColorSorter._gl_name_stack[-1]) else: vboLevel = ColorSorter.glpane.glprefs.use_drawing_variant # vboLevel sets drawing strategy for unbatched spheres detailLevel = (vboLevel, detailLevel) # KLUGE, explained in a comment inside drawsphere_worker if testloop > 0: worker = drawsphere_worker_loop else: worker = drawsphere_worker ColorSorter.schedule( lcolor, worker, (pos, radius, detailLevel, testloop)) pass return
def schedule_sphere(color, pos, radius, detailLevel, opacity=1.0, testloop=0): """ Schedule a sphere for rendering whenever ColorSorter thinks is appropriate. """ if _DEBUG and ColorSorter._parent_csdl and ColorSorter._parent_csdl.reentrant: print "bare_prim sphere:", ColorSorter._gl_name_stack[-1], \ color, pos, radius, ColorSorter._debug_transforms() if ColorSorter._parent_csdl and ColorSorter._parent_csdl.reentrant: # todo: use different flag than .reentrant pos = ColorSorter._transform_point(pos) if ColorSorter.glpane.glprefs.use_c_renderer and ColorSorter.sorting: if len(color) == 3: lcolor = (color[0], color[1], color[2], opacity) else: lcolor = color ColorSorter._cur_shapelist.add_sphere( lcolor, pos, radius, ColorSorter._gl_name_stack[-1]) # 20060208 grantham - I happen to know that one detailLevel # is chosen for all spheres, I just record it over and # over here, and use the last one for the render if (ColorSorter.sphereLevel > -1 and ColorSorter.sphereLevel != detailLevel): raise ValueError, \ "unexpected different sphere LOD levels within same frame" ColorSorter.sphereLevel = detailLevel pass else: # Non-C-coded material rendering (might be sorted and/or use shaders) sphereBatches = (ColorSorter._permit_shaders and ColorSorter.glpane.glprefs.sphereShader_desired() and drawing_globals.sphereShader_available()) if len(color) == 3: lcolor = (color[0], color[1], color[2], opacity) else: lcolor = color pass if sphereBatches and ColorSorter._parent_csdl: # Russ 080925: Added. # Collect lists of primitives in the CSDL, rather than sending # them down through the ColorSorter schedule methods into DLs. assert ColorSorter.sorting # since _parent_csdl is present ColorSorter._parent_csdl.addSphere( pos, radius, lcolor, # glnames come from ColorSorter.pushName() ColorSorter._gl_name_stack[-1]) else: vboLevel = ColorSorter.glpane.glprefs.use_drawing_variant # vboLevel sets drawing strategy for unbatched spheres detailLevel = (vboLevel, detailLevel) # KLUGE, explained in a comment inside drawsphere_worker if testloop > 0: worker = drawsphere_worker_loop else: worker = drawsphere_worker ColorSorter.schedule(lcolor, worker, (pos, radius, detailLevel, testloop)) pass return