Code Vonc

Matière Python

v 1.3

R13+ OSX Win

TéléchargerDownload
Faire un donMake a donation
Comment installer ?How to install ?
CommentairesComments

Matière paramétrable via un champ de code Python.Parametric shader with Python code.




v 1.3 :
- Si vous aviez une version précédente, supprimez le dossier « vonc_matformule » du dossier plugins du répertoire de Cinéma 4D avant d'installer cette mise à jour.
- Ajout du module Random.
- Ajout de nouvelles variables (vecteur xyz et rvb).
- Possibilité de désactiver l'aperçu.
- Ajout d'un champ d'aide indiquant les variables utiles.
- Traduction anglaise.
- Traduction Tchèque par Lubo Bezek.

v 1.2 :
- Ajout de la variable InitRenderStruct (irs).

v 1.3 :
- If you have a previous version, delete the folder « vonc_matformule » from the plugins folder of Cinema 4D before install this update.
- Add Random module.
- Add new variables (vector xyz and rvb).
- Allow to disable the preview.
- Add a help field for the possible variables.
- English translation.
- Czech translation by Lubo Bezek.

v 1.2 :
- Add variable InitRenderStruct (irs).




Les trois variables r, v, b, ou le vecteur rvb sont à définir. Elles représentent la couleur du pixel calculé ((1,0,0) pour du rouge, par exemple).The 3 variables r, v, b, of the rvb vector are to set. They represent the pixel color ((1,0,0) for red, for example).

Le code personnalisé s'incruste dans la fonction Output de la classe c4d.plugins.ShaderData.
Les variables sh (BaseShader) et cd (ChannelData) peuvent donc être utilisées dans votre code.


Variables à lire :

- sh : BaseShader.
- cd : ChannelData.
- irs : InitRenderStruct.
- x, y, z, ou le vecteur xyz : renvoient les coordonnées du point calculé.
- src : renvoie la valeur du champ Source.


Variables à définir :

- r, v, b, ou le vecteur rvb : renvoient la couleur.

Custom code embeds itself in the Output method according to the c4d.plugins.ShaderData class.
Variables sh (BaseShader) and cd (ChannelData) can be used in your code.


Variables to read :

- sh : BaseShader.
- cd : ChannelData.
- irs : InitRenderStruct.
- x, y, z, or xyz vector : return the point coordinates calculated.
- src : return the Source field value.


Variables to set :

- r, v, b, or rvb vector : return the color.





ExemplesExamples



TéléchargerDownload





Exemples de codeCode examples


TéléchargerDownload

r = 0
v = 0.5
b = 1
rvb = Vector(1, 0, 0.5)
if cd.vd :
    rvb = cd.vd.n
rvb = cd.p
m = cos(x + cos(y) + cos(x) + cos(z))
r = v = b = abs(0-(m*3))
if (x % 20 < 10) :
    r = 1
if cd.vd :
    r = v = b = 1 - cd.vd.cosc
x = cos(y)*random.randint(0,4) + x + z + cos(z%100+cos(y)+x*.3)*1.5
r = v = b = random.randint(0,int(abs(x*.5)))
if cd.vd :
    a = cos(cd.vd.cosc * cd.vd.cosc * y)
    r = v = b = a
spline = sh[c4d.ID_USERDATA,1]
rvb = spline.GetPoint(x)
rvb.z = 0.3
n = Noise(xyz, (src + cos(x) + cos(y) + cos(z)) * 10)
r = v = b = n


Codes sourcesSources code

matformule.pyp

# Matière Formule v 1.3 - César Vonc - http://code.vonc.fr/

import os
import math
import random
import c4d
from c4d import plugins, Vector, utils
from c4d.utils.noise import Noise
from math import *

MODULE_ID = 1028230

MATFORMULE_DEFCODE = 1000
MATFORMULE_NOM = 1001

MATFORMULE_SOURCE = 1000
MATFORMULE_ECHELLE = 1001
MATFORMULE_CONTR = 1002
MATFORMULE_ECHXYZ = 1003
MATFORMULE_COL1 = 1004
MATFORMULE_COL2 = 1005
MATFORMULE_LUM = 1006
MATFORMULE_CODE = 1007
MATFORMULE_COL3 = 1008
MATFORMULE_ACT = 1009
MATFORMULE_MODE = 1010
MATFORMULE_MODE_UV = 0
MATFORMULE_MODE_TEX = 3
MATFORMULE_MODE_OBJ = 2
MATFORMULE_MODE_GLO = 1
MATFORMULE_MODE_CAM = 4
MATFORMULE_MODE_ECR = 5
MATFORMULE_MIN = 1011
MATFORMULE_MAX = 1012
MATFORMULE_INFO = 1013
MATFORMULE_PROF = 1014
MATFORMULE_PROF_SANS = 0
MATFORMULE_PROF_LIN_SRGB = 1
MATFORMULE_PROF_SRGB_LIN = 2
MATFORMULE_PROF_LIN_AFF = 3
MATFORMULE_PROF_SRGB_AFF = 4
MATFORMULE_APE = 1015
MATFORMULE_INTROG = 1016
MATFORMULE_INTRO = 1017

