Everything related to SDK.
User avatar
By seghier
#395244
i tried to make the script " run_maxwell_render " executable
how i can let the script know the scene opened ?
i tried but errors :
TypeError: arguments did not match any overloaded call:
QWidget.render(QPaintDevice, QPoint targetOffset=QPoint(), QRegion sourceRegion=QRegion(), QWidget.RenderFlags flags=QWidget.DrawWindowBackground|QWidget.DrawChildren): not enough arguments
QWidget.render(QPainter, QPoint targetOffset=QPoint(), QRegion sourceRegion=QRegion(), QWidget.RenderFlags flags=QWidget.DrawWindowBackground|QWidget.DrawChildren): not enough arguments
the script
Code: Select all
################################################################
# Launch Maxwell Render with the given parameters.
################################################################
import sys
from PyQt4 import QtGui,QtCore
from pymaxwell import *
import pymaxwell as mw

class RenderScene(QtGui.QWidget):
    # RenderScene init method
    def __init__(self):
        super(RenderScene, self).__init__()
        self.initUI()

    # User interface initialization method
    def initUI(self):

        # Create labels
        label_input_file = QtGui.QLabel('Input mxs')
        label_output_file = QtGui.QLabel('Output mxs')

        # Create lineedits
        self.edit_input_file = QtGui.QLineEdit()
        self.edit_output_file = QtGui.QLineEdit()

        # Create buttons
        button_in_path = QtGui.QPushButton('Open', self);
        button_out_path = QtGui.QPushButton('Save', self);
        button_ren = QtGui.QPushButton('Render', self);

        button_in_path.setGeometry(10, 10, 60, 35);
        button_out_path.setGeometry(10, 10, 60, 35);
        button_ren.setGeometry(10, 10, 60, 35);

        # Create grid layout
        grid = QtGui.QGridLayout()
        grid.setSpacing(10)

        # Populate grid with the labels, lineedits and buttons
        grid.addWidget(label_input_file, 1, 0)
        grid.addWidget(self.edit_input_file, 1, 1)
        grid.addWidget(button_in_path, 1, 2)

        grid.addWidget(label_output_file, 2, 0)
        grid.addWidget(self.edit_output_file, 2, 1)
        grid.addWidget(button_out_path, 2, 2)

        grid.addWidget(button_ren, 7, 0)

        # Set main layout with grid above and resize window
        self.setLayout(grid)
        self.resize(600, 180)
        self.setWindowTitle('Render Scene')

        # Connect buttons to methods to be called
        self.connect(button_in_path, QtCore.SIGNAL('clicked()'), self.open);
        self.connect(button_out_path, QtCore.SIGNAL('clicked()'), self.save);
        self.connect(button_ren, QtCore.SIGNAL('clicked()'), self.render);

    # open scene
    def open(self):
        filename1 = QtGui.QFileDialog.getOpenFileName(self, 'Open file', 'C:/', filter='*.mxs');
        self.edit_input_file.setText(filename1);

    # save scene
    def save(self):
        filename2 = QtGui.QFileDialog.getSaveFileName(self, 'saveFlle', 'C:/', filter='Image file (*.png *.jpg *.exr)');
        self.edit_output_file.setText(filename2);

    # render
    def run(self):
        scene = mw.Cmaxwell(mw.mwcallback);
        ok = scene.readMXS(self.edit_mxs.text().toAscii().data());

    parameters = []

    parameters.append('-mxs:' + 'filename1');
    parameters.append('-o:' + 'filename2' + '/sphere-render.png');
    # parameters.append('-mxi:'+outFolder+'/sphere-render.mxi');
    parameters.append('-res:300x200');
    parameters.append('-time:10');
    parameters.append('-sl:5');
    parameters.append('-nowait');

    runMaxwell(parameters);

if __name__ == "__main__":
	# Create and show application
	app = QtGui.QApplication(sys.argv)
	window = RenderScene()
	window.show()
	sys.exit(app.exec_())
User avatar
By seghier
#395245
i tried to fix it but the same error
something wrong with the render button and its code
Code: Select all
################################################################
# Launch Maxwell Render with the given parameters.
################################################################
import sys
from PyQt4 import QtGui,QtCore
from pymaxwell import *
import pymaxwell as mw

