Пример #1
0
def povrayProcessSSS(rmeshes, outDir, settings, progressCallback = None):

    def progress(prog):
        if progressCallback == None:
            gui3d.app.progress(prog)
        else:
            progressCallback(prog)
    progress(0)

    progbase = 0
    nextpb = 1 - 0.65*settings['usebump']
    # get lightmap
    lmap = projection.mapSceneLighting(
        settings['scene'],progressCallback = lambda p: progress(0.3*nextpb*p))
    # prepare channels
    lmap = imgop.getChannel(lmap,1)
    alpha = imgop.shrinkSelection(projection.mapMask())
    for i in range(3):
        alpha = imgop.shrinkSelection(alpha)
    black = mh.Image(data = imgop.numpy.zeros((lmap.height, lmap.width, 1), dtype=imgop.numpy.uint8))
    # calculate blur level of each cannel, according to settings
    sssa = float(settings['SSSA'])
    # blue channel
    imgop.compose([black,black,lmap]).save(
        os.path.join(outDir, '%s_sss_bluelmap.png' % rmeshes[0].name))
    # green channel
    progress(0.4*nextpb)
    lmap = imgop.blurred(lmap, (float(lmap.width)/1024)*1.6*sssa, 13, lambda p: progress((0.4+0.3*p)*nextpb))
    imgop.compose([black,lmap,black]).save(
        os.path.join(outDir, '%s_sss_greenlmap.png' % rmeshes[0].name))
    # red channel
    progress(0.7*nextpb)
    lmap = imgop.blurred(lmap, (float(lmap.width)/1024)*3.2*sssa, 13, lambda p: progress((0.7+0.2*p)*nextpb))
    alpha = imgop.blurred(alpha, 4, 13, lambda p: progress((0.9+0.1*p)*nextpb))
    alpha.save(os.path.join(outDir, '%s_sss_alpha.png' % rmeshes[0].name))
    imgop.compose([lmap,black,black]).save(
        os.path.join(outDir, '%s_sss_redlmap.png' % rmeshes[0].name))
    progbase = nextpb
    progress(progbase)
    if settings['usebump']:
        bumpdata = rmeshes[0].material.bumpMapTexture
        if bumpdata is None:
            bumpdata = rmeshes[0].material.displacementMapTexture
        if bumpdata:
            # Export blurred bump maps
            lmap = imgop.Image(data = bumpdata)
            lmap = imgop.getChannel(lmap,1)
            lmap = imgop.blurred(lmap, (float(lmap.width)/1024)*1.6*sssa, 15,
                                 lambda p: progress(progbase+0.5*p*(1-progbase)))
            progress(progbase+0.5*(1-progbase))
            lmap.save(os.path.join(outDir, '%s_sss_greenbump.png' % rmeshes[0].name))
            lmap = imgop.blurred(lmap, (float(lmap.width)/1024)*3.2*sssa, 15,
                                 lambda p: progress(progbase+(0.5+0.5*p)*(1-progbase)))
            lmap.save(os.path.join(outDir, '%s_sss_redbump.png' % rmeshes[0].name))
        progress(1.0)