class MatFormule(plugins.ShaderData):
	def __init__(self) :
		self.src = 0.0
		self.ech = 1.0
		self.echxyz = Vector(1.0)
		self.contra = 0.0
		self.lumi = 0.0
		self.cola = Vector(0)
		self.colb = Vector(1.0)
		self.col_ = True
		self.con_ = True
		self.colc = Vector(1.0, 0.0, 0.0)
		self.intro = ('#import os\n#import math\n#import random\n#import c4d\n#from c4d import plugins, Vector, utils\n#from c4d.utils.noise import Noise\n#from math import *\n' + 
						plugins.GeLoadString(MATFORMULE_DEFCODE).replace('#', '\n#'))
		self.codetxt = 'n = Noise(xyz, (src+cos(x)+cos(y)+cos(z))*10)\nr = v = b = n'
		self.code = compile(self.codetxt, '<string>', 'exec')
		self.mode = 1
		self.min = True
		self.max = False
		self.prof = 2
		self.irs = None
		self.ape = True
	
	def Init(self, node):
		donnees = node.GetDataInstance()
		donnees.SetReal(MATFORMULE_SOURCE, self.src)
		donnees.SetReal(MATFORMULE_ECHELLE, self.ech)
		donnees.SetVector(MATFORMULE_ECHXYZ, self.echxyz)
		donnees.SetReal(MATFORMULE_CONTR, self.contra)
		donnees.SetReal(MATFORMULE_LUM, self.lumi)
		donnees.SetVector(MATFORMULE_COL1, self.cola)
		donnees.SetVector(MATFORMULE_COL2, self.colb)
		donnees.SetString(MATFORMULE_CODE, self.codetxt)
		donnees.SetVector(MATFORMULE_COL3, self.colc)
		donnees.SetLong(MATFORMULE_MODE, self.mode)
		donnees.SetBool(MATFORMULE_MIN, self.min)
		donnees.SetBool(MATFORMULE_MAX, self.max)
		donnees.SetLong(MATFORMULE_PROF, self.prof)
		donnees.SetBool(MATFORMULE_APE, self.ape)
		donnees.SetString(MATFORMULE_INTRO, self.intro)
		return True
	
	def recup(self, sh):
		donnees = sh.GetDataInstance()
		donnees.SetString(MATFORMULE_INTRO, self.intro)
		self.src = donnees.GetReal(MATFORMULE_SOURCE)
		self.ech = donnees.GetReal(MATFORMULE_ECHELLE)
		self.echxyz = donnees.GetVector(MATFORMULE_ECHXYZ)
		self.contra = donnees.GetReal(MATFORMULE_CONTR)
		self.lumi = donnees.GetReal(MATFORMULE_LUM)
		if self.contra == 0 and self.lumi == 0:
			self.con_ = False
		else: self.con_ = True
		self.cola = donnees.GetVector(MATFORMULE_COL1)
		self.colb = donnees.GetVector(MATFORMULE_COL2)
		if self.colb == Vector(1.0) and self.cola == Vector():
			self.col_ = False
		else: self.col_ = True
		txt = donnees.GetString(MATFORMULE_CODE)
		self.colc = donnees.GetVector(MATFORMULE_COL3)
		self.SetExceptionColor(self.colc)
		self.codetxt = txt
		self.code = compile(txt, '<string>', 'exec')
		self.mode = donnees.GetLong(MATFORMULE_MODE)
		self.min = donnees.GetBool(MATFORMULE_MIN)
		self.max = donnees.GetBool(MATFORMULE_MAX)
		self.prof = donnees.GetLong(MATFORMULE_PROF)
		self.ape = donnees.GetBool(MATFORMULE_APE)
		random.seed(abs(self.src) + 1)
	
	def InitRender(self, sh, irs):
		self.recup(sh)
		self.irs = irs
		return 0
	
	def Output(self, sh, cd):
		__vec = Vector()
		
		if self.mode == MATFORMULE_MODE_GLO : # Espace Monde
			if cd.vd : # 3D
				__vec = cd.vd.p
			else : # Aperçu
				if self.ape : __vec = (cd.p - 0.5) * 100.0
				else : return __vec
		
		elif self.mode == MATFORMULE_MODE_UV : # Espace UV
			__vec = cd.p
		
		elif self.mode == MATFORMULE_MODE_OBJ : # Espace Objet
			if cd.vd : # 3D
				__vec = cd.vd.p
			else : # Aperçu
				if self.ape : __vec = (cd.p - 0.5) * 100.0
				else : return __vec
			
		__vec *= self.ech
		
		xyz = __vec.__rxor__(self.echxyz)
		x = xyz.x
		y = xyz.y
		z = xyz.z
		src = self.src
		rvb = None
		r = v = b = 0.0
		irs = self.irs
		
		exec self.code
		
		if (rvb is None) : __vec = Vector(r, v, b)
		else : __vec = rvb
		
		if self.col_ :
			dif = self.colb - self.cola
			__vec = __vec.__rxor__(dif) + self.cola
		if self.con_ :
			__vec = ((__vec-0.5) * (self.contra + 1.0)) + 0.5 + self.lumi
		if self.min :
			if __vec.x < 0 : __vec.x = 0.0
			if __vec.y < 0 : __vec.y = 0.0
			if __vec.z < 0 : __vec.z = 0.0
		if self.max :
			if __vec.x > 1 : __vec.x = 1.0
			if __vec.y > 1 : __vec.y = 1.0
			if __vec.z > 1 : __vec.z = 1.0
		__vec = utils.TransformColor(__vec, self.prof)
		return __vec
	
	def FreeRender(self, sh): # Libère la mémoire
		return

