def main():
    
    global base, render, taskMgr, loader, model_iter

    model_iter = iter(getModel(int(sys.argv[1])))

    base = MyBase()
    render = base.render
    taskMgr = base.taskMgr
    loader = base.loader
    
    base.disableMouse()
    pandacore.attachLights(render)
    render.setShaderAuto()
    render.setTransparency(TransparencyAttrib.MDual, 1)
    
    base.cam.setPos(0, 30000, 10000)
    base.cam.lookAt(0, 0, 0.0)

    KeyboardMovement()
    MouseCamera()
    
    base.win.setClearColor(VBase4(0.9,0.9,0.9,1))
    
    render.setAntialias(AntialiasAttrib.MAuto)
    
    taskMgr.add(nextModelTask, 'nextModelTask')
    
    base.run()
Ejemplo n.º 2
0
def main():

    global base, render, taskMgr, loader, model_iter

    model_iter = iter(getModel(int(sys.argv[1])))

    base = MyBase()
    render = base.render
    taskMgr = base.taskMgr
    loader = base.loader

    base.disableMouse()
    pandacore.attachLights(render)
    render.setShaderAuto()
    render.setTransparency(TransparencyAttrib.MDual, 1)

    base.cam.setPos(0, 30000, 10000)
    base.cam.lookAt(0, 0, 0.0)

    KeyboardMovement()
    MouseCamera()

    base.win.setClearColor(VBase4(0.9, 0.9, 0.9, 1))

    render.setAntialias(AntialiasAttrib.MAuto)

    taskMgr.add(nextModelTask, 'nextModelTask')

    base.run()
Ejemplo n.º 3
0
    def __init__(self, mesh_path, progressive_texture_path):

        resolutions = []
        f = tarfile.open(progressive_texture_path)
        for resolution_name in f.getnames():
            toset = {
                'size': resolution_name[:-4],
                'contents': f.extractfile(resolution_name).read()
            }
            texpnm = PNMImage()
            texpnm.read(StringStream(toset['contents']), 'something.jpg')
            newtex = Texture()
            newtex.load(texpnm)
            toset['texture'] = newtex
            resolutions.append(toset)

        self.resolutions = resolutions

        def aux_loader(fname):
            return resolutions[0]['contents']

        mesh = collada.Collada(mesh_path, aux_file_loader=aux_loader)

        scene_members = getSceneMembers(mesh)

        base = ShowBase()

        rotateNode = GeomNode("rotater")
        rotatePath = render.attachNewNode(rotateNode)
        matrix = numpy.identity(4)
        if mesh.assetInfo.upaxis == collada.asset.UP_AXIS.X_UP:
            r = collada.scene.RotateTransform(0, 1, 0, 90)
            matrix = r.matrix
        elif mesh.assetInfo.upaxis == collada.asset.UP_AXIS.Y_UP:
            r = collada.scene.RotateTransform(1, 0, 0, 90)
            matrix = r.matrix
        rotatePath.setMat(Mat4(*matrix.T.flatten().tolist()))

        geom, renderstate, mat4 = scene_members[0]
        node = GeomNode("primitive")
        node.addGeom(geom)
        if renderstate is not None:
            node.setGeomState(0, renderstate)
        self.geomPath = rotatePath.attachNewNode(node)
        self.geomPath.setMat(mat4)

        wrappedNode = ensureCameraAt(self.geomPath, base.camera)
        base.disableMouse()
        attachLights(render)
        render.setShaderAuto()
        render.setTransparency(TransparencyAttrib.MDual, 1)

        base.render.analyze()
        KeyboardMovement()
        MouseDrag(wrappedNode)
        MouseScaleZoom(wrappedNode)
        MouseCamera()

        num_resolutions = len(resolutions) - 1
        self.slider = DirectSlider(range=(0, num_resolutions),
                                   value=0,
                                   pageSize=1,
                                   command=self.sliderMoved,
                                   pos=(0, 0, -.9),
                                   scale=1)
        for key, val in uiArgs.iteritems():
            self.slider.thumb[key] = val

        self.triText = OnscreenText(text="",
                                    pos=(-1, 0.85),
                                    scale=0.15,
                                    fg=(1, 0.5, 0.5, 1),
                                    align=TextNode.ALeft,
                                    mayChange=1)

        base.run()
