From cc430ae129d71e3625cfc63d7ce1612db197eacb Mon Sep 17 00:00:00 2001 From: Matt Williams Date: Wed, 17 Apr 2013 20:48:15 +0100 Subject: [PATCH] Update Python bindings, tests and example to use Python 3 --- examples/Python/PythonExample.py | 35 ++++++++++++++++---------------- library/bindings/CMakeLists.txt | 3 ++- tests/CMakeLists.txt | 12 +++++++++-- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/examples/Python/PythonExample.py b/examples/Python/PythonExample.py index 2d194e9d..7c90297f 100755 --- a/examples/Python/PythonExample.py +++ b/examples/Python/PythonExample.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#! /usr/bin/env python3 ################################################################################ # Copyright (c) 2013 Matt Williams @@ -33,7 +33,7 @@ r = pv.Region(pv.Vector3Dint32_t(0,0,0), pv.Vector3Dint32_t(63,63,63)) vol = pv.SimpleVolumeuint8(r) #Now fill the volume with our data (a sphere) -v3dVolCenter = pv.Vector3Dint32_t(vol.getWidth() / 2, vol.getHeight() / 2, vol.getDepth() / 2) +v3dVolCenter = pv.Vector3Dint32_t(vol.getWidth() // 2, vol.getHeight() // 2, vol.getDepth() // 2) sphereRadius = 30 #This three-level for loop iterates over every voxel in the volume for z in range(vol.getDepth()): @@ -95,20 +95,20 @@ def run(): screen = pygame.display.set_mode(SCREEN_SIZE, pygame.HWSURFACE|pygame.OPENGL|pygame.DOUBLEBUF) #The first thing we do is print some OpenGL details and check that we have a good enough version - print "OpenGL Implementation Details:" + print("OpenGL Implementation Details:") if glGetString(GL_VENDOR): - print "\tGL_VENDOR:", glGetString(GL_VENDOR) + print("\tGL_VENDOR: {}".format(glGetString(GL_VENDOR).decode())) if glGetString(GL_RENDERER): - print "\tGL_RENDERER:", glGetString(GL_RENDERER) + print("\tGL_RENDERER: {}".format(glGetString(GL_RENDERER).decode())) if glGetString(GL_VERSION): - print "\tGL_VERSION:", glGetString(GL_VERSION) + print("\tGL_VERSION: {}".format(glGetString(GL_VERSION).decode())) if glGetString(GL_SHADING_LANGUAGE_VERSION): - print "\tGL_SHADING_LANGUAGE_VERSION:", glGetString(GL_SHADING_LANGUAGE_VERSION) + print("\tGL_SHADING_LANGUAGE_VERSION: {}".format(glGetString(GL_SHADING_LANGUAGE_VERSION).decode())) - major_version = int(glGetString(GL_VERSION).split()[0].split('.')[0]) - minor_version = int(glGetString(GL_VERSION).split()[0].split('.')[1]) + major_version = int(glGetString(GL_VERSION).decode().split()[0].split('.')[0]) + minor_version = int(glGetString(GL_VERSION).decode().split()[0].split('.')[1]) if major_version < 3 or (major_version < 3 and minor_version < 0): - print "OpenGL version must be at least 3.0 (found {0})".format(glGetString(GL_VERSION).split()[0]) + print("OpenGL version must be at least 3.0 (found {0})".format(glGetString(GL_VERSION).decode().split()[0])) #Now onto the OpenGL initialisation @@ -121,7 +121,7 @@ def run(): #We create out shaders which do little more than set a flat colour for each face - VERTEX_SHADER = shaders.compileShader(""" + VERTEX_SHADER = shaders.compileShader(b""" #version 130 in vec4 position; @@ -143,7 +143,8 @@ def run(): } """, GL_VERTEX_SHADER) - FRAGMENT_SHADER = shaders.compileShader(""" + + FRAGMENT_SHADER = shaders.compileShader(b""" #version 130 flat in float theColor; @@ -158,8 +159,8 @@ def run(): shader = shaders.compileProgram(VERTEX_SHADER, FRAGMENT_SHADER) #And then grab our attribute locations from it - glBindAttribLocation(shader, 0, "position") - glBindAttribLocation(shader, 1, "normal") + glBindAttribLocation(shader, 0, b"position") + glBindAttribLocation(shader, 1, b"normal") #Create the Vertex Array Object to hold our volume mesh vertexArrayObject = GLuint(0) @@ -182,9 +183,9 @@ def run(): glDisableVertexAttribArray(0) #Now grab out transformation martix locations - modelToWorldMatrixUnif = glGetUniformLocation(shader, "modelToWorldMatrix") - worldToCameraMatrixUnif = glGetUniformLocation(shader, "worldToCameraMatrix") - cameraToClipMatrixUnif = glGetUniformLocation(shader, "cameraToClipMatrix") + modelToWorldMatrixUnif = glGetUniformLocation(shader, b"modelToWorldMatrix") + worldToCameraMatrixUnif = glGetUniformLocation(shader, b"worldToCameraMatrix") + cameraToClipMatrixUnif = glGetUniformLocation(shader, b"cameraToClipMatrix") modelToWorldMatrix = np.array([[1.0,0.0,0.0,-32.0],[0.0,1.0,0.0,-32.0],[0.0,0.0,1.0,-32.0],[0.0,0.0,0.0,1.0]], dtype='f') worldToCameraMatrix = np.array([[1.0,0.0,0.0,0.0],[0.0,1.0,0.0,0.0],[0.0,0.0,1.0,-50.0],[0.0,0.0,0.0,1.0]], dtype='f') diff --git a/library/bindings/CMakeLists.txt b/library/bindings/CMakeLists.txt index baa2a5f5..bb1f4c7e 100644 --- a/library/bindings/CMakeLists.txt +++ b/library/bindings/CMakeLists.txt @@ -23,7 +23,7 @@ option(ENABLE_BINDINGS "Build Python bindings" ON) if(ENABLE_BINDINGS) find_package(SWIG) mark_as_advanced(SWIG_DIR SWIG_VERSION) - find_package(PythonLibs) + find_package(PythonLibs 3) if(CMAKE_VERSION VERSION_LESS "2.8.6") set_package_info(SWIG "Bindings generator" http://www.swig.org) set_package_info(PythonLibs "Programming language" http://www.python.org) @@ -43,6 +43,7 @@ if(ENABLE_BINDINGS) set_source_files_properties(PolyVoxCore.i PROPERTIES CPLUSPLUS ON) #set_source_files_properties(PolyVoxCore.i PROPERTIES SWIG_FLAGS "-builtin") + set(SWIG_MODULE_PolyVoxCorePython_EXTRA_FLAGS "-py3") swig_add_module(PolyVoxCorePython python PolyVoxCore.i) swig_link_libraries(PolyVoxCorePython ${PYTHON_LIBRARIES} PolyVoxCore) set_target_properties(${SWIG_MODULE_PolyVoxCorePython_REAL_NAME} PROPERTIES OUTPUT_NAME _PolyVoxCore) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5634891d..3224d165 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -50,8 +50,16 @@ REMOVE_DEFINITIONS(-DQT_GUI_LIB) #Make sure the tests don't link to the QtGui # Python tests IF(BUILD_BINDINGS) - ADD_TEST(PythonSurfaceExtractorTest python ${CMAKE_CURRENT_SOURCE_DIR}/TestSurfaceExtractor.py) - ADD_TEST(PythonRaycastTest python ${CMAKE_CURRENT_SOURCE_DIR}/TestRaycast.py) + FIND_PACKAGE(PythonInterp 3) + IF(CMAKE_VERSION VERSION_LESS "2.8.6") + set_package_info(PythonInterp "Python Interpereter" http://www.python.org "Running the Python tests") + ELSE() + set_package_properties(PythonInterp PROPERTIES URL http://www.python.org DESCRIPTION "Python Interpereter" TYPE OPTIONAL PURPOSE "Running the Python tests") + ENDIF() + IF(PYTHONINTERP_FOUND) + ADD_TEST(PythonSurfaceExtractorTest ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/TestSurfaceExtractor.py) + ADD_TEST(PythonRaycastTest ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/TestRaycast.py) + ENDIF() ENDIF() # AmbientOcclusionGenerator tests