Пример #2
0
def povrayProcessSSS(stuffs, outDir, settings, progressCallback=None):
    def progress(prog):
        if progressCallback == None:
            gui3d.app.progress(prog)
        else:
            progressCallback(prog)

    progress(0)

    progbase = 0
    nextpb = 1 - 0.65 * settings['usebump']
    # get lightmap
    lmap = projection.mapSceneLighting(
        settings['scene'],
        progressCallback=lambda p: progress(0.3 * nextpb * p))
    lmap = imgop.getChannel(lmap, 1)
    # prepare channels
    black = imgop.Image(data=imgop.numpy.zeros((lmap.height, lmap.width, 1),
                                               dtype=imgop.numpy.uint8))
    # calculate blur level of each cannel, according to settings
    sssa = float(settings['SSSA'])
    # blue channel
    imgop.compose([black, black, lmap]).save(
        os.path.join(outDir, '%s_sss_bluelmap.png' % stuffs[0].name))
    # green channel
    progress(0.4 * nextpb)
    lmap2 = imgop.blurred(lmap, 16 * sssa, 13, lambda p: progress(
        (0.4 + 0.3 * p) * nextpb))
    imgop.compose([black, lmap2, black]).save(
        os.path.join(outDir, '%s_sss_greenlmap.png' % stuffs[0].name))
    # red channel
    progress(0.7 * nextpb)
    lmap2 = imgop.blurred(lmap2, 32 * sssa, 13, lambda p: progress(
        (0.7 + 0.3 * p) * nextpb))
    imgop.compose([lmap2, black, black]).save(
        os.path.join(outDir, '%s_sss_redlmap.png' % stuffs[0].name))
    progbase = nextpb
    progress(progbase)
    if settings['usebump']:
        # Export blurred bump maps
        lmap = imgop.Image(os.path.join(stuffs[0].bump[0], stuffs[0].bump[1]))
        lmap = imgop.getChannel(lmap, 1)
        lmap = imgop.blurred(
            lmap, (float(lmap.width) / 1024) * 1.6 * sssa, 15,
            lambda p: progress(progbase + 0.5 * p * (1 - progbase)))
        progress(progbase + 0.5 * (1 - progbase))
        lmap.save(os.path.join(outDir,
                               '%s_sss_greenbump.png' % stuffs[0].name))
        lmap = imgop.blurred(
            lmap, (float(lmap.width) / 1024) * 3.2 * sssa, 15,
            lambda p: progress(progbase + (0.5 + 0.5 * p) * (1 - progbase)))
        lmap.save(os.path.join(outDir, '%s_sss_redbump.png' % stuffs[0].name))
        progress(1.0)
Пример #3
0
def povrayProcessSSS(stuffs, outDir, settings, progressCallback = None):

    def progress(prog):
        if progressCallback == None:
            gui3d.app.progress(prog)
        else:
            progressCallback(prog)
    progress(0)
        
    progbase = 0
    nextpb = 1 - 0.65*settings['usebump']
    # get lightmap
    lmap = projection.mapSceneLighting(
        settings['scene'],progressCallback = lambda p: progress(0.3*nextpb*p))
    lmap = imgop.getChannel(lmap,1)
    # prepare channels
    black = imgop.Image(data=imgop.numpy.zeros((lmap.height, lmap.width, 1), dtype=imgop.numpy.uint8))
    # calculate blur level of each cannel, according to settings
    sssa = float(settings['SSSA'])
    # blue channel
    imgop.compose([black,black,lmap]).save(
        os.path.join(outDir, '%s_sss_bluelmap.png' % stuffs[0].name))
    # green channel
    progress(0.4*nextpb)
    lmap2 = imgop.blurred(lmap, 16*sssa, 13, lambda p: progress((0.4+0.3*p)*nextpb))
    imgop.compose([black,lmap2,black]).save(
        os.path.join(outDir, '%s_sss_greenlmap.png' % stuffs[0].name))
    # red channel
    progress(0.7*nextpb)
    lmap2 = imgop.blurred(lmap2, 32*sssa, 13, lambda p: progress((0.7+0.3*p)*nextpb))
    imgop.compose([lmap2,black,black]).save(
        os.path.join(outDir, '%s_sss_redlmap.png' % stuffs[0].name))
    progbase = nextpb
    progress(progbase)
    if settings['usebump']:
        # Export blurred bump maps
        lmap = imgop.Image(os.path.join(stuffs[0].bump[0], stuffs[0].bump[1]))
        lmap = imgop.getChannel(lmap,1)
        lmap = imgop.blurred(lmap, (float(lmap.width)/1024)*1.6*sssa, 15,
                             lambda p: progress(progbase+0.5*p*(1-progbase)))
        progress(progbase+0.5*(1-progbase))
        lmap.save(os.path.join(outDir, '%s_sss_greenbump.png' % stuffs[0].name))
        lmap = imgop.blurred(lmap, (float(lmap.width)/1024)*3.2*sssa, 15,
                             lambda p: progress(progbase+(0.5+0.5*p)*(1-progbase)))
        lmap.save(os.path.join(outDir, '%s_sss_redbump.png' % stuffs[0].name))
        progress(1.0)