Ejemplo n.º 4
0
 def __init__(self, scenefile, capturefile=None, showstats=False, screenshot_dir=None):
     
     self.scenefile = scenefile
     self.capturefile = capturefile
     self.scene = scene.Scene.fromfile(scenefile)
     self.unique_models = set(m.slug for m in self.scene)
     self.multiplexer = pool.MultiplexPool()
     self.screenshot_dir = screenshot_dir
     
     print '%d objects in scene, %d unique' % (len(self.scene), len(self.unique_models))
     
     # turns on lazy loading of textures
     p3d.loadPrcFileData('', 'preload-textures 0')
     p3d.loadPrcFileData('', 'preload-simple-textures 1')
     p3d.loadPrcFileData('', 'compressed-textures 1')
     p3d.loadPrcFileData('', 'allow-incomplete-render 0')
     
     
     # window size to 1024x768
     p3d.loadPrcFileData('', 'win-size 1024 768')
     
     ShowBase.ShowBase.__init__(self)
     
     # background color sky blue
     self.win.setClearColorActive(True)
     self.win.setClearColor(p3d.VBase4(0.5294, 0.8078, 0.9215, 0))
     
     # create a nodepath for each unique model
     self.unique_nodepaths = dict((m, p3d.NodePath(m)) for m in self.unique_models)
     
     self.rigid_body_combiners = {}
     self.rigid_body_combiner_np = {}
     for m in self.unique_models:
         #rbc = p3d.RigidBodyCombiner(m)
         rbc = p3d.NodePath(m)
         self.rigid_body_combiners[m] = rbc
         np = p3d.NodePath(rbc)
         np.reparentTo(self.render)
         self.rigid_body_combiner_np[m] = np
     
     # find out how many objects are going to be instanced for each node
     self.instance_count = collections.defaultdict(int)
     for model in self.scene:
         self.instance_count[model.slug] += 1
     
     # then instance each unique model to its instantiation in the actual scene
     self.nodepaths = {}
     self.obj_bounds = {}
     self.nodepaths_byslug = collections.defaultdict(list)
     for model in self.scene:
         unique_np = self.unique_nodepaths[model.slug]
         node_name = model.slug + "_%.7g_%.7g_%.7g" % (model.x, model.y, model.z)
         
         if self.instance_count[model.slug] == 1:
             unique_np.setName(node_name)
             unique_np.reparentTo(self.render)
             np = unique_np
         else:
             np = self.rigid_body_combiner_np[model.slug].attachNewNode(node_name)
         
         self.nodepaths[model] = np
         self.nodepaths_byslug[model.slug].append(np)
         np.setPos(model.x, model.y, model.z)
         np.setScale(model.scale, model.scale, model.scale)
         q = p3d.Quat()
         q.setI(model.orient_x)
         q.setJ(model.orient_y)
         q.setK(model.orient_z)
         q.setR(model.orient_w)
         np.setQuat(q)
         self.obj_bounds[np] = p3d.BoundingSphere(np.getPos(), np.getScale()[0])
     
     #for rbc in self.rigid_body_combiners.itervalues():
     #    rbc.collect()
     
     self.waiting = []
     self.pm_waiting = collections.defaultdict(list)
     self.models_loaded = set()
     self.loading_priority = 2147483647
     
     for m in self.unique_models:
         t = metadata.MetadataDownloadTask(m)
         self.multiplexer.add_task(t)
     
     self.disableMouse()
     pcore.attachLights(self.render)
     self.render.setShaderAuto()
     self.render.setTransparency(p3d.TransparencyAttrib.MNone)
     
     self.camLens.setFar(sys.maxint)
     self.camLens.setNear(8.0)
     self.render.setAntialias(p3d.AntialiasAttrib.MAuto)
     
     self.showstats = showstats
     if showstats:
         self.num_metadata_loaded = 0
         self.num_models_loaded = 0
         self.num_texture_updates = 0
         self.num_mesh_refinements = 0
         self.total_texture_updates = 0
         self.total_mesh_refinements = 0
         
         self.txtMetadataLoaded = gui.OnscreenText.OnscreenText(text='', style=1, pos=(0.01, -0.05),
                                                              parent=self.a2dTopLeft, align=p3d.TextNode.ALeft,
                                                              scale=0.05, fg=(0.1, 0.1, 0.1, 1), shadow=(0.9, 0.9, 0.9, 1))
         self.txtUniqueLoaded = gui.OnscreenText.OnscreenText(text='', style=1, pos=(0.01, -0.11),
                                                              parent=self.a2dTopLeft, align=p3d.TextNode.ALeft,
                                                              scale=0.05, fg=(0.1, 0.1, 0.1, 1), shadow=(0.9, 0.9, 0.9, 1))
         self.txtTextureUpdates = gui.OnscreenText.OnscreenText(text='', style=1, pos=(0.01, -0.17),
                                                              parent=self.a2dTopLeft, align=p3d.TextNode.ALeft,
                                                              scale=0.05, fg=(0.1, 0.1, 0.1, 1), shadow=(0.9, 0.9, 0.9, 1))
         self.txtMeshRefinements = gui.OnscreenText.OnscreenText(text='', style=1, pos=(0.01, -0.23),
                                                              parent=self.a2dTopLeft, align=p3d.TextNode.ALeft,
                                                              scale=0.05, fg=(0.1, 0.1, 0.1, 1), shadow=(0.9, 0.9, 0.9, 1))
         
         self.update_stats()
     
     self.globalClock = p3d.ClockObject.getGlobalClock()
     
     self.smooth_mover = SmoothMover()
     self.smooth_mover.setPredictionMode(SmoothMover.PMOn)
     self.smooth_mover.setSmoothMode(SmoothMover.SMOn)
     self.smooth_mover.setMaxPositionAge(10.0)
     self.smooth_mover.setAcceptClockSkew(False)
     self.smooth_mover.setDelay(0)
     
     self.pandastate = katasked.panda.PandaState(self.cam,
                                                 self.unique_nodepaths,
                                                 self.nodepaths,
                                                 self.smooth_mover,
                                                 self.globalClock,
                                                 self.obj_bounds)
     
     if self.capturefile is not None:
         self.capturedata = json.load(self.capturefile)
         self.duration = self.capturedata['duration']
         self.positions = self.capturedata['positions']
         self.rotations = self.capturedata['rotations']
         
         self.curve_creator = motioncap.CreateNurbsCurve()
         for pos, rot in zip(self.positions, self.rotations):
             self.curve_creator.addPoint(pos, rot)
         self.mopath = self.curve_creator.getMotionPath()
         
         self.interval = MopathInterval.MopathInterval(self.mopath, self.cam, duration=self.duration, name="Camera Replay")
     else:
         controls.KeyboardMovement()
         controls.MouseCamera()
     
     self.update_camera_predictor_task = self.taskMgr.doMethodLater(0.1, self.update_camera_predictor, 'update_camera_predictor')
     self.update_priority_task = self.taskMgr.doMethodLater(0.5, self.check_pool, 'check_pool')
     self.load_waiting_task = self.taskMgr.doMethodLater(0.1, self.load_waiting, 'load_waiting')
