Code Vonc

Instances Octane

Script COFFEE pour Cinéma 4D R11.5+.

Comment installer ?How to install ?
CommentairesComments


Version obsolète, voir la version Python


Générer la liste des instances pour Octane
Ouvrez le gestionnaire de scripts, créez un nouveau script (fichier > nouveau) puis copiez-collez-y le code ci-dessous.


Sélectionnez l'objet source ou une de ses instances puis lancer le script. Copiez-collez le texte généré dans le noeud « Scatter » d'Octane.


Attention, l'objet source doit être aux coordonnées globales (0 ; 0 ; 0).

N'oubliez pas d'exporter l'objet source dans un fichier obj à part à l'aide du bouton « Export OBJ/MTL only » de la fenêtre d'exportation vers Octane, puis de l'implémenter dans Octane avec un noeud « Mesh » relié au noeud « Scatter ».


Désactiver ensuite les instances pour ne pas les exporter en même temps que le reste de votre scène dans Octane.


Code inspiré de l'Xpresso créé par Bepeg4D.



var dlg;

generecode(obj, echelle) {
	var ret = "";
	var matrice = obj->GetMg();
	var p = matrice->GetV0();
	var x = matrice->GetV1();
	var y = matrice->GetV2();
	var z = matrice->GetV3();
	p *= echelle;
	//x *= echelle;
	//y *= echelle;
	//z *= echelle;
	p.z = -p.z;
	z = -z;
	x.z = -x.z;
	y.z = -y.z;
	z.z = -z.z;
	ret += tostring(x.x) + " " + tostring(y.x) + " " + tostring(z.x) + " " + tostring(p.x) + " ";
	ret += tostring(x.y) + " " + tostring(y.y) + " " + tostring(z.y) + " " + tostring(p.y) + " ";
	ret += tostring(x.z) + " " + tostring(y.z) + " " + tostring(z.z) + " " + tostring(p.z) + "\n";
	return ret;
}

objSuiv(obj) {
	if (!obj) return null;
	if (obj->GetDown()) return obj->GetDown();
	while (!obj->GetNext() && obj->GetUp()) obj = obj->GetUp();
	return obj->GetNext();
}

instancesoctane(doc, op, ref, echelle)
{
	var source;
	if (instanceof(op, InstanceObject)) source = op#INSTANCEOBJECT_LINK;
	else source = op;
	if (!source) return "Veuillez sélectionner un objet.";
	
	var obj = doc->GetFirstObject();
	if (!obj) return;
	
	var code = "";
	var n = 0;
	
	if (ref) {
		code += generecode(source, echelle);
	}
	
	while (obj) {
		if (instanceof(obj, InstanceObject)) {
			if (obj#INSTANCEOBJECT_LINK == source) {
				n++;
				code += generecode(obj, echelle);
			}
		}
		obj = objSuiv(obj);
	}

	if (code == "") return "Aucun clone trouvé.";

	return code;
}

class Menu:GeModalDialog {
			public:
			CreateLayout();
			Command(id, msg); 
			Init();
}

Menu::Init() 
{
	SetCheckbox(1000, 0);
	SetFloat(1003, 0.01, 0.000001, 9999999999, 0.01);
	SetString(1001, "");
	var doc = GetActiveDocument();
	var op = doc->GetActiveObject();
	var code = instancesoctane(doc, op, 0, 0.01);
	SetString(1001 , code);
	var nom = "";
	if (instanceof(op, InstanceObject)) nom = op#INSTANCEOBJECT_LINK->GetName();
	else nom = op->GetName();
	SetString(1005, nom);
}

Menu::CreateLayout()
{
	SetTitle("Octane Instances");
	AddGroupBeginV(10, BFH_SCALEFIT, 1, "Groupe", 0);
	{
		AddStaticText(1005, BFH_SCALEFIT, 0, 0, "", 2);
		AddGroupBeginV(10, BFH_SCALEFIT, 2, "", 0);
		{
			AddStaticText(1004, BFH_CENTER, 0, 0, "Échele :", 0);
			AddEditNumberArrows(1003, BFH_SCALEFIT, 0, 0);
			AddGroupEnd();
		}
		AddCheckbox(1000, BFH_SCALEFIT, 0, 0, "Inclure référence");
		AddMultiLineEditText(1001 , BFH_SCALEFIT , 0 , 70 , 0);
		AddGroupEnd();
	}
	AddButton(1002, BFH_SCALEFIT, 200, 20, "Exécuter");
	return TRUE;
}

Menu::Command(id,msg) 
{
	if (id == 1002)
	{
		var doc = GetActiveDocument();
		var op = doc->GetActiveObject();
		var code = instancesoctane(doc, op, GetInt(1000), GetFloat(1003));
		SetString(1001 , code);
	}
}

main(doc, op) {
	dlg = new(Menu);
	dlg->Open(-1, -1);
}