Spaces:
Configuration error
Configuration error
''' | |
MIT License | |
Copyright (c) 2019 Shunsuke Saito, Zeng Huang, and Ryota Natsume | |
Permission is hereby granted, free of charge, to any person obtaining a copy | |
of this software and associated documentation files (the "Software"), to deal | |
in the Software without restriction, including without limitation the rights | |
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
copies of the Software, and to permit persons to whom the Software is | |
furnished to do so, subject to the following conditions: | |
The above copyright notice and this permission notice shall be included in all | |
copies or substantial portions of the Software. | |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
SOFTWARE. | |
''' | |
import numpy as np | |
import random | |
from .framework import * | |
from .cam_render import CamRender | |
class ColorRender(CamRender): | |
def __init__(self, width=1600, height=1200, name='Color Renderer'): | |
program_files = ['color.vs', 'color.fs'] | |
CamRender.__init__(self, width, height, name, program_files=program_files) | |
# WARNING: this differs from vertex_buffer and vertex_data in Render | |
self.vert_buffer = {} | |
self.vert_data = {} | |
self.color_buffer = {} | |
self.color_data = {} | |
self.vertex_dim = {} | |
self.n_vertices = {} | |
def set_mesh(self, vertices, faces, color, faces_clr, mat_name='all'): | |
self.vert_data[mat_name] = vertices[faces.reshape([-1])] | |
self.n_vertices[mat_name] = self.vert_data[mat_name].shape[0] | |
self.vertex_dim[mat_name] = self.vert_data[mat_name].shape[1] | |
if mat_name not in self.vert_buffer.keys(): | |
self.vert_buffer[mat_name] = glGenBuffers(1) | |
glBindBuffer(GL_ARRAY_BUFFER, self.vert_buffer[mat_name]) | |
glBufferData(GL_ARRAY_BUFFER, self.vert_data[mat_name], GL_STATIC_DRAW) | |
self.color_data[mat_name] = color[faces_clr.reshape([-1])] | |
if mat_name not in self.color_buffer.keys(): | |
self.color_buffer[mat_name] = glGenBuffers(1) | |
glBindBuffer(GL_ARRAY_BUFFER, self.color_buffer[mat_name]) | |
glBufferData(GL_ARRAY_BUFFER, self.color_data[mat_name], GL_STATIC_DRAW) | |
glBindBuffer(GL_ARRAY_BUFFER, 0) | |
def cleanup(self): | |
glBindBuffer(GL_ARRAY_BUFFER, 0) | |
for key in self.vert_data: | |
glDeleteBuffers(1, [self.vert_buffer[key]]) | |
glDeleteBuffers(1, [self.color_buffer[key]]) | |
self.vert_buffer = {} | |
self.vert_data = {} | |
self.color_buffer = {} | |
self.color_data = {} | |
self.render_texture_mat = {} | |
self.vertex_dim = {} | |
self.n_vertices = {} | |
def draw(self): | |
self.draw_init() | |
glEnable(GL_MULTISAMPLE) | |
glUseProgram(self.program) | |
glUniformMatrix4fv(self.model_mat_unif, 1, GL_FALSE, self.model_view_matrix.transpose()) | |
glUniformMatrix4fv(self.persp_mat_unif, 1, GL_FALSE, self.projection_matrix.transpose()) | |
for mat in self.vert_buffer: | |
# Handle vertex buffer | |
glBindBuffer(GL_ARRAY_BUFFER, self.vert_buffer[mat]) | |
glEnableVertexAttribArray(0) | |
glVertexAttribPointer(0, self.vertex_dim[mat], GL_DOUBLE, GL_FALSE, 0, None) | |
# Handle normal buffer | |
glBindBuffer(GL_ARRAY_BUFFER, self.color_buffer[mat]) | |
glEnableVertexAttribArray(1) | |
glVertexAttribPointer(1, 3, GL_DOUBLE, GL_FALSE, 0, None) | |
glDrawArrays(GL_TRIANGLES, 0, self.n_vertices[mat]) | |
glDisableVertexAttribArray(1) | |
glDisableVertexAttribArray(0) | |
glBindBuffer(GL_ARRAY_BUFFER, 0) | |
glUseProgram(0) | |
glDisable(GL_MULTISAMPLE) | |
self.draw_end() | |