def setupDraw(self, highlighted = False, selected = False, patterning = True, highlight_color = None, opacity = 1.0): """ Set up for hover-highlighting and selection drawing styles. There is similar code in CSDL.draw(), which has similar arguments. XXX Does Solid and halo now, need to implement patterned drawing too. """ # Shader needs to be active to set uniform variables. wasActive = self._active if not wasActive: self.setActive(True) pass patterned_highlighting = (False and # XXX patterning and isPatternedDrawing(highlight = highlighted)) # note: patterned_highlighting variable is not yet used here [bruce 090304 comment] halo_selection = (selected and env.prefs[selectionColorStyle_prefs_key] == SS_HALO) halo_highlighting = (highlighted and env.prefs[hoverHighlightingColorStyle_prefs_key] == HHS_HALO) # Halo drawing style is used for hover-highlighing and halo-selection. drawing_style = DS_NORMAL # Solid drawing by default. if halo_highlighting or halo_selection: drawing_style = DS_HALO # Halo drawing was first implemented with wide-line drawing, which # extends to both sides of the polygon edge. The halo is actually # half the wide-line width that is specified by the setting. # XXX The setting should be changed to give the halo width instead. halo_width = env.prefs[haloWidth_prefs_key] / 2.0 # The halo width is specified in viewport pixels, as is the window # width the viewport transform maps onto. In post-projection and # clipping normalized device coords (+-1), it's a fraction of the # window half-width of 1.0 . ndc_halo_width = halo_width / (self.window_width / 2.0) glUniform1fARB(self._uniform("ndc_halo_width"), ndc_halo_width) elif highlighted or selected: drawing_style = DS_NORMAL # Non-halo highlighting or selection. glUniform1iARB(self._uniform("drawing_style"), drawing_style) # Color for selection or highlighted drawing. override_color = None if highlighted: if highlight_color is None: # Default highlight color. override_color = env.prefs[hoverHighlightingColor_prefs_key] else: # Highlight color passed as an argument. override_color = highlight_color elif selected: override_color = env.prefs[selectionColor_prefs_key] pass if override_color: if len(override_color) == 3: override_color += (opacity,) pass glUniform4fvARB(self._uniform("override_color"), 1, override_color) pass if not wasActive: self.setActive(False) pass return
def configShader(self, glpane): """ Fill in uniform variables in the shader self, before using it to draw. @param glpane: The current glpane, containing NE1 graphics context information related to the drawing environment. This is used to find proper values for uniform variables we set in the shader. """ # Can't do anything good after an error loading the shader programs. if self.error: return # Shader needs to be active to set uniform variables. wasActive = self._active if not wasActive: self.setActive(True) pass # Debugging control. if self._has_uniform_debug_code: # review: use _has_uniform("debug_code") instead? glUniform1iARB( self._uniform("debug_code"), int(debug_pref("GLPane: shader debug graphics?", Choice_boolean_False, prefs_key = True))) # Default override_opacity, multiplies the normal color alpha component. glUniform1fARB(self._uniform("override_opacity"), 1.0) # Russ 081208: Consider caching the glpane pointer. GLPane_minimal # inherits from QGLWidget, which includes the OpenGL graphics context. # Currently we share 'display list context' and related information # across two kinds of OpenGL contexts, the main GLPane and the # ThumbViews used to select atom types, show clipboard parts, and maybe # more. In the future it may be more complicated. Then we may need to # be more specific about accounting for what's in particular contexts. # XXX Hook in full NE1 lighting scheme and material settings. # Material is [ambient, diffuse, specular, shininess]. glUniform4fvARB(self._uniform("material"), 1, [0.3, 0.6, 0.5, 20.0]) glUniform1iARB(self._uniform("perspective"), (1, 0)[glpane.ortho]) # See GLPane._setup_projection(). vdist = glpane.vdist # See GLPane_minimal.setDepthRange_Normal(). near = vdist * (glpane.near + glpane.DEPTH_TWEAK) far = vdist * glpane.far glUniform4fvARB(self._uniform("clip"), 1, [near, far, 0.5*(far + near), 1.0/(far - near)]) # The effect of setDepthRange_Highlighting() is done as the shaders # set the gl_FragDepth during a highlighted drawing style. glUniform1fARB(self._uniform("DEPTH_TWEAK"), glpane.DEPTH_TWEAK) # Pixel width of window for halo drawing calculations. self.window_width = glpane.width # Single light for now. # XXX Get NE1 lighting environment state. glUniform4fvARB(self._uniform("intensity"), 1, [1.0, 0.0, 0.0, 0.0]) light0 = A([-1.0, 1.0, 1.0]) glUniform3fvARB(self._uniform("light0"), 1, light0) # Blinn shading highlight vector, halfway between the light and the eye. eye = A([0.0, 0.0, 1.0]) halfway0 = norm((eye + light0) / 2.0) glUniform3fvARB(self._uniform("light0H"), 1, halfway0) if not wasActive: self.setActive(False) return