class RenderScene(QtGui.QWidget):
    # RenderScene init method
    def __init__(self):
        super(RenderScene, self).__init__()
        self.initUI()

    # User interface initialization method
    def initUI(self):

        # Create labels
        label_input_file = QtGui.QLabel('Input mxs')
        label_output_file = QtGui.QLabel('Output mxs')

        # Create lineedits
        self.edit_input_file = QtGui.QLineEdit()
        self.edit_output_file = QtGui.QLineEdit()

        # Create buttons
        button_in_path = QtGui.QPushButton('Open', self);
        button_out_path = QtGui.QPushButton('Save', self);
        button_ren = QtGui.QPushButton('Render', self);

        button_in_path.setGeometry(10, 10, 60, 35);
        button_out_path.setGeometry(10, 10, 60, 35);
        button_ren.setGeometry(10, 10, 60, 35);

        # Create grid layout
        grid = QtGui.QGridLayout()
        grid.setSpacing(10)

        # Populate grid with the labels, lineedits and buttons
        grid.addWidget(label_input_file, 1, 0)
        grid.addWidget(self.edit_input_file, 1, 1)
        grid.addWidget(button_in_path, 1, 2)

        grid.addWidget(label_output_file, 2, 0)
        grid.addWidget(self.edit_output_file, 2, 1)
        grid.addWidget(button_out_path, 2, 2)

        grid.addWidget(button_ren, 7, 0)

        # Set main layout with grid above and resize window
        self.setLayout(grid)
        self.resize(600, 180)
        self.setWindowTitle('Render Scene')

        # Connect buttons to methods to be called
        self.connect(button_in_path, QtCore.SIGNAL('clicked()'), self.open);
        self.connect(button_out_path, QtCore.SIGNAL('clicked()'), self.save);
        self.connect(button_ren, QtCore.SIGNAL('clicked()'), self.render);

    # open scene
    def open(self):
        filename1 = QtGui.QFileDialog.getOpenFileName(self, 'Open file', 'C:/', filter='*.mxs');
        self.edit_input_file.setText(filename1);
        print(filename1)

    # save scene
    def save(self):
        filename2 = QtGui.QFileDialog.getSaveFileName(self, 'saveFlle', 'C:/', filter='Image file (*.png *.jpg *.exr)');
        self.edit_output_file.setText(filename2);
        print(filename2)

    # render
    def ren(self):
        scene = mw.Cmaxwell(mw.mwcallback);
        ok = scene.readMXS(self.edit_mxs.text().toAscii().data());

    def run_maxwell_render():
        
        parameters = []

        parameters.append('-mxs:'+'filename1');
        parameters.append('-o:'+'filename2');
        # parameters.append('-mxi:'+outFolder+'/sphere-render.mxi');
        parameters.append('-res:300x200');
        parameters.append('-time:10');
        parameters.append('-sl:5');
        parameters.append('-nowait');

        runMaxwell(parameters);
        return 1;

    if __name__ == "__main__":
        run_maxwell_render()

if __name__ == "__main__":
	# Create and show application
	app = QtGui.QApplication(sys.argv)
	window = RenderScene()
	window.show()
	sys.exit(app.exec_())
User avatar
By seghier
#395246
i modify the code but the same error:
TypeError: arguments did not match any overloaded call:
QWidget.render(QPaintDevice, QPoint targetOffset=QPoint(), QRegion sourceRegion=QRegion(), QWidget.RenderFlags flags=QWidget.DrawWindowBackground|QWidget.DrawChildren): not enough arguments
QWidget.render(QPainter, QPoint targetOffset=QPoint(), QRegion sourceRegion=QRegion(), QWidget.RenderFlags flags=QWidget.DrawWindowBackground|QWidget.DrawChildren): not enough arguments

Code: Select all
################################################################
# Launch Maxwell Render with the given parameters.
################################################################
import sys
from pymaxwell import *
import sys
import pymaxwell as mw
import qdarkstyle

from PyQt4 import QtGui, QtCore

