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
Beispiel #2
0
    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
Beispiel #4
0
    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