Ejemplo n.º 5
0
def visualize(centers, corners, edges):
    from meshtool.filters.panda_filters.pandacore import getVertexData, attachLights, ensureCameraAt
    from meshtool.filters.panda_filters.pandacontrols import KeyboardMovement, MouseDrag, MouseScaleZoom, MouseCamera
    from panda3d.core import GeomPoints, GeomTriangles, Geom, GeomNode, GeomVertexFormat, GeomVertexData, GeomVertexWriter, LineSegs, VBase3
    from direct.showbase.ShowBase import ShowBase

    format = GeomVertexFormat.getV3c4()
    vdata = GeomVertexData('pts', format, Geom.UHDynamic)
    vertex = GeomVertexWriter(vdata, 'vertex')
    color = GeomVertexWriter(vdata, 'color')

    vertex_index = 0
    center_vertex_indices = {}
    corner_vertex_indices = {}
    for key, center in centers.iteritems():
        vertex.addData3f(center.x * X_SCALE, center.y * Y_SCALE,
                         center.elevation * Z_SCALE)
        curcolor = hex2rgb(COLORS[center.biome])
        color.addData4f(curcolor[0], curcolor[1], curcolor[2], 1)
        center_vertex_indices[key] = vertex_index
        vertex_index += 1

        for corner in center.corners:
            vertex.addData3f(corner.x * X_SCALE, corner.y * Y_SCALE,
                             corner.elevation * Z_SCALE)
            color.addData4f(curcolor[0], curcolor[1], curcolor[2], 1)
            corner_vertex_indices[corner.id] = vertex_index
            vertex_index += 1

    tris = GeomTriangles(Geom.UHDynamic)

    for edge in edges.itervalues():
        corner0 = edge.corner0
        corner1 = edge.corner1
        center0 = edge.center0
        center1 = edge.center1
        if corner0 is None or corner1 is None:
            continue

        tris.addVertices(corner_vertex_indices[corner1.id],
                         corner_vertex_indices[corner0.id],
                         center_vertex_indices[center0.id])

        tris.addVertices(center_vertex_indices[center1.id],
                         corner_vertex_indices[corner0.id],
                         corner_vertex_indices[corner1.id])

    tris.closePrimitive()

    pgeom = Geom(vdata)
    pgeom.addPrimitive(tris)

    node = GeomNode("primitive")
    node.addGeom(pgeom)

    p3dApp = ShowBase()
    attachLights(render)
    geomPath = render.attachNewNode(node)
    #geomPath.setRenderModeThickness(6.0)

    #geomPath.setRenderModeWireframe()

    ensureCameraAt(geomPath, base.cam)

    boundingSphere = geomPath.getBounds()
    base.cam.setPos(boundingSphere.getCenter() + boundingSphere.getRadius())

    base.cam.lookAt(boundingSphere.getCenter())

    geomPath.setScale(VBase3(50, 50, 50))

    KeyboardMovement()
    #MouseDrag(geomPath)
    MouseCamera()
    MouseScaleZoom(geomPath)
    #render.setShaderAuto()
    p3dApp.run()
Ejemplo n.º 6
0
def visualize(centers, corners, edges):
    from meshtool.filters.panda_filters.pandacore import getVertexData, attachLights, ensureCameraAt
    from meshtool.filters.panda_filters.pandacontrols import KeyboardMovement, MouseDrag, MouseScaleZoom, MouseCamera
    from panda3d.core import GeomPoints, GeomTriangles, Geom, GeomNode, GeomVertexFormat, GeomVertexData, GeomVertexWriter, LineSegs, VBase3
    from direct.showbase.ShowBase import ShowBase
    
    format = GeomVertexFormat.getV3c4()
    vdata = GeomVertexData('pts', format, Geom.UHDynamic)
    vertex = GeomVertexWriter(vdata, 'vertex')
    color = GeomVertexWriter(vdata, 'color')
    
    vertex_index = 0
    center_vertex_indices = {}
    corner_vertex_indices = {}
    for key, center in centers.iteritems():
        vertex.addData3f(center.x * X_SCALE, center.y * Y_SCALE, center.elevation * Z_SCALE)
        curcolor = hex2rgb(COLORS[center.biome])
        color.addData4f(curcolor[0], curcolor[1], curcolor[2], 1)
        center_vertex_indices[key] = vertex_index
        vertex_index += 1
        
        for corner in center.corners:
            vertex.addData3f(corner.x * X_SCALE, corner.y * Y_SCALE, corner.elevation * Z_SCALE)
            color.addData4f(curcolor[0], curcolor[1], curcolor[2], 1)
            corner_vertex_indices[corner.id] = vertex_index
            vertex_index += 1
    
    tris = GeomTriangles(Geom.UHDynamic)
    
    for edge in edges.itervalues():
        corner0 = edge.corner0
        corner1 = edge.corner1
        center0 = edge.center0
        center1 = edge.center1
        if corner0 is None or corner1 is None:
            continue
        
        tris.addVertices(corner_vertex_indices[corner1.id],
                         corner_vertex_indices[corner0.id],
                         center_vertex_indices[center0.id])
        
        tris.addVertices(center_vertex_indices[center1.id],
                         corner_vertex_indices[corner0.id],
                         corner_vertex_indices[corner1.id])
        
    
    tris.closePrimitive()

    pgeom = Geom(vdata)
    pgeom.addPrimitive(tris)

    node = GeomNode("primitive")
    node.addGeom(pgeom)

    p3dApp = ShowBase()
    attachLights(render)
    geomPath = render.attachNewNode(node)
    #geomPath.setRenderModeThickness(6.0)
    
    #geomPath.setRenderModeWireframe()
    
    ensureCameraAt(geomPath, base.cam)
    
    boundingSphere = geomPath.getBounds()
    base.cam.setPos(boundingSphere.getCenter() + boundingSphere.getRadius())

    base.cam.lookAt(boundingSphere.getCenter())
    
    geomPath.setScale(VBase3(50,50,50))
    
    KeyboardMovement()
    #MouseDrag(geomPath)
    MouseCamera()
    MouseScaleZoom(geomPath)
    #render.setShaderAuto()
    p3dApp.run()