class RenderScene(QtGui.QWidget):
    # RenderScene init method
    def __init__(self):
        super(RenderScene, self).__init__()
        self.initUI()

    # User interface initialization method
    def initUI(self):

        # Create labels
        label_input_file = QtGui.QLabel('Input mxs')
        label_output_file = QtGui.QLabel('Output mxs')

        # Create lineedits
        self.edit_input_file = QtGui.QLineEdit()
        self.edit_output_file = QtGui.QLineEdit()

        # Create buttons
        button_in_path = QtGui.QPushButton('Open', self);
        button_out_path = QtGui.QPushButton('Save', self);
        button_rend = QtGui.QPushButton('Render', self);

        button_in_path.setGeometry(10, 10, 60, 35);
        button_out_path.setGeometry(10, 10, 60, 35);
        button_rend.setGeometry(10, 10, 60, 35);

        # Create grid layout
        grid = QtGui.QGridLayout()
        grid.setSpacing(10)

        # Populate grid with the labels, lineedits and buttons
        grid.addWidget(label_input_file, 1, 0)
        grid.addWidget(self.edit_input_file, 1, 1)
        grid.addWidget(button_in_path, 1, 2)

        grid.addWidget(label_output_file, 2, 0)
        grid.addWidget(self.edit_output_file, 2, 1)
        grid.addWidget(button_out_path, 2, 2)

        grid.addWidget(button_rend, 7, 0)

        # Set main layout with grid above and resize window
        self.setLayout(grid)
        self.resize(600, 180)
        self.setWindowTitle('Render Scene')

        # Connect buttons to methods to be called
        self.connect(button_in_path, QtCore.SIGNAL('clicked()'), self.open);
        self.connect(button_out_path, QtCore.SIGNAL('clicked()'), self.save);
        self.connect(button_rend, QtCore.SIGNAL('clicked()'), self.render);

    # open scene
    def open(self):
        inPath = QtGui.QFileDialog.getOpenFileName(self, 'Open file', 'C:/', filter='*.mxs');
        self.edit_input_file.setText(inPath);
        input = inPath
        print(input)

    # save scene
    def save(self):
        outfile = QtGui.QFileDialog.getSaveFileName(self, 'saveFlle', 'C:/', filter='Image file (*.png *.jpg *.exr)');
        self.edit_output_file.setText(outfile);
        print(outfile)

    # render
    def rend(self):
        scene = mw.Cmaxwell(mw.mwcallback);
        ok = scene.readMXS('inPath')
        cameraNames = scene.getCameraNames()
        for name in cameraNames:
          outPath = 'inPath'+'/'+'new.mxs'
          print(outPath)
          ok = scene.writeMXS(outPath);
          camera = scene.getCamera(name)
          camera.setActive()
 
          parameters = []
          parameters.append('-mxs:'+outPath);
          parameters.append('-nowait');
          parameters.append('-nogui');
          parameters.append('-res:300x200');
          parameters.append('-s:6');
          parameters.append('-o:'+outfile+'/m_%camera%.png');
          parameters.append('-mxi:'+outfile+'/m_%camera%.mxi');
          parameters.append('-res:300x200');
          parameters.append('-time:10');
          runMaxwell(parameters)


if __name__ == "__main__":
    # Create and show application
    app = QtGui.QApplication(sys.argv)
    #app.setWindowIcon(QtGui.QIcon('C:/Users/archi/Desktop/script.ico'))
    window = RenderScene()
    app.setStyleSheet(qdarkstyle.load_stylesheet(pyside=False))
    window.show()
    sys.exit(app.exec_())
User avatar
By seghier
#395249
in this code i can render the scene but i put paths manually
Code: Select all
################################################################
# Launch Maxwell Render with the given parameters.
################################################################
import sys
from pymaxwell import *
import sys
import pymaxwell as mw
import qdarkstyle

from PyQt4 import QtGui, QtCore

