Moderator: joepal
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import gui3d
import mh
import gui
import log
import numpy
from core import G
from openvr.glframework.qt5_app import MyGlWidget
from openvr.gl_renderer import OpenVrGlRenderer
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtOpenGL import QGLFormat
from textwrap import dedent
from OpenGL.GL import * # @UnusedWildImport # this comment squelches an IDE warning
from OpenGL.GL.shaders import compileShader, compileProgram
from openvr.glframework import shader_string
class MHActor(object):
def __init__(self):
self.shader = 0
self.vao = None
self.humanchanged = False
def updateVertices(self):
self.vertices = []
self.faces = []
self.normals = []
yOffset = -1 * gui3d.app.selectedHuman.getJointPosition('ground')[1]
for obj in sorted(G.world, key = (lambda obj: obj.priority)):
# log.message(obj.isTextured)
# log.message(obj.solid)
# log.message(len(obj.verts))
# log.message(len(obj.primitives))
# log.message(obj.primitives)
# log.message('---')
if obj.vertsPerPrimitive == 4 and len(obj.verts)>4:
for vert in obj.verts:
self.vertices.append([vert[0],vert[1]+yOffset,vert[2]])
for n in obj.norms:
self.normals.append(n)
for fv in obj.primitives:
self.faces.append(fv[0])
self.faces.append(fv[1])
self.faces.append(fv[2])
self.faces.append(fv[2])
self.faces.append(fv[3])
self.faces.append(fv[0])
self.faces = numpy.array(self.faces, dtype=numpy.uint32)
self.vertices = numpy.array(self.vertices, dtype=numpy.float32)
self.vertices = self.vertices * 0.1
self.normals = numpy.array(self.normals, dtype=numpy.float32)
def init_gl(self):
vertex_shader = compileShader(
shader_string("""
layout(location = 0) uniform mat4 Projection = mat4(1);
layout(location = 4) uniform mat4 ModelView = mat4(1);
layout(location = 8) uniform float Size = 0.3;
in vec4 position;
in vec3 normal;
out vec3 fnormal;
void main() {
gl_Position = Projection * ModelView * Size * position;
fnormal = normal;
}
"""),
GL_VERTEX_SHADER)
fragment_shader = compileShader(
shader_string("""
out vec4 FragColor;
in vec3 fnormal;
void main() {
FragColor = vec4(normalize(fnormal), 1.0);
}
"""),
GL_FRAGMENT_SHADER)
self.shader = compileProgram(vertex_shader, fragment_shader)
glEnable(GL_DEPTH_TEST)
self.updateVertices()
self.vao = glGenVertexArrays(1)
glBindVertexArray(self.vao)
self.vertex_buffer = glGenBuffers(1)
self.normal_buffer = glGenBuffers(1)
self.element_buffer = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, self.vertex_buffer)
position = glGetAttribLocation(self.shader, 'position')
glVertexAttribPointer(position, 3, GL_FLOAT, False, 0, ctypes.c_void_p(0))
glEnableVertexAttribArray(position)
glBufferData(GL_ARRAY_BUFFER, self.vertices.size*4, self.vertices, GL_STATIC_DRAW)
glBindBuffer(GL_ARRAY_BUFFER, self.normal_buffer)
normal = glGetAttribLocation(self.shader, 'normal')
glVertexAttribPointer(normal, 3, GL_FLOAT, False, 0, ctypes.c_void_p(0))
glEnableVertexAttribArray(normal)
glBufferData(GL_ARRAY_BUFFER, self.normals.nbytes, self.normals, GL_STATIC_DRAW)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self.element_buffer)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, self.faces.nbytes, self.faces, GL_STATIC_DRAW)
# glBufferData(GL_ARRAY_BUFFER, self.vertices.size*4, self.vertices, GL_STATIC_DRAW)
# glBindVertexArray( 0 )
# glBindBuffer(GL_ARRAY_BUFFER, 0)
# glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
def display_gl(self, modelview, projection):
glUseProgram(self.shader)
glUniformMatrix4fv(0, 1, False, projection)
glUniformMatrix4fv(4, 1, False, modelview)
glBindVertexArray(self.vao)
if (self.humanchanged):
# log.message("human changed")
self.updateVertices()
glBindBuffer(GL_ARRAY_BUFFER, self.vertex_buffer)
glBufferData(GL_ARRAY_BUFFER, self.vertices.size*4, self.vertices, GL_STATIC_DRAW)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self.element_buffer)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, self.faces.nbytes, self.faces, GL_STATIC_DRAW)
self.humanchanged = False
glDrawElements(GL_TRIANGLES, len(self.faces), GL_UNSIGNED_INT, None)
# glDisableVertexAttribArray(0)
# glDisableVertexAttribArray(1)
def dispose_gl(self):
glDeleteProgram(self.shader)
self.shader = 0
if self.vao:
glDeleteVertexArrays(1, (self.vao,))
self.vao = 0
class VRWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("VR test window")
self.resize(800,600)
self.mhactor = MHActor()
renderer = OpenVrGlRenderer(multisample=2)
renderer.append(self.mhactor)
glformat = QGLFormat()
glformat.setVersion(4, 1)
glformat.setProfile(QGLFormat.CoreProfile)
glformat.setDoubleBuffer(False)
self.glwidget = MyGlWidget(renderer, glformat, self)
self.setCentralWidget(self.glwidget)
self.show()
def closeEvent(self,event):
self.glwidget.disposeGL()
event.ignore()
#QMainWindow.closeEvent(self, event)
class VRTaskView(gui3d.TaskView):
def __init__(self, category):
gui3d.TaskView.__init__(self, category, 'VR')
box = self.addLeftWidget(gui.GroupBox('VR'))
self.aButton = box.addWidget(gui.Button('Open VR window'))
self.vrwindow = 0
@self.aButton.mhEvent
def onClicked(event):
self.vrwindow = VRWindow()
self.vrwindow.show()
def onShow(self, event):
gui3d.app.statusPersist('VR plugin')
def onHide(self, event):
gui3d.app.statusPersist('')
def onHumanChanged(self, event):
if self.vrwindow != 0:
self.vrwindow.mhactor.humanchanged = True
category = None
taskview = None
# This method is called when the plugin is loaded into makehuman
# The app reference is passed so that a plugin can attach a new category, task, or other GUI elements
def load(app):
category = app.getCategory('Utilities')
taskview = category.addTask(VRTaskView(category))
# This method is called when the plugin is unloaded from makehuman
# At the moment this is not used, but in the future it will remove the added GUI elements
def unload(app):
pass
Return to General discussions about makehuman
Users browsing this forum: No registered users and 1 guest