1#!/usr/bin/env python
2import vtk
3from vtk.util.misc import vtkGetDataRoot
4VTK_DATA_ROOT = vtkGetDataRoot()
5
6# This script shows a cube with edges and faces (using a coincident
7# topology offset for polygons) and with ambient, diffuse and specular
8# lighting.
9# Three polydata mappers are tested with (top row) and without
10# (bottom row) lighting:
11# 1) left renderer shows a vtkPolyDataMapper which effectively is a
12#    vtkOpenGLPolyDataMapper
13# 2) middle renderer shows a vtkCompositePolyDataMapper which delegates
14#    to a vtkOpenGLPolyDataMapper
15# 3) right renderer shows a vtkCompositePolyDataMapper2 which does the
16#    opengl rendering by itself
17
18# The cube
19cube = vtk.vtkCubeSource()
20rib=float(1.)
21cube.SetBounds(-rib/2,rib/2,-rib/2,rib/2,-rib/2,rib/2)
22cube.SetCenter(0,0,0)
23cube.Update()
24
25# Rotate the cube to show the faces being displaced
26transform = vtk.vtkTransform()
27transform.Identity()
28transform.RotateX(45)
29transform.RotateY(45)
30transformer=vtk.vtkTransformPolyDataFilter()
31transformer.SetInputConnection(cube.GetOutputPort())
32transformer.SetTransform(transform)
33transformer.Update()
34
35# A trivial multi-block to be used as input for
36# vtkCompositePolyDataMapper and vtkCompositePolyDataMapper2
37mbd = vtk.vtkMultiBlockDataSet()
38mbd.SetNumberOfBlocks(1)
39mbd.SetBlock(0,transformer.GetOutput())
40source=vtk.vtkTrivialProducer()
41source.SetOutput(mbd)
42
43# Set up the render window and the interactor.
44renWin=vtk.vtkRenderWindow()
45renWin.SetSize(600,400)
46iren=vtk.vtkRenderWindowInteractor()
47iren.SetRenderWindow(renWin)
48
49mappers=list()
50actors=list()
51renderers=list()
52
53polyMapper = vtk.vtkPolyDataMapper()
54polyMapper.SetInputConnection(transformer.GetOutputPort())
55mappers.append(polyMapper)
56
57mbdMapper = vtk.vtkCompositePolyDataMapper()
58mbdMapper.SetInputConnection(source.GetOutputPort())
59mappers.append(mbdMapper)
60
61mbdMapper2 = vtk.vtkCompositePolyDataMapper2()
62mbdMapper2.SetInputConnection(source.GetOutputPort())
63mappers.append(mbdMapper2)
64
65x=0
66dx=float(1)/len(mappers)
67
68# Define the property: lighting intensities, color,
69# edge visibility, point visibilty
70p1=vtk.vtkProperty()
71p1.SetColor(1,0,0)
72p1.LightingOff()
73p1.SetAmbient(0.2)
74p1.SetDiffuse(0.7)
75p1.SetSpecular(0.4)
76p1.SetSpecularPower(35)
77p1.EdgeVisibilityOn()
78p1.SetEdgeColor(1,1,1)
79p1.VertexVisibilityOn()
80p1.SetVertexColor(0,1,0)
81p1.SetPointSize(4)
82
83# Top row has lighting on
84p2=vtk.vtkProperty()
85p2.DeepCopy(p1)
86p2.LightingOn()
87
88light=vtk.vtkLight()
89light.SetPosition(1,1,1)
90
91for m in mappers:
92    # Push back the polygons
93    m.SetRelativeCoincidentTopologyPolygonOffsetParameters(10,2)
94
95    # Bottom renderer shows cube without lighting
96    actors.append(vtk.vtkActor())
97    a1=actors[-1]
98    a1.SetMapper(m)
99    a1.SetProperty(p1)
100    renderers.append(vtk.vtkRenderer())
101    r1 = renderers[-1]
102    r1.AddActor(a1)
103    r1.RemoveAllLights()
104    r1.AddLight(light)
105    r1.SetViewport(x,0,x+dx,0.5)
106    renWin.AddRenderer(r1)
107
108    # Top renderer shows cube with lighting
109    actors.append(vtk.vtkActor())
110    a2=actors[-1]
111    a2.SetMapper(m)
112    a2.SetProperty(p2)
113    renderers.append(vtk.vtkRenderer())
114    r2 = renderers[-1]
115    r2.AddActor(a2)
116    r2.RemoveAllLights()
117    r2.AddLight(light)
118    r2.SetViewport(x,0.5,x+dx,1.0)
119    renWin.AddRenderer(r2)
120    x=x+dx
121
122iren.Initialize()
123renWin.Render()
124# --- end of script ---
125