class RenderScene(QtGui.QWidget):

    # RenderScene init method
    def __init__(self):
        super(RenderScene, self).__init__()
        self.initUI()

    # User interface initialization method
    def initUI(self):
        
        # render
        def rendering(event=None):
            print 'Button clicked: event:', event
            scene = mw.Cmaxwell(mw.mwcallback);
            ok = scene.readMXS('C:/input/maison.mxs')
            cameraNames = scene.getCameraNames()
            for name in cameraNames:
                outPath = 'C:/input' + '/' + 'new.mxs'
                print(outPath)
                ok = scene.writeMXS(outPath);
                camera = scene.getCamera(name)
                camera.setActive()

                parameters = []
                parameters.append('-mxs:' + outPath);
                parameters.append('-nowait');
                parameters.append('-nogui');
                parameters.append('-res:300x200');
                parameters.append('-s:6');
                parameters.append('-o:' + 'C:/output' + '/m_%camera%.png');
                parameters.append('-mxi:' + 'C:/output' + '/m_%camera%.mxi');
                parameters.append('-res:300x200');
                parameters.append('-time:10');
                runMaxwell(parameters)

        # Create labels
        label_input_file = QtGui.QLabel('Input mxs')
        label_output_file = QtGui.QLabel('Output Render')

        # Create lineedits
        self.edit_input_file = QtGui.QLineEdit()
        self.edit_output_file = QtGui.QLineEdit()

        # Create buttons
        button_in_path = QtGui.QPushButton('Open', self);
        button_out_path = QtGui.QPushButton('Save', self);
        button_rend = QtGui.QPushButton('Render', self);
        button_rend.clicked.connect(rendering)

        button_in_path.setGeometry(10, 10, 60, 35);
        button_out_path.setGeometry(10, 10, 60, 35);
        button_rend.setGeometry(10, 10, 60, 35);

        # Create grid layout
        grid = QtGui.QGridLayout()
        grid.setSpacing(10)

        # Populate grid with the labels, lineedits and buttons
        grid.addWidget(label_input_file, 1, 0)
        grid.addWidget(self.edit_input_file, 1, 1)
        grid.addWidget(button_in_path, 1, 2)

        grid.addWidget(label_output_file, 2, 0)
        grid.addWidget(self.edit_output_file, 2, 1)
        grid.addWidget(button_out_path, 2, 2)

        grid.addWidget(button_rend, 7, 0)

        # Set main layout with grid above and resize window
        self.setLayout(grid)
        self.resize(600, 180)
        self.setWindowTitle('Render Scene')

        # Connect buttons to methods to be called
        self.connect(button_in_path, QtCore.SIGNAL('clicked()'), self.open);
        self.connect(button_out_path, QtCore.SIGNAL('clicked()'), self.save);
        self.connect(button_rend, QtCore.SIGNAL('clicked()'), self.render);

    # open scene
    def open(self):
        inPath = QtGui.QFileDialog.getOpenFileName(self, 'Open file', 'C:/', filter='*.mxs');
        self.edit_input_file.setText(inPath);
        input = inPath
        print(input)

    # save scene
    def save(self):
        outfile = QtGui.QFileDialog.getSaveFileName(self, 'saveFlle', 'C:/', filter='Image file (*.png *.jpg *.exr)');
        self.edit_output_file.setText(outfile);
        print(outfile)



if __name__ == "__main__":
    # Create and show application
    app = QtGui.QApplication(sys.argv)
    #app.setWindowIcon(QtGui.QIcon('C:/Users/archi/Desktop/script.ico'))
    window = RenderScene()
    app.setStyleSheet(qdarkstyle.load_stylesheet(pyside=False))
    window.show()
    sys.exit(app.exec_())
User avatar
By Brany
#395251
I see a bug in your code:
Code: Select all
        self.connect(button_rend, QtCore.SIGNAL('clicked()'), self.render);
"render" is a method of QWidget, I guess you want to call "rend" (or "rendering" in your late post) instead when you clic "button_rend"
User avatar
By seghier
#395252
thanks Brany
i finished it just now and it work very nice
just one problem ; the scene have 4 cameras one of them called 3D ; this script detect the 4 cameras but render 3 cameras and the last camera (3D) no
Code: Select all
################################################################
# Launch Maxwell Render with the given parameters.
################################################################
import sys
from pymaxwell import *
import sys
import pymaxwell as mw
import qdarkstyle

from PyQt4 import QtGui, QtCore