Ejemplo n.º 7
0
    def __init__(self, models):
        ShowBase.ShowBase.__init__(self)

        self.models = models

        unique_meshes = set(m.mesh for m in models)
        mesh2nodepath = {}
        for mesh in unique_meshes:
            scene_members = pcore.getSceneMembers(mesh)

            rotateNode = p3d.GeomNode("rotater")
            rotatePath = p3d.NodePath(rotateNode)
            matrix = numpy.identity(4)
            if mesh.assetInfo.upaxis == collada.asset.UP_AXIS.X_UP:
                r = collada.scene.RotateTransform(0, 1, 0, 90)
                matrix = r.matrix
            elif mesh.assetInfo.upaxis == collada.asset.UP_AXIS.Y_UP:
                r = collada.scene.RotateTransform(1, 0, 0, 90)
                matrix = r.matrix
            rotatePath.setMat(p3d.Mat4(*matrix.T.flatten().tolist()))

            rbc = p3d.RigidBodyCombiner('combiner')
            rbcPath = rotatePath.attachNewNode(rbc)

            for geom, renderstate, mat4 in scene_members:
                node = p3d.GeomNode("primitive")
                node.addGeom(geom)
                if renderstate is not None:
                    node.setGeomState(0, renderstate)
                geomPath = rbcPath.attachNewNode(node)
                geomPath.setMat(mat4)

            rbc.collect()

            mesh2nodepath[mesh] = centerAndScale(
                rotatePath, print_bounds.getBoundsInfo(mesh))

        scenepath = render.attachNewNode("scene")
        for model in self.models:
            np = mesh2nodepath[model.mesh]
            instance = scenepath.attachNewNode("model")
            np.instanceTo(instance)
            instance.setPos(model.x, model.y, model.z)
            instance.setScale(model.scale, model.scale, model.scale)
            q = p3d.Quat()
            q.setI(model.orient_x)
            q.setJ(model.orient_y)
            q.setK(model.orient_z)
            q.setR(model.orient_w)
            instance.setQuat(q)

        base.camLens.setFar(sys.maxint)
        base.camLens.setNear(8.0)

        pcore.attachLights(render)

        render.setShaderAuto()
        render.setTransparency(p3d.TransparencyAttrib.MDual, 1)
        render.setAntialias(p3d.AntialiasAttrib.MAuto)

        controls.KeyboardMovement()
        controls.ButtonUtils(scenepath)
        controls.MouseDrag(scenepath)
        controls.MouseCamera()
        controls.MouseScaleZoom(scenepath)
Ejemplo n.º 8
0
def main():

    parser = argparse.ArgumentParser(
        description='Tool for displaying a scene from open3dhub')

    parser.add_argument('--model-type',
                        choices=['progressive', 'optimized'],
                        default='progressive',
                        required=False,
                        help='Model type to use')
    parser.add_argument('--model-subtype',
                        choices=['base', 'full'],
                        default='base',
                        required=False,
                        help='Model subtype (currently only for progressive)')
    parser.add_argument('--force-model-download',
                        dest='force_model',
                        action='store_true',
                        help='Force re-downloading models')
    parser.add_argument(
        'scene_file',
        help='Scene file to use, generated with scene_generator',
        type=argparse.FileType('r'))
    parser.add_argument('--screenshots',
                        required=False,
                        help='Directory to save screenshots',
                        type=str)
    parser.add_argument('--exit-after-load',
                        required=False,
                        default=False,
                        action='store_true',
                        help='Exit the program after all models are loaded')

    args = parser.parse_args()

    global FORCE_MODEL_DOWNLOAD
    global SAVE_SS
    global START_TIME
    global LAST_SCREENSHOT
    global NUM_MODELS
    global EXIT_AFTER
    global MODEL_TYPE
    global MODEL_SUBTYPE
    global HASH_SIZES

    EXIT_AFTER = args.exit_after_load
    FORCE_MODEL_DOWNLOAD = args.force_model
    SAVE_SS = args.screenshots
    MODEL_TYPE = args.model_type
    MODEL_SUBTYPE = args.model_subtype

    if SAVE_SS is not None:
        if os.path.isdir(SAVE_SS):
            #yn = raw_input("Delete existing ss dir? ")
            yn = 'y'
            if yn == 'y':
                shutil.rmtree(SAVE_SS)
            else:
                print 'Exiting then'
                sys.exit(1)
        if not os.path.isdir(SAVE_SS):
            os.mkdir(SAVE_SS)
        if not os.path.isdir(SAVE_SS):
            print >> sys.stderr, 'Invalid screenshots directory'
            parser.print_usage()
            sys.exit(1)
    START_TIME = time.clock()
    LAST_SCREENSHOT = START_TIME

    scene_dict = pickle.load(args.scene_file)
    HASH_SIZES = scene_dict['sizes']
    scene_models = scene_dict['models']
    NUM_MODELS = len(scene_models)

    global base, render, taskMgr, loader
    base = MyBase()
    render = base.render
    taskMgr = base.taskMgr
    loader = base.loader

    #if FORCE_MODEL_DOWNLOAD:
    #    try:
    #        shutil.rmtree(TEMPDIR)
    #    except OSError:
    #        pass
    try:
        os.mkdir(TEMPDIR)
    except OSError:
        pass

    base.disableMouse()
    pandacore.attachLights(render)

    base.cam.setPos(0, 30000, 10000)
    base.cam.lookAt(0, 0, 2000)

    t = LoadingThread(scene_models)
    t.daemon = True
    t.start()

    taskMgr.add(checkForLoad, "checkForLoad")
    if SAVE_SS is not None:
        taskMgr.add(triggerScreenshot, "triggerScreenshot")

    KeyboardMovement(scale=10.0)
    MouseCamera()

    #base.win.setClearColor(VBase4(0.9,0.9,0.9,1))
    base.win.setClearColor(VBase4(0.529, 0.807, 0.98, 1))
    environ = loader.loadModel("grass.egg")
    environ.reparentTo(render)
    minPt, maxPt = environ.getTightBounds()
    xRange = math.fabs(minPt.getX() - maxPt.getX())
    yRange = math.fabs(minPt.getY() - maxPt.getY())
    zRange = math.fabs(minPt.getZ() - maxPt.getZ())
    environ.setScale(500, 2500, 100)
    environ.setPos(0, 1000, 0)  #-1 * zRange / 2.0)
    environ.setP(180)
    #environ.lookAt(200, 200, 0)
    #environ.lookAt(base.cam)

    #environ.setTransparency(TransparencyAttrib.MAlpha)
    #environ.setAlphaScale(0.3)

    render.setShaderAuto()
    render.setAntialias(AntialiasAttrib.MAuto)
    environ.setShaderOff()

    # effectively disable distance culling
    base.camLens.setFar(sys.maxint)
    base.camLens.setNear(8.0)

    base.setFrameRateMeter(True)
    base.run()