Пример #4
0
def my_render(settings=None):
    if settings is None:
        settings = {'AA': True, 'lightmapSSS': False, 'scene': G.app.scene, 'dimensions': (230, 230)}

    if settings['lightmapSSS']:
        human = G.app.selectedHuman
        material_backup = material.Material(human.material)

        diffuse = imgop.Image(data=human.material.diffuseTexture)
        lmap = projection.mapSceneLighting(settings['scene'], border=human.material.sssRScale)
        lmapG = imgop.blurred(lmap, human.material.sssGScale, 13)
        lmapR = imgop.blurred(lmap, human.material.sssRScale, 13)
        lmap = imgop.compose([lmapR, lmapG, lmap])

        if not diffuse.isEmpty:
            lmap = imgop.resized(lmap, diffuse.width, diffuse.height, filter=image.FILTER_BILINEAR)
            lmap = imgop.multiply(lmap, diffuse)
            lmap.sourcePath = "Internal_Renderer_Lightmap_SSS_Texture"

        human.material.diffuseTexture = lmap
        human.configureShading(diffuse=True)
        human.shadeless = True

    if not mh.hasRenderToRenderbuffer():
        img = mh.grabScreen(0, 0, G.windowWidth, G.windowHeight)
        alphaImg = None
    else:
        width, height = settings['dimensions']
        if settings['AA']:
            width *= 2
            height *= 2

            img = mh.renderToBuffer(width, height)
            alphaImg = mh.renderAlphaMask(width, height)
            img = imgop.addAlpha(img, imgop.getChannel(alphaImg, 0))

        if settings['AA']:
            img = img.resized(width/2, height/2, filter=image.FILTER_BILINEAR)
            img.data[:, :, :] = img.data[:, :, (2, 1, 0, 3)]

    if settings['lightmapSSS']:
        human.material = material_backup

    return img
Пример #5
0
def Render(settings):
    progress = Progress.begin()

    if not mh.hasRenderToRenderbuffer():
        settings['dimensions'] = (G.windowWidth, G.windowHeight)

    if settings['lightmapSSS']:
        progress(0, 0.05, "Storing data")
        import material
        human = G.app.selectedHuman
        materialBackup = material.Material(human.material)

        progress(0.05, 0.1, "Projecting lightmaps")
        diffuse = imgop.Image(data=human.material.diffuseTexture)
        lmap = projection.mapSceneLighting(settings['scene'],
                                           border=human.material.sssRScale)
        progress(0.1, 0.4, "Applying medium scattering")
        lmapG = imgop.blurred(lmap, human.material.sssGScale, 13)
        progress(0.4, 0.7, "Applying high scattering")
        lmapR = imgop.blurred(lmap, human.material.sssRScale, 13)
        lmap = imgop.compose([lmapR, lmapG, lmap])
        if not diffuse.isEmpty:
            progress(0.7, 0.8, "Combining textures")
            lmap = imgop.resized(lmap,
                                 diffuse.width,
                                 diffuse.height,
                                 filter=image.FILTER_BILINEAR)
            progress(0.8, 0.9)
            lmap = imgop.multiply(lmap, diffuse)
        lmap.sourcePath = "Internal_Renderer_Lightmap_SSS_Texture"

        progress(0.9, 0.95, "Setting up renderer")
        human.material.diffuseTexture = lmap
        human.configureShading(diffuse=True)
        human.shadeless = True
        progress(0.95, 0.98, None)
    else:
        progress(0, 0.99, None)

    if not mh.hasRenderToRenderbuffer():
        # Limited fallback mode, read from screen buffer
        log.message("Fallback render: grab screen")
        img = mh.grabScreen(0, 0, G.windowWidth, G.windowHeight)
        alphaImg = None
    else:
        # Render to framebuffer object
        renderprog = Progress()
        renderprog(0, 0.99 - 0.59 * settings['AA'], "Rendering")
        width, height = settings['dimensions']
        log.message("Rendering at %sx%s", width, height)
        if settings['AA']:
            width = width * 2
            height = height * 2
        img = mh.renderToBuffer(width, height)
        alphaImg = mh.renderAlphaMask(width, height)
        img = imgop.addAlpha(img, imgop.getChannel(alphaImg, 0))

        if settings['AA']:
            renderprog(0.4, 0.99, "AntiAliasing")
            # Resize to 50% using bi-linear filtering
            img = img.resized(width / 2,
                              height / 2,
                              filter=image.FILTER_BILINEAR)
            # TODO still haven't figured out where components get swapped, but this hack appears to be necessary
            img.data[:, :, :] = img.data[:, :, (2, 1, 0, 3)]
        renderprog.finish()

    if settings['lightmapSSS']:
        progress(0.98, 0.99, "Restoring data")
        human.material = materialBackup

    progress(1, None, 'Rendering complete')

    gui3d.app.getCategory('Rendering').getTaskByName('Viewer').setImage(img)
    mh.changeTask('Rendering', 'Viewer')
    gui3d.app.statusPersist('Rendering complete')