class RenderScene(QtGui.QWidget):

    # RenderScene init method
    def __init__(self):
        super(RenderScene, self).__init__()
        self.initUI()

    # User interface initialization method
    def initUI(self):

        # Create labels
        label_input_file = QtGui.QLabel('Input mxs')
        label_output_file = QtGui.QLabel('Output Render')

        # Create lineedits
        self.edit_input_file = QtGui.QLineEdit()
        self.edit_output_file = QtGui.QLineEdit()

        # Create buttons
        button_in_path = QtGui.QPushButton('Open', self);
        button_out_path = QtGui.QPushButton('Save', self);
        button_rend = QtGui.QPushButton('Render', self);
        #button_rend.clicked.connect(rendering)

        button_in_path.setGeometry(10, 10, 60, 35);
        button_out_path.setGeometry(10, 10, 60, 35);
        button_rend.setGeometry(10, 10, 60, 35);

        # Create grid layout
        grid = QtGui.QGridLayout()
        grid.setSpacing(10)

        # Populate grid with the labels, lineedits and buttons
        grid.addWidget(label_input_file, 1, 0)
        grid.addWidget(self.edit_input_file, 1, 1)
        grid.addWidget(button_in_path, 1, 2)

        grid.addWidget(label_output_file, 2, 0)
        grid.addWidget(self.edit_output_file, 2, 1)
        grid.addWidget(button_out_path, 2, 2)

        grid.addWidget(button_rend, 7, 0)

        # Set main layout with grid above and resize window
        self.setLayout(grid)
        self.resize(600, 180)
        self.setWindowTitle('Render Scene Views')

        # Connect buttons to methods to be called
        self.connect(button_in_path, QtCore.SIGNAL('clicked()'), self.open);
        self.connect(button_out_path, QtCore.SIGNAL('clicked()'), self.save);
        self.connect(button_rend, QtCore.SIGNAL('clicked()'), self.rendering);

    # open scene
    def open(self):
        inPath = QtGui.QFileDialog.getOpenFileName(self, 'Open file', 'C:/', filter='*.mxs');
        self.edit_input_file.setText(inPath);
        print self.edit_input_file.text()

    # save scene
    def save(self):
        outfile = QtGui.QFileDialog.getExistingDirectory(self, 'saveFlle', 'C:/');
        self.edit_output_file.setText(outfile);
        print(outfile)


    # render
    def rendering(self):
        scene = mw.Cmaxwell(mw.mwcallback);
        ok = scene.readMXS(self.edit_input_file.text().toAscii().data());
        cameraNames = scene.getCameraNames();
        for name in cameraNames:
            outPath = self.edit_input_file.text().toAscii().data()
            print (cameraNames)
            ok = scene.writeMXS(outPath);
            camera = scene.getCamera(name)
            camera.setActive()
            output = self.edit_output_file.text().toAscii().data()

            parameters = []
            parameters.append('-mxs:' + outPath);
            parameters.append('-nowait');
            parameters.append('-nogui');
            parameters.append('-res:300x200');
            parameters.append('-s:6');
            parameters.append('-o:' + output + '/m_%camera%.png');
            parameters.append('-mxi:' + output + '/m_%camera%.mxi');
            parameters.append('-res:300x200');
            parameters.append('-time:10');
            runMaxwell(parameters)


if __name__ == "__main__":
    # Create and show application
    app = QtGui.QApplication(sys.argv)
    app.setWindowIcon(QtGui.QIcon('C:/Users/archi/Desktop/script.ico'))
    window = RenderScene()
    app.setStyleSheet(qdarkstyle.load_stylesheet(pyside=False))
    window.show()
    sys.exit(app.exec_())
User avatar
By Brany
#395254
I found the problem:
Code: Select all
        for name in cameraNames:
            outPath = self.edit_input_file.text().toAscii().data()
            print (cameraNames)
            ok = scene.writeMXS(outPath);
            camera = scene.getCamera(name)
            camera.setActive()
You are writting the MXS before setting the active camera, so it can miss one of them. You must set the active camera you want, and then save the MXS:
Code: Select all
        for name in cameraNames:
            outPath = self.edit_input_file.text().toAscii().data()
            print (cameraNames)
            camera = scene.getCamera(name)
            camera.setActive()
            ok = scene.writeMXS(outPath)
User avatar
By seghier
#395258
it finished thanks for excellent help Brany

Image
Code: Select all
################################################################
# Launch Maxwell Render with the given parameters.
################################################################
import sys
from pymaxwell import *
import sys
import pymaxwell as mw
import qdarkstyle

from PyQt4 import QtGui, QtCore