def main():
    
    parser = argparse.ArgumentParser(description='Tool for displaying a scene from open3dhub')

    parser.add_argument('--model-type', choices=['progressive', 'optimized'], default='progressive', required=False, help='Model type to use')
    parser.add_argument('--model-subtype', choices=['base', 'full'], default='base', required=False, help='Model subtype (currently only for progressive)')
    parser.add_argument('--force-model-download', dest='force_model', action='store_true', help='Force re-downloading models')
    parser.add_argument('scene_file', help='Scene file to use, generated with scene_generator', type=argparse.FileType('r'))
    parser.add_argument('--screenshots', required=False, help='Directory to save screenshots', type=str)
    parser.add_argument('--exit-after-load', required=False, default=False, action='store_true', help='Exit the program after all models are loaded')
    
    args = parser.parse_args()
    
    global FORCE_MODEL_DOWNLOAD
    global SAVE_SS
    global START_TIME
    global LAST_SCREENSHOT
    global NUM_MODELS
    global EXIT_AFTER
    global MODEL_TYPE
    global MODEL_SUBTYPE
    global HASH_SIZES
    
    EXIT_AFTER = args.exit_after_load
    FORCE_MODEL_DOWNLOAD = args.force_model
    SAVE_SS = args.screenshots
    MODEL_TYPE = args.model_type
    MODEL_SUBTYPE = args.model_subtype
        
    if SAVE_SS is not None:
        if os.path.isdir(SAVE_SS):
            #yn = raw_input("Delete existing ss dir? ")
            yn = 'y'
            if yn == 'y':
                shutil.rmtree(SAVE_SS)
            else:
                print 'Exiting then'
                sys.exit(1)
        if not os.path.isdir(SAVE_SS):
            os.mkdir(SAVE_SS)
        if not os.path.isdir(SAVE_SS):
            print >> sys.stderr, 'Invalid screenshots directory'
            parser.print_usage()
            sys.exit(1)
    START_TIME = time.clock()
    LAST_SCREENSHOT = START_TIME
    
    scene_dict = pickle.load(args.scene_file)
    HASH_SIZES = scene_dict['sizes']
    scene_models = scene_dict['models']
    NUM_MODELS = len(scene_models)
    
    global base, render, taskMgr, loader
    base = MyBase()
    render = base.render
    taskMgr = base.taskMgr
    loader = base.loader
    
    #if FORCE_MODEL_DOWNLOAD:
    #    try:
    #        shutil.rmtree(TEMPDIR)
    #    except OSError:
    #        pass
    try:
        os.mkdir(TEMPDIR)
    except OSError:
        pass
    
    base.disableMouse()
    pandacore.attachLights(render)
    
    base.cam.setPos(0, 30000, 10000)
    base.cam.lookAt(0, 0, 2000)
    
    t = LoadingThread(scene_models)
    t.daemon = True
    t.start()
    
    taskMgr.add(checkForLoad, "checkForLoad")
    if SAVE_SS is not None:
        taskMgr.add(triggerScreenshot, "triggerScreenshot")
    
    KeyboardMovement(scale=10.0)
    MouseCamera()
    
    #base.win.setClearColor(VBase4(0.9,0.9,0.9,1))
    base.win.setClearColor(VBase4(0.529,0.807,0.98,1))
    environ = loader.loadModel("grass.egg")
    environ.reparentTo(render)
    minPt, maxPt = environ.getTightBounds()
    xRange = math.fabs(minPt.getX() - maxPt.getX())
    yRange = math.fabs(minPt.getY() - maxPt.getY())
    zRange = math.fabs(minPt.getZ() - maxPt.getZ())
    environ.setScale(500, 2500, 100)
    environ.setPos(0, 1000, 0) #-1 * zRange / 2.0)
    environ.setP(180)
    #environ.lookAt(200, 200, 0)
    #environ.lookAt(base.cam)
    
    #environ.setTransparency(TransparencyAttrib.MAlpha)
    #environ.setAlphaScale(0.3)
    
    render.setShaderAuto()
    render.setAntialias(AntialiasAttrib.MAuto)
    environ.setShaderOff()
    
    # effectively disable distance culling
    base.camLens.setFar(sys.maxint)
    base.camLens.setNear(8.0)
    
    base.setFrameRateMeter(True)
    base.run()
