Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
cura / opt / cura / lib / python3 / dist-packages / UM / Scene / PointCloudNode.py
Size: Mime:
# Copyright (c) 2015 Ultimaker B.V.
# Uranium is released under the terms of the AGPLv3 or higher.

from . import SceneNode
from UM.View.Renderer import Renderer
from UM.Application import Application
from UM.Resources import Resources
from UM.Math.Color import Color
from UM.ColorGenerator import ColorGenerator
import numpy
import colorsys

class PointCloudNode(SceneNode.SceneNode):
    def __init__(self, parent = None):
        super().__init__(parent)
        self._name = "Pointcloud"
        self._selectable = True
        Application.getInstance().addCloudNode(self)
        self._material = None
        self._color = Color(0,0,0,1)
        if parent:
            self._onParentChanged(parent)
        
        self.parentChanged.connect(self._onParentChanged)
    
    def _onParentChanged(self, parent):
        num_scans = 12 #Hardcoded, change this!
        if parent.callDecoration("isGroup"):
            if not hasattr(parent, "color"):
                Application.getInstance().addColorIndex(parent)
                color_hsv = ColorGenerator().getColor(Application.getInstance().getColorIndex(parent))
                #r,g,b = colorsys.hsv_to_rgb(color_hsv[0], color_hsv[1], color_hsv[2])
                setattr(parent, "color", color_hsv)
            color_hsv = getattr(parent, "color")
            if len(parent.getChildren()) > num_scans * 0.5:
                color_hsv[1] = 0.4 + (0.6 / ((num_scans * 0.5) - 1) * (len(parent.getChildren()) - 1. - 0.5 * num_scans))
            else: 
                color_hsv[1] = 1. - (0.6 / ((num_scans * 0.5) - 1)  * (len(parent.getChildren()) - 1.))
            
            r,g,b = colorsys.hsv_to_rgb(color_hsv[0], color_hsv[1], color_hsv[2])
            self.setColor(Color(r,g,b,1))
        else:
            Application.getInstance().addColorIndex(self)
            color_hsv = ColorGenerator().getColor(Application.getInstance().getColorIndex(self))
            r,g,b = colorsys.hsv_to_rgb(color_hsv[0], color_hsv[1], color_hsv[2])
            self.setColor(Color(r,g,b,1))
   
    def getColor(self):
        return self._color
    
    def setColor(self, color):
        self._color = color
        self._material = None # Reset material 
    
    ##   \brief Create new material. 
    def createMaterial(self,renderer):
        self._material = renderer.createMaterial(Resources.getPath(Resources.Shaders, "default.vert"), Resources.getPath(Resources.Shaders, "default.frag"))
        self._material.setUniformValue("u_ambientColor", Color(0.3, 0.3, 0.3, 1.0))
        self._material.setUniformValue("u_diffuseColor", self._color)
        self._material.setUniformValue("u_specularColor", Color(1.0, 1.0, 1.0, 1.0))
        self._material.setUniformValue("u_shininess", 50.0)
    
    def render(self, renderer):
        if not self._material:
            self.createMaterial(renderer)
        if self.getMeshData() and self.isVisible():
            renderer.queueNode(self, mode = Renderer.RenderPoints, material = self._material)
            return True
    
    ##  \brief Set the mesh of this node/object
    #   \param mesh_data MeshData object
    def setMeshData(self, mesh_data):
        self._mesh_data = mesh_data
        id = Application.getInstance().getCloudNodeIndex(self)
        
        # Create a unique color for each vert. First 3 uint 8  represent index in this cloud, final uint8 gives cloud ID.
        vertice_indices = numpy.arange(mesh_data.getVertexCount(), dtype = numpy.int32)
        cloud_indices = numpy.empty(mesh_data.getVertexCount(), dtype = numpy.int32)
        cloud_indices.fill(255 - id)
        cloud_indices  = numpy.left_shift(cloud_indices, 24) # shift 24 bits.
        combined_clouds = numpy.add(cloud_indices,vertice_indices)
        data = numpy.fromstring(combined_clouds.tostring(),numpy.uint8)

        colors = numpy.resize(data,(mesh_data.getVertexCount(), 4))
        colors = colors.astype(numpy.float32)
        colors /= 255
        self._mesh_data.setColors(colors)
        self._resetAABB()
        self.meshDataChanged.emit(self)