Пример #6
0
                    else:
                        return tdi

                if not func:
                    # Get the map item associated with the current Texture.
                    mapitem = self.Object.analyzer.map[self.name]
                    if len(mapitem) == 2:
                        # If it has only 1 definition-writer function, use it.
                        func = mapitem[1]
                    else:
                        # Else, use the first provided definition-writer function
                        # if the texture exists, else the second
                        # (2nd and 3rd map tuple item respectively).
                        func = mapitem[(1 if self.__nonzero__() else 2)]

                return analyzeDef(func)
                    

import image_operations as imgop

imgopfuncs = {
    'black': lambda img: imgop.getBlack(img) if img else None,
    'white': lambda img: imgop.getWhite(img) if img else None,
    'blur': lambda img, lev, ker: imgop.blurred(imgop.Image(data = img), lev, ker) if img else None,
    'compose': lambda l: imgop.compose(l),
    'getChannel': lambda t, c: imgop.getChannel(imgop.Image(data = t),c) if t else None,
    'getAlpha': lambda t: imgop.getAlpha(imgop.Image(data = t)) if t else None,
    'growMask': lambda t, p: imgop.growMask(imgop.Image(data = t), p) if t else None,
    'shrinkMask': lambda t, p: imgop.shrinkMask(imgop.Image(data = t), p) if t else None}

Пример #7
0
def Render(settings):
    progress = Progress.begin()

    if not mh.hasRenderToRenderbuffer():
        settings['dimensions'] = (G.windowWidth, G.windowHeight)

    if settings['lightmapSSS']:
        progress(0, 0.05, "Storing data")
        import material
        human = G.app.selectedHuman
        materialBackup = material.Material(human.material)

        progress(0.05, 0.1, "Projecting lightmaps")
        diffuse = imgop.Image(data=human.material.diffuseTexture)
        lmap = projection.mapSceneLighting(settings['scene'],
                                           border=human.material.sssRScale)
        progress(0.1, 0.4, "Applying medium scattering")
        lmapG = imgop.blurred(lmap, human.material.sssGScale, 13)
        progress(0.4, 0.7, "Applying high scattering")
        lmapR = imgop.blurred(lmap, human.material.sssRScale, 13)
        lmap = imgop.compose([lmapR, lmapG, lmap])
        if not diffuse.isEmpty:
            progress(0.7, 0.8, "Combining textures")
            lmap = imgop.resized(lmap, diffuse.width, diffuse.height)
            progress(0.8, 0.9)
            lmap = imgop.multiply(lmap, diffuse)
        lmap.sourcePath = "Internal_Renderer_Lightmap_SSS_Texture"

        progress(0.9, 0.95, "Setting up renderer")
        human.material.diffuseTexture = lmap
        human.mesh.configureShading(diffuse=True)
        human.mesh.shadeless = True
        progress(0.95, 0.98, None)
    else:
        progress(0, 0.99, None)

    if not mh.hasRenderToRenderbuffer():
        # Limited fallback mode, read from screen buffer
        log.message("Fallback render: grab screen")
        img = mh.grabScreen(0, 0, G.windowWidth, G.windowHeight)
        alphaImg = None
    else:
        # Render to framebuffer object
        renderprog = Progress()
        renderprog(0, 0.99 - 0.59 * settings['AA'], "Rendering")
        width, height = settings['dimensions']
        log.message("Rendering at %sx%s", width, height)
        if settings['AA']:
            width = width * 2
            height = height * 2
        img = mh.renderToBuffer(width, height)
        alphaImg = mh.renderAlphaMask(width, height)
        img = imgop.addAlpha(img, imgop.getChannel(alphaImg, 0))

        if settings['AA']:
            renderprog(0.4, 0.99, "AntiAliasing")
            # Resize to 50% using Qt image class
            qtImg = img.toQImage()
            del img
            # Bilinear filtered resize for anti-aliasing
            scaledImg = qtImg.scaled(
                width / 2,
                height / 2,
                transformMode=gui.QtCore.Qt.SmoothTransformation)
            del qtImg
            img = scaledImg
            #img = image.Image(scaledImg)    # Convert back to MH image
            #del scaledImg
        renderprog.finish()

    if settings['lightmapSSS']:
        progress(0.98, 0.99, "Restoring data")
        human.material = materialBackup

    progress(1, None, 'Rendering complete')

    gui3d.app.getCategory('Rendering').getTaskByName('Viewer').setImage(img)
    mh.changeTask('Rendering', 'Viewer')
    gui3d.app.statusPersist('Rendering complete.')