Ejemplo n.º 10
0
    def __init__(self, models):
        ShowBase.ShowBase.__init__(self)
        
        self.models = models
        
        unique_meshes = set(m.mesh for m in models)
        mesh2nodepath = {}
        for mesh in unique_meshes:
            scene_members = pcore.getSceneMembers(mesh)
            
            rotateNode = p3d.GeomNode("rotater")
            rotatePath = p3d.NodePath(rotateNode)
            matrix = numpy.identity(4)
            if mesh.assetInfo.upaxis == collada.asset.UP_AXIS.X_UP:
                r = collada.scene.RotateTransform(0,1,0,90)
                matrix = r.matrix
            elif mesh.assetInfo.upaxis == collada.asset.UP_AXIS.Y_UP:
                r = collada.scene.RotateTransform(1,0,0,90)
                matrix = r.matrix
            rotatePath.setMat(p3d.Mat4(*matrix.T.flatten().tolist()))
            
            rbc = p3d.RigidBodyCombiner('combiner')
            rbcPath = rotatePath.attachNewNode(rbc)
            
            for geom, renderstate, mat4 in scene_members:
                node = p3d.GeomNode("primitive")
                node.addGeom(geom)
                if renderstate is not None:
                    node.setGeomState(0, renderstate)
                geomPath = rbcPath.attachNewNode(node)
                geomPath.setMat(mat4)
                
            rbc.collect()

            mesh2nodepath[mesh] = centerAndScale(rotatePath, print_bounds.getBoundsInfo(mesh))

        scenepath = render.attachNewNode("scene")
        for model in self.models:
            np = mesh2nodepath[model.mesh]
            instance = scenepath.attachNewNode("model")
            np.instanceTo(instance)
            instance.setPos(model.x, model.y, model.z)
            instance.setScale(model.scale, model.scale, model.scale)
            q = p3d.Quat()
            q.setI(model.orient_x)
            q.setJ(model.orient_y)
            q.setK(model.orient_z)
            q.setR(model.orient_w)
            instance.setQuat(q)

        base.camLens.setFar(sys.maxint)
        base.camLens.setNear(8.0)

        pcore.attachLights(render)

        render.setShaderAuto()
        render.setTransparency(p3d.TransparencyAttrib.MDual, 1)
        render.setAntialias(p3d.AntialiasAttrib.MAuto)

        controls.KeyboardMovement()
        controls.ButtonUtils(scenepath)
        controls.MouseDrag(scenepath)
        controls.MouseCamera()
        controls.MouseScaleZoom(scenepath)
    def __init__(self, mesh_path, progressive_texture_path):

        resolutions = []
        f = tarfile.open(progressive_texture_path)
        for resolution_name in f.getnames():
            toset = {'size': resolution_name[:-4],
                     'contents': f.extractfile(resolution_name).read()}
            texpnm = PNMImage()
            texpnm.read(StringStream(toset['contents']), 'something.jpg')
            newtex = Texture()
            newtex.load(texpnm)
            toset['texture'] = newtex
            resolutions.append(toset)
        
        self.resolutions = resolutions
        def aux_loader(fname):
            return resolutions[0]['contents']
        mesh = collada.Collada(mesh_path, aux_file_loader=aux_loader)
        
        scene_members = getSceneMembers(mesh)
        
        base = ShowBase()
        
        rotateNode = GeomNode("rotater")
        rotatePath = render.attachNewNode(rotateNode)
        matrix = numpy.identity(4)
        if mesh.assetInfo.upaxis == collada.asset.UP_AXIS.X_UP:
            r = collada.scene.RotateTransform(0,1,0,90)
            matrix = r.matrix
        elif mesh.assetInfo.upaxis == collada.asset.UP_AXIS.Y_UP:
            r = collada.scene.RotateTransform(1,0,0,90)
            matrix = r.matrix
        rotatePath.setMat(Mat4(*matrix.T.flatten().tolist()))
        
        geom, renderstate, mat4 = scene_members[0]
        node = GeomNode("primitive")
        node.addGeom(geom)
        if renderstate is not None:
            node.setGeomState(0, renderstate)
        self.geomPath = rotatePath.attachNewNode(node)
        self.geomPath.setMat(mat4)
            
        wrappedNode = ensureCameraAt(self.geomPath, base.camera)
        base.disableMouse()
        attachLights(render)
        render.setShaderAuto()
        render.setTransparency(TransparencyAttrib.MDual, 1)
    
        base.render.analyze()
        KeyboardMovement()
        MouseDrag(wrappedNode)
        MouseScaleZoom(wrappedNode)
        MouseCamera()
        
        num_resolutions = len(resolutions) - 1
        self.slider = DirectSlider(range=(0, num_resolutions),
                                   value=0, pageSize=1,
                                   command=self.sliderMoved, pos=(0, 0, -.9), scale=1)
        for key, val in uiArgs.iteritems():
            self.slider.thumb[key] = val
        
        self.triText = OnscreenText(text="", pos=(-1,0.85), scale = 0.15,
                                    fg=(1, 0.5, 0.5, 1), align=TextNode.ALeft, mayChange=1)
        
        base.run()