class RenderScene(QtGui.QWidget):

    # RenderScene init method
    def __init__(self):
        super(RenderScene, self).__init__()
        self.initUI()

    # User interface initialization method
    def initUI(self):

        # Create labels
        label_input_file = QtGui.QLabel('Input mxs')
        label_mxi_file = QtGui.QLabel('Output Mxi')
        label_img_file = QtGui.QLabel('Output Img')

        # Create lineedits
        self.edit_input_file = QtGui.QLineEdit()
        self.edit_mxi_file = QtGui.QLineEdit()
        self.edit_img_file = QtGui.QLineEdit()

        # Create buttons
        button_in_path = QtGui.QPushButton('Open', self);
        button_mxi_path = QtGui.QPushButton('Save', self);
        button_img_path = QtGui.QPushButton('Save', self);
        button_rend = QtGui.QPushButton('Render', self);


        button_in_path.setGeometry(10, 10, 60, 35);
        button_mxi_path.setGeometry(10, 10, 60, 35);
        button_img_path.setGeometry(10, 10, 60, 35);
        button_rend.setGeometry(10, 10, 60, 35);

        # Create grid layout
        grid = QtGui.QGridLayout()
        grid.setSpacing(10)

        # Populate grid with the labels, lineedits and buttons
        grid.addWidget(label_input_file, 1, 0)
        grid.addWidget(self.edit_input_file, 1, 1)
        grid.addWidget(button_in_path, 1, 2)

        grid.addWidget(label_mxi_file, 2, 0)
        grid.addWidget(self.edit_mxi_file, 2, 1)
        grid.addWidget(button_mxi_path, 2, 2)

        grid.addWidget(label_img_file, 3, 0)
        grid.addWidget(self.edit_img_file, 3, 1)
        grid.addWidget(button_img_path, 3, 2)

        grid.addWidget(button_rend, 7, 0)

        # Set main layout with grid above and resize window
        self.setLayout(grid)
        self.setFixedSize(600, 180)
        self.setWindowTitle('Render Scene Views')

        # Connect buttons to methods to be called
        self.connect(button_in_path, QtCore.SIGNAL('clicked()'), self.open);
        self.connect(button_mxi_path, QtCore.SIGNAL('clicked()'), self.save1);
        self.connect(button_img_path, QtCore.SIGNAL('clicked()'), self.save2);
        self.connect(button_rend, QtCore.SIGNAL('clicked()'), self.rendering);

    # open scene
    def open(self):
        inPath = QtGui.QFileDialog.getOpenFileName(self, 'Open file', 'C:/', filter='*.mxs');
        self.edit_input_file.setText(inPath);

    # save scene
    def save1(self):
        outmxi = QtGui.QFileDialog.getSaveFileName(self, 'saveFlle', 'C:/', filter='Image file (*.mxi)');
        self.edit_mxi_file.setText(outmxi);

    # save scene
    def save2(self):
        outimg = QtGui.QFileDialog.getSaveFileName(self, 'saveFlle', 'C:/', filter='Image file (*.png *.jpg *.tga *.tif *.jp2 *.hdr *.exr *.bmp *.psd *.ppm *.pbm *.pgm)');
        self.edit_img_file.setText(outimg);


    # render
    def rendering(self):
        scene = mw.Cmaxwell(mw.mwcallback);
        ok = scene.readMXS(self.edit_input_file.text().toAscii().data());
        cameraNames = scene.getCameraNames();
        for name in cameraNames:
            outPath = self.edit_input_file.text().toAscii().data()
            outMxi = self.edit_mxi_file.text().toAscii().data()
            outImg = self.edit_img_file.text().toAscii().data()
            camera = scene.getCamera(name)
            camera.setActive()
            ok = scene.writeMXS(outPath)

            parameters = []
            parameters.append('-mxs:' + outPath);
            parameters.append('-nowait');
            parameters.append('-nogui');
            parameters.append('-res:300x200');
            parameters.append('-s:6');
            parameters.append('-o:' + outImg);
            parameters.append('-mxi:' + outMxi);
            parameters.append('-res:300x200');
            parameters.append('-time:10');
            runMaxwell(parameters)


if __name__ == "__main__":
    # Create and show application
    app = QtGui.QApplication(sys.argv)
    app.setWindowIcon(QtGui.QIcon('C:/Users/archi/Desktop/script.ico'))
    window = RenderScene()
    app.setStyleSheet(qdarkstyle.load_stylesheet(pyside=False))
    window.show()
    sys.exit(app.exec_())
New podcast - CG Talks

Hi guys! We've just finished the first season of […]

Thanks, Luis, appreciated. It looks like industria[…]

That looks like a low bpc (bits per channel) norma[…]

Fully working plugin for C4D

When you will be working on it please try to keep […]