Files
2026-08-03 18:42:47 +08:00

75 lines
2.6 KiB
Python

from pymol.cgo import *
import pymol
from pymol import cmd, testing, stored
import unittest
class TestCGOLighting(testing.PyMOLTestCase):
@testing.foreach((0),(1))
@testing.requires('gui')
@testing.requires_version('1.7.3')
# if normals are set, then object's cgo_lighting should be set
def test_cgo_lighting_setting(self, has_normal):
objname = 'simpletri'
obj = []
if has_normal:
obj.extend([NORMAL, 0., 0., 1.])
obj.extend([
BEGIN, TRIANGLES,
COLOR, 1.0, 0., 0.,
VERTEX, 0.0, 0.0, 0.0,
VERTEX, 1.0, 0.0, 0.0,
VERTEX, 0.0, 1.0, 0.0,
END
])
cmd.load_cgo(obj,objname,1)
cgo_lighting = cmd.get('cgo_lighting', objname)
self.assertEqual(int(cgo_lighting), int(has_normal))
@testing.foreach.product((0,1), (0,1), (0,1), (0,1), (0,1), (0,1))
@testing.requires('gui')
@testing.requires_version('1.7.3')
def testBackfaceLighting(self, use_shader, has_normal, two_sided_lighting, backface_cull, cgo_lighting, back):
viewport = (50, 50)
cmd.viewport(*viewport)
objname = 'simpletri'
obj = []
if has_normal: # specifies a normal
obj.extend([NORMAL, 0., 0., 1.])
obj.extend([
BEGIN, TRIANGLES,
COLOR, 1.0, 0., 0.,
VERTEX, 0.0, 0.0, 0.0,
VERTEX, 1.0, 0.0, 0.0,
VERTEX, 0.0, 1.0, 0.0,
END
])
cmd.load_cgo(obj,objname,1)
cmd.set('use_shader', use_shader)
cmd.set('two_sided_lighting', two_sided_lighting)
cmd.set('backface_cull', backface_cull)
cmd.set('cgo_lighting', cgo_lighting, objname)
cmd.set('depth_cue', 0)
cmd.set('antialias', 0)
cmd.set('light_count', 1)
if back:
cmd.turn("y", 180)
# to see the images
# cmd.png("%d__%d_%d_%d_%d_%d_%d_test.png" % (back and backface_cull, use_shader, has_normal, two_sided_lighting, backface_cull, cgo_lighting, back))
img = self.get_imagearray(width=viewport[0], height=viewport[1])
if not two_sided_lighting and not backface_cull and cgo_lighting and back:
# this is where a shaded back side is rendered
redmask = (img[:,:,0] > 0)
self.assertTrue((img[:,:,0][redmask] < 255).any() and
(img[:,:,1:3][redmask] == 0).all())
elif back and backface_cull:
self.assertImageHasNotColor('red', img=img)
else:
self.assertImageHasColor('red', img=img)