Ejemplo n.º 12
0
def getPmPerceptualError(mesh, pm_filebuf, mipmap_tarfilebuf):
    perceptualdiff = which('perceptualdiff')
    if perceptualdiff is None:
        raise Exception("perceptualdiff exectuable not found on path")

    pm_chunks = []

    if pm_filebuf is not None:
        data = pm_filebuf.read(PM_CHUNK_SIZE)
        refinements_read = 0
        num_refinements = None
        while len(data) > 0:
            (refinements_read, num_refinements, pm_refinements,
             data_left) = pdae_utils.readPDAEPartial(data, refinements_read,
                                                     num_refinements)
            pm_chunks.append(pm_refinements)
            data = data_left + pm_filebuf.read(PM_CHUNK_SIZE)

    tar = tarfile.TarFile(fileobj=mipmap_tarfilebuf)
    texsizes = []
    largest_tarinfo = (0, None)
    for tarinfo in tar:
        tarinfo.xsize = int(tarinfo.name.split('x')[0])
        if tarinfo.xsize > largest_tarinfo[0]:
            largest_tarinfo = (tarinfo.xsize, tarinfo)
        if tarinfo.xsize >= 128:
            texsizes.append(tarinfo)
    if len(texsizes) == 0:
        texsizes.append(largest_tarinfo[1])

    texsizes = sorted(texsizes, key=lambda t: t.xsize)
    texims = []
    first_image_data = None
    for tarinfo in texsizes:
        f = tar.extractfile(tarinfo)
        texdata = f.read()
        if first_image_data is None:
            first_image_data = texdata

        texpnm = PNMImage()
        texpnm.read(StringStream(texdata), 'something.jpg')
        newtex = Texture()
        newtex.load(texpnm)
        texims.append(newtex)

    mesh.images[0].setData(first_image_data)

    scene_members = getSceneMembers(mesh)

    # turn off panda3d printing to stdout
    nout = MultiplexStream()
    Notify.ptr().setOstreamPtr(nout, 0)
    nout.addFile(Filename(os.devnull))

    base = ShowBase()

    rotateNode = GeomNode("rotater")
    rotatePath = base.render.attachNewNode(rotateNode)
    matrix = numpy.identity(4)
    if mesh.assetInfo.upaxis == collada.asset.UP_AXIS.X_UP:
        r = collada.scene.RotateTransform(0, 1, 0, 90)
        matrix = r.matrix
    elif mesh.assetInfo.upaxis == collada.asset.UP_AXIS.Y_UP:
        r = collada.scene.RotateTransform(1, 0, 0, 90)
        matrix = r.matrix
    rotatePath.setMat(Mat4(*matrix.T.flatten().tolist()))
    geom, renderstate, mat4 = scene_members[0]
    node = GeomNode("primitive")
    node.addGeom(geom)
    if renderstate is not None:
        node.setGeomState(0, renderstate)
    geomPath = rotatePath.attachNewNode(node)
    geomPath.setMat(mat4)

    wrappedNode = ensureCameraAt(geomPath, base.camera)
    base.disableMouse()
    attachLights(base.render)
    base.render.setShaderAuto()
    base.render.setTransparency(TransparencyAttrib.MNone)
    base.render.setColorScaleOff(9999)

    controls.KeyboardMovement()
    controls.MouseDrag(wrappedNode)
    controls.MouseScaleZoom(wrappedNode)
    controls.ButtonUtils(wrappedNode)
    controls.MouseCamera()

    error_data = []

    try:
        tempdir = tempfile.mkdtemp(prefix='meshtool-print-pm-perceptual-error')

        triangleCounts = []

        hprs = [(0, 0, 0), (0, 90, 0), (0, 180, 0), (0, 270, 0), (90, 0, 0),
                (-90, 0, 0)]

        for texim in texims:
            np = base.render.find("**/rotater/collada")
            np.setTextureOff(1)
            np.setTexture(texim, 1)
            for angle, hpr in enumerate(hprs):
                wrappedNode.setHpr(*hpr)
                takeScreenshot(tempdir, base, geomPath, texim, angle)
        triangleCounts.append(getNumTriangles(geomPath))

        for pm_chunk in pm_chunks:
            pdae_panda.add_refinements(geomPath, pm_chunk)

            for texim in texims:
                np = base.render.find("**/rotater/collada")
                np.setTextureOff(1)
                np.setTexture(texim, 1)
                for angle, hpr in enumerate(hprs):
                    wrappedNode.setHpr(*hpr)
                    takeScreenshot(tempdir, base, geomPath, texim, angle)
            triangleCounts.append(getNumTriangles(geomPath))

        full_tris = triangleCounts[-1]
        full_tex = texims[-1]

        for numtris in triangleCounts:
            for texim in texims:
                pixel_diff = 0
                for angle, hpr in enumerate(hprs):
                    curFile = '%d_%d_%d_%d.png' % (numtris, texim.getXSize(),
                                                   texim.getYSize(), angle)
                    curFile = os.path.join(tempdir, curFile)

                    fullFile = '%d_%d_%d_%d.png' % (full_tris,
                                                    full_tex.getXSize(),
                                                    full_tex.getYSize(), angle)
                    fullFile = os.path.join(tempdir, fullFile)

                    try:
                        output = subprocess.check_output([
                            perceptualdiff, '-threshold', '1', fullFile,
                            curFile
                        ])
                    except subprocess.CalledProcessError as ex:
                        output = ex.output

                    output = output.strip()
                    if len(output) > 0:
                        pixel_diff = max(pixel_diff,
                                         int(output.split('\n')[1].split()[0]))

                error_data.append({
                    'triangles': numtris,
                    'width': texim.getXSize(),
                    'height': texim.getYSize(),
                    'pixel_error': pixel_diff
                })

    finally:
        shutil.rmtree(tempdir, ignore_errors=True)

    return error_data