if __name__=='__main__':
	plugins.RegisterShaderPlugin(MODULE_ID, plugins.GeLoadString(MATFORMULE_NOM), 0, MatFormule, "matformule", 0)

res/c4d_symbols.h

enum
{
	MATFORMULE_DEFCODE	= 1000,
	MATFORMULE_NOM = 1001,
	// End of symbol definition
  _DUMMY_ELEMENT_
};

res/description/matformule.h

#ifndef _matformule_H_
#define _matformule_H_

enum
{
	MATFORMULE_SOURCE	= 1000,
	MATFORMULE_ECHELLE	= 1001,
	MATFORMULE_CONTR	= 1002,
	MATFORMULE_ECHXYZ	= 1003,
	MATFORMULE_COL1		= 1004,
	MATFORMULE_COL2		= 1005,
	MATFORMULE_LUM		= 1006,
	MATFORMULE_CODE		= 1007,
	MATFORMULE_COL3		= 1008,
	MATFORMULE_ACT		= 1009,
	MATFORMULE_MODE		= 1010,
		MATFORMULE_MODE_UV = 0,
		MATFORMULE_MODE_TEX = 3,
		MATFORMULE_MODE_OBJ = 2,
		MATFORMULE_MODE_GLO = 1,
		MATFORMULE_MODE_CAM = 4,
		MATFORMULE_MODE_ECR = 5,
	MATFORMULE_MIN		= 1011,
	MATFORMULE_MAX		= 1012,
	MATFORMULE_INFO		= 1013,
	MATFORMULE_PROF		= 1014,
		MATFORMULE_PROF_SANS = 0,
		MATFORMULE_PROF_LIN_SRGB = 1,
		MATFORMULE_PROF_SRGB_LIN = 2,
		MATFORMULE_PROF_LIN_AFF = 3,
		MATFORMULE_PROF_SRGB_AFF = 4,
	MATFORMULE_APE		= 1015,
	MATFORMULE_INTROG	= 1016,
	MATFORMULE_INTRO	= 1017
};

#endif

res/description/matformule.res