Пример #8
0
def Render(settings):
    progress = Progress.begin()
    
    if not mh.hasRenderToRenderbuffer():
        settings['dimensions'] = (G.windowWidth, G.windowHeight)

    if settings['lightmapSSS']:
        progress(0, 0.05, "Storing data")
        import material
        human = G.app.selectedHuman
        materialBackup = material.Material(human.material)

        progress(0.05, 0.1, "Projecting lightmaps")
        diffuse = imgop.Image(data = human.material.diffuseTexture)
        lmap = projection.mapSceneLighting(
            settings['scene'], border = human.material.sssRScale)
        progress(0.1, 0.4, "Applying medium scattering")
        lmapG = imgop.blurred(lmap, human.material.sssGScale, 13)
        progress(0.4, 0.7, "Applying high scattering")
        lmapR = imgop.blurred(lmap, human.material.sssRScale, 13)
        lmap = imgop.compose([lmapR, lmapG, lmap])
        if not diffuse.isEmpty:
            progress(0.7, 0.8, "Combining textures")
            lmap = imgop.resized(lmap, diffuse.width, diffuse.height, filter=image.FILTER_BILINEAR)
            progress(0.8, 0.9)
            lmap = imgop.multiply(lmap, diffuse)
        lmap.sourcePath = "Internal_Renderer_Lightmap_SSS_Texture"

        progress(0.9, 0.95, "Setting up renderer")
        human.material.diffuseTexture = lmap
        human.configureShading(diffuse = True)
        human.shadeless = True
        progress(0.95, 0.98, None)
    else:
        progress(0, 0.99, None)
        
    if not mh.hasRenderToRenderbuffer():
        # Limited fallback mode, read from screen buffer
        log.message("Fallback render: grab screen")
        img = mh.grabScreen(0, 0, G.windowWidth, G.windowHeight)
        alphaImg = None
    else:
        # Render to framebuffer object
        renderprog = Progress()
        renderprog(0, 0.99 - 0.59 * settings['AA'], "Rendering")
        width, height = settings['dimensions']
        log.message("Rendering at %sx%s", width, height)
        if settings['AA']:
            width = width * 2
            height = height * 2
        img = mh.renderToBuffer(width, height)
        alphaImg = mh.renderAlphaMask(width, height)
        img = imgop.addAlpha(img, imgop.getChannel(alphaImg, 0))

        if settings['AA']:
            renderprog(0.4, 0.99, "AntiAliasing")
            # Resize to 50% using bi-linear filtering
            img = img.resized(width/2, height/2, filter=image.FILTER_BILINEAR)
            # TODO still haven't figured out where components get swapped, but this hack appears to be necessary
            img.data[:,:,:] = img.data[:,:,(2,1,0,3)]
        renderprog.finish()

    if settings['lightmapSSS']:
        progress(0.98, 0.99, "Restoring data")
        human.material = materialBackup

    progress(1, None, 'Rendering complete')

    gui3d.app.getCategory('Rendering').getTaskByName('Viewer').setImage(img)
    mh.changeTask('Rendering', 'Viewer')
    gui3d.app.statusPersist('Rendering complete')
Пример #9
0
                    else:
                        # Else, use the first provided definition-writer function
                        # if the texture exists, else the second
                        # (2nd and 3rd map tuple item respectively).
                        func = mapitem[(1 if self.__nonzero__() else 2)]

                return analyzeDef(func)


import image_operations as imgop

imgopfuncs = {
    'black':
    lambda img: imgop.getBlack(img) if img else None,
    'white':
    lambda img: imgop.getWhite(img) if img else None,
    'blur':
    lambda img, lev, ker: imgop.blurred(imgop.Image(data=img), lev, ker)
    if img else None,
    'compose':
    lambda l: imgop.compose(l),
    'getChannel':
    lambda t, c: imgop.getChannel(imgop.Image(data=t), c) if t else None,
    'getAlpha':
    lambda t: imgop.getAlpha(imgop.Image(data=t)) if t else None,
    'growMask':
    lambda t, p: imgop.growMask(imgop.Image(data=t), p) if t else None,
    'shrinkMask':
    lambda t, p: imgop.shrinkMask(imgop.Image(data=t), p) if t else None
}