def getPmPerceptualError(mesh, pm_filebuf, mipmap_tarfilebuf):
    perceptualdiff = which('perceptualdiff')
    if perceptualdiff is None:
        raise Exception("perceptualdiff exectuable not found on path")
    
    pm_chunks = []
    
    if pm_filebuf is not None:
        data = pm_filebuf.read(PM_CHUNK_SIZE)
        refinements_read = 0
        num_refinements = None
        while len(data) > 0:
            (refinements_read, num_refinements, pm_refinements, data_left) = pdae_utils.readPDAEPartial(data, refinements_read, num_refinements)
            pm_chunks.append(pm_refinements)
            data = data_left + pm_filebuf.read(PM_CHUNK_SIZE)
    
    tar = tarfile.TarFile(fileobj=mipmap_tarfilebuf)
    texsizes = []
    largest_tarinfo = (0, None)
    for tarinfo in tar:
        tarinfo.xsize = int(tarinfo.name.split('x')[0])
        if tarinfo.xsize > largest_tarinfo[0]:
            largest_tarinfo = (tarinfo.xsize, tarinfo)
        if tarinfo.xsize >= 128:
            texsizes.append(tarinfo)
    if len(texsizes) == 0:
        texsizes.append(largest_tarinfo[1])
    
    texsizes = sorted(texsizes, key=lambda t: t.xsize)
    texims = []
    first_image_data = None
    for tarinfo in texsizes:
        f = tar.extractfile(tarinfo)
        texdata = f.read()
        if first_image_data is None:
            first_image_data = texdata
        
        texpnm = PNMImage()
        texpnm.read(StringStream(texdata), 'something.jpg')
        newtex = Texture()
        newtex.load(texpnm)
        texims.append(newtex)
    
    mesh.images[0].setData(first_image_data)
    
    scene_members = getSceneMembers(mesh)
    
    # turn off panda3d printing to stdout
    nout = MultiplexStream()
    Notify.ptr().setOstreamPtr(nout, 0)
    nout.addFile(Filename(os.devnull))
    
    base = ShowBase()
    
    rotateNode = GeomNode("rotater")
    rotatePath = base.render.attachNewNode(rotateNode)
    matrix = numpy.identity(4)
    if mesh.assetInfo.upaxis == collada.asset.UP_AXIS.X_UP:
        r = collada.scene.RotateTransform(0,1,0,90)
        matrix = r.matrix
    elif mesh.assetInfo.upaxis == collada.asset.UP_AXIS.Y_UP:
        r = collada.scene.RotateTransform(1,0,0,90)
        matrix = r.matrix
    rotatePath.setMat(Mat4(*matrix.T.flatten().tolist()))
    geom, renderstate, mat4 = scene_members[0]
    node = GeomNode("primitive")
    node.addGeom(geom)
    if renderstate is not None:
        node.setGeomState(0, renderstate)
    geomPath = rotatePath.attachNewNode(node)
    geomPath.setMat(mat4)
        
    wrappedNode = ensureCameraAt(geomPath, base.camera)
    base.disableMouse()
    attachLights(base.render)
    base.render.setShaderAuto()
    base.render.setTransparency(TransparencyAttrib.MNone)
    base.render.setColorScaleOff(9999)
    
    controls.KeyboardMovement()
    controls.MouseDrag(wrappedNode)
    controls.MouseScaleZoom(wrappedNode)
    controls.ButtonUtils(wrappedNode)
    controls.MouseCamera()
    
    error_data = []
    
    try:
        tempdir = tempfile.mkdtemp(prefix='meshtool-print-pm-perceptual-error')
        
        triangleCounts = []
        
        hprs = [(0, 0, 0),
                (0, 90, 0),
                (0, 180, 0),
                (0, 270, 0),
                (90, 0, 0),
                (-90, 0, 0)]
        
        for texim in texims:
            np = base.render.find("**/rotater/collada")
            np.setTextureOff(1)
            np.setTexture(texim, 1)
            for angle, hpr in enumerate(hprs):
                wrappedNode.setHpr(*hpr)
                takeScreenshot(tempdir, base, geomPath, texim, angle)
        triangleCounts.append(getNumTriangles(geomPath))
        
        for pm_chunk in pm_chunks:
            pdae_panda.add_refinements(geomPath, pm_chunk)
            
            for texim in texims:
                np = base.render.find("**/rotater/collada")
                np.setTextureOff(1)
                np.setTexture(texim, 1)
                for angle, hpr in enumerate(hprs):
                    wrappedNode.setHpr(*hpr)
                    takeScreenshot(tempdir, base, geomPath, texim, angle)
            triangleCounts.append(getNumTriangles(geomPath))
        
        full_tris = triangleCounts[-1]
        full_tex = texims[-1]
        
        for numtris in triangleCounts:
            for texim in texims:
                pixel_diff = 0
                for angle, hpr in enumerate(hprs):
                    curFile = '%d_%d_%d_%d.png' % (numtris, texim.getXSize(), texim.getYSize(), angle)
                    curFile = os.path.join(tempdir, curFile)
                    
                    fullFile = '%d_%d_%d_%d.png' % (full_tris, full_tex.getXSize(), full_tex.getYSize(), angle)
                    fullFile = os.path.join(tempdir, fullFile)
                    
                    try:
                        output = subprocess.check_output([perceptualdiff, '-threshold', '1', fullFile, curFile])
                    except subprocess.CalledProcessError as ex:
                        output = ex.output
                    
                    output = output.strip()
                    if len(output) > 0:
                        pixel_diff = max(pixel_diff, int(output.split('\n')[1].split()[0]))
                    
                error_data.append({'triangles': numtris,
                                   'width': texim.getXSize(),
                                   'height': texim.getYSize(),
                                   'pixel_error': pixel_diff})
    
    finally:
        shutil.rmtree(tempdir, ignore_errors=True)
        
    return error_data
Ejemplo n.º 14
0
 def __init__(self, outfile, scenefile):
     
     self.outfile = outfile
     self.scenefile = scenefile
     self.scene = scene.Scene.fromfile(scenefile)
     
     terrain = [m for m in self.scene if m.model_type == 'terrain']
     assert len(terrain) == 1
     terrain = terrain[0]
     
     mesh = terrain.mesh
     boundsInfo = scene.SceneModel.extract_bounds_info(terrain.metadata, 'optimized')
     terrain_np = katasked.panda.mesh_to_nodepath(mesh, boundsInfo)
     
     ShowBase.ShowBase.__init__(self)
     
     print
     print '==================================='
     print '             Controls              '
     print '==================================='
     print '                W - move forward'
     print '                S - move backward'
     print '                A - strafe left'
     print '                D - strafe right'
     print '       left arrow - turn left'
     print '      right arrow - turn right'
     print ' right click drag - camera movement'
     print '                [ - slow down'
     print '                ] - speed up'
     print
     print '-----------------------------------------'
     print 'Press enter when ready to start capturing'
     print '-----------------------------------------'
     print
     
     np = self.render.attachNewNode("wrapnode")
     terrain_np.reparentTo(np)
     np.setPos(terrain.x, terrain.y, terrain.z)
     np.setScale(terrain.scale, terrain.scale, terrain.scale)
     q = p3d.Quat()
     q.setI(terrain.orient_x)
     q.setJ(terrain.orient_y)
     q.setK(terrain.orient_z)
     q.setR(terrain.orient_w)
     np.setQuat(q)
     
     self.disableMouse()
     pcore.attachLights(self.render)
     self.render.setShaderAuto()
     self.render.setTransparency(p3d.TransparencyAttrib.MNone)
     
     self.camLens.setFar(sys.maxint)
     self.camLens.setNear(8.0)
     self.render.setAntialias(p3d.AntialiasAttrib.MAuto)
     
     controls.KeyboardMovement()
     controls.MouseCamera()
     
     self.positions = []
     self.rotations = []
     
     self.acceptOnce('enter', self.startCapture)