CONTAINER matformule
{
	INCLUDE Mpreview;
	INCLUDE Xbase;

	GROUP ID_SHADERPROPERTIES
	{
		SCALE_V;
		GROUP {
			SCALE_V;
			COLOR MATFORMULE_COL1 { }
			COLOR MATFORMULE_COL2 { }
			COLOR MATFORMULE_COL3 { }
			BOOL MATFORMULE_APE { }
			REAL MATFORMULE_SOURCE { }
			LONG MATFORMULE_MODE
			{
				CYCLE
				{
					MATFORMULE_MODE_UV;
					MATFORMULE_MODE_GLO;
				}
				FIT_H;
			}
			REAL MATFORMULE_ECHELLE { UNIT PERCENT; }
			VECTOR MATFORMULE_ECHXYZ { UNIT PERCENT; }
			REAL MATFORMULE_LUM { UNIT PERCENT; MINSLIDER -100.0; MAXSLIDER 100.0; CUSTOMGUI REALSLIDER; }
			REAL MATFORMULE_CONTR { UNIT PERCENT; MIN -100; MINSLIDER -100.0; MAXSLIDER 100.0; CUSTOMGUI REALSLIDER; }
			BOOL MATFORMULE_MIN { }
			BOOL MATFORMULE_MAX { }
			STRING MATFORMULE_CODE
			{
			  CUSTOMGUI MULTISTRING;
			  PYTHON;
			  SCALE_V;
			}
		}
		GROUP MATFORMULE_INTROG
		{
			DEFAULT 0;
			STRING MATFORMULE_INTRO { CUSTOMGUI MULTISTRING; SCALE_V; }
			SCALE_V;
		}
		GROUP {
			LONG MATFORMULE_PROF
			{
				CYCLE
				{
					MATFORMULE_PROF_SANS;
					MATFORMULE_PROF_LIN_SRGB;
					MATFORMULE_PROF_SRGB_LIN;
					MATFORMULE_PROF_LIN_AFF;
					MATFORMULE_PROF_SRGB_AFF;
				}
				FIT_H;
			}
			BUTTON MATFORMULE_ACT { }
			SEPARATOR { LINE; }
			STATICTEXT MATFORMULE_INFO { }
		}
	}
}

res/strings_cz/c4d_strings.str

STRINGTABLE 
{
  MATFORMULE_DEFCODE  "# -- Get --# sh : BaseShader# cd : ChannelData# irs : InitRenderStruct# x, y, z : Pozice bodu# xyz : Pozice bodu (vektor)# src : Zdroj## -- Set --# r, v, b : \u010Cerven\u00E1 (R), Zelen\u00E1 (G), Modr\u00E1 (B)# rvb : \u010Cerven\u00E1 (R), Zelen\u00E1 (G), Modr\u00E1 (B) (vektor)";
  MATFORMULE_NOM      "Vonc Python";
}

res/strings_cz/description/matformule.str

STRINGTABLE matformule
{
  MATFORMULE_SOURCE         "Zdroj";
  MATFORMULE_ECHELLE        "Glob\u00E1ln\u00ED velikost";
  MATFORMULE_CONTR          "Kontrast";
  MATFORMULE_ECHXYZ         "Relativn\u00ED velikost";
  MATFORMULE_COL1           "Barva Min ";
  MATFORMULE_COL2           "Barva Max ";
  MATFORMULE_LUM            "Jas";
  MATFORMULE_CODE           "Python k\u00F3d";
  MATFORMULE_COL3           "Barva chybov\u00E9ho k\u00F3du";
  MATFORMULE_ACT            "Obnovit";
  MATFORMULE_MODE           "Rozm\u011Br";
  MATFORMULE_MODE_UV        "UV (2D)";
  MATFORMULE_MODE_TEX       "Textura";
  MATFORMULE_MODE_OBJ       "Objekt";
  MATFORMULE_MODE_GLO       "Sv\u011Bt";
  MATFORMULE_MODE_CAM       "Kamera";
  MATFORMULE_MODE_ECR       "Obraz";
  MATFORMULE_MIN            "Min hodnota  : 0";
  MATFORMULE_MAX            "Max hodnota  : 1";
  MATFORMULE_INFO           "v 1.3 - code.vonc.fr";
  MATFORMULE_PROF           "
Spr\u00E1va profil\u016F";
  MATFORMULE_PROF_SANS      "\u017D\u00E1dn\u00FD";
  MATFORMULE_PROF_LIN_SRGB  "Line\u00E1rn\u00ED na sRGB";
  MATFORMULE_PROF_SRGB_LIN  "sRGB na Line\u00E1rn\u00ED";
  MATFORMULE_PROF_LIN_AFF   "Line\u00E1rn\u00ED na pohled";
  MATFORMULE_PROF_SRGB_AFF  "sRGB na pohled";
  MATFORMULE_APE            "N\u00E1hled";
  MATFORMULE_INTROG         "Pomoc";
  MATFORMULE_INTRO          "";
}

res/strings_fr/c4d_strings.str

STRINGTABLE
{
	MATFORMULE_DEFCODE		"# -- Lire --# sh : BaseShader# cd : ChannelData# irs : InitRenderStruct# x, y, z : Position du point calcul\u00E9# xyz : Position du point calcul\u00E9 (vecteur)# src : Source## -- D\u00E9finir --# r, v, b : Rouge, Vert, Bleu# rvb : Rouge, Vert, Bleu (vecteur)";
	MATFORMULE_NOM			"Vonc Python";
}

res/strings_fr/description/matformule.str

STRINGTABLE matformule
{
	MATFORMULE_SOURCE		"Source";
	MATFORMULE_ECHELLE		"\u00C9chelle globale";
	MATFORMULE_CONTR		"Contraste";
	MATFORMULE_ECHXYZ		"\u00C9chelle relative";
	MATFORMULE_COL1			"Couleur min";
	MATFORMULE_COL2			"Couleur max";
	MATFORMULE_LUM			"Luminosit\u00E9";
	MATFORMULE_CODE			"Code Python";
	MATFORMULE_COL3			"Couleur erreur";
	MATFORMULE_ACT			"Actualiser";
	MATFORMULE_MODE			"Espace";
		MATFORMULE_MODE_UV	"UV (2D)"; 
		MATFORMULE_MODE_TEX	"Texture";
		MATFORMULE_MODE_OBJ	"Objet";
		MATFORMULE_MODE_GLO	"Monde";
		MATFORMULE_MODE_CAM	"Cam\u00E9ra";
		MATFORMULE_MODE_ECR	"\u00C9cran";
	MATFORMULE_MIN			"Valeur min : 0";
	MATFORMULE_MAX			"Valeur max : 1";
	MATFORMULE_INFO			"v 1.3 - code.vonc.fr";
	MATFORMULE_PROF			"Gestion du profil";
	MATFORMULE_PROF_SANS	"Sans";
	MATFORMULE_PROF_LIN_SRGB	"Lin\u00E9aire vers sRVB";
	MATFORMULE_PROF_SRGB_LIN	"sRVB vers Lin\u00E9aire";
	MATFORMULE_PROF_LIN_AFF		"Lin\u00E9aire vers affichage";
	MATFORMULE_PROF_SRGB_AFF	"sRVB vers affichage";
	MATFORMULE_APE			"Aper\u00E7u";
	MATFORMULE_INTROG		"Aide";
	MATFORMULE_INTRO		"";
}

res/strings_us/c4d_strings.str

STRINGTABLE
{
	MATFORMULE_DEFCODE		"# -- Get --# sh : BaseShader# cd : ChannelData# irs : InitRenderStruct# x, y, z : Point position# xyz : Point position (vector)# src : Source## -- Set --# r, v, b : Red, Green, Blue# rvb : Red, Green, Blue (vector)";
	MATFORMULE_NOM			"Vonc Python";
}

res/strings_us/description/matformule.str

STRINGTABLE matformule
{
	MATFORMULE_SOURCE		"Source";
	MATFORMULE_ECHELLE		"Global scale";
	MATFORMULE_CONTR		"Contrast";
	MATFORMULE_ECHXYZ		"Relative scale";
	MATFORMULE_COL1			"Min color";
	MATFORMULE_COL2			"Max color";
	MATFORMULE_LUM			"Luminosity";
	MATFORMULE_CODE			"Python code";
	MATFORMULE_COL3			"Error color";
	MATFORMULE_ACT			"Refresh";
	MATFORMULE_MODE			"Space";
		MATFORMULE_MODE_UV	"UV (2D)"; 
		MATFORMULE_MODE_TEX	"Texture";
		MATFORMULE_MODE_OBJ	"Object";
		MATFORMULE_MODE_GLO	"World";
		MATFORMULE_MODE_CAM	"Camera";
		MATFORMULE_MODE_ECR	"Screen";
	MATFORMULE_MIN			"Min value : 0";
	MATFORMULE_MAX			"Max value : 1";
	MATFORMULE_INFO			"v 1.3 - code.vonc.fr";
	MATFORMULE_PROF			"Color management";
	MATFORMULE_PROF_SANS	"None";
	MATFORMULE_PROF_LIN_SRGB	"Linear to sRGB";
	MATFORMULE_PROF_SRGB_LIN	"sRGB to linear";
	MATFORMULE_PROF_LIN_AFF		"Linear to display";
	MATFORMULE_PROF_SRGB_AFF	"sRGB to display";
	MATFORMULE_APE			"Preview";
	MATFORMULE_INTROG		"Help";
	MATFORMULE_INTRO		"";
}