View Categories

Eklentiler

4 dakika okuma

Terminolojiye dair bir not #


  • Eklenti : “Eklenti” terimini çok sık kullanıyoruz. Teknik olarak bu, V-Ray için bir eklenti DLL’si (V-Ray’in kendisi de bir tür eklentidir) veya içinde tanımlanan tür anlamına gelebilir; bu, programlama anlamında bir sınıf veya son olarak bellekte bulunan ve bir sahne dosyasına kaydedilebilen bu sınıfın bir örneği olabilir. Biz burada “eklenti” terimini eklenti örneklerine atıfta bulunmak için kullanacağız.

  • Dışa aktarıcı/çevirici : Yerel sahne formatını V-Ray sahne formatına çeviren yazılıma, birbirinin yerine dışa aktarıcı veya çevirmen diyoruz. Temel olarak yaptığı şey, bir dizi V-Ray eklentisi oluşturmak ve parametrelerini ayarlamaktır. Ayrıca, sahneyi (zaten çevrilmiş olan) bir *.vrscene dosyasına kaydetme eylemine atıfta bulunmak için bazen “dışa aktarmak” fiilini de kullandığımızı unutmayın.

Genel Bakış #


Eklentiler, bir V-Ray sahnesinin temel yapı taşlarıdır. Her şey bir eklentidir – ışıklar, geometri, malzemeler ve ayarlar.

V-Ray sahnesini oluşturan eklentileri gayri resmi olarak üç tür olarak tanımlayabiliriz. Bunlardan ilki, herhangi bir eklenti ağacının parçası olmadan kendi başlarına var olabilen “üst düzey” eklentilerdir. Örneğin, ışıklar üst düzey eklentilerdir. Elbette diğer eklentilerden de girdi alabilirler, ancak diğer eklentilere değer göndermezler. Üst düzey olmayan eklentiler, belirli bir türde eklenti gerektiren parametre yuvaları için girdi görevi görür. Örneğin, bir malzeme eklentisi isteğe bağlı bir doku girdisi gerektirebilir ve burada bir doku eklentisine referans verirsiniz. Doku eklentisi bir UVW oluşturucudan girdi alabilir ve benzeri. Üçüncü tür ise yalnızca bir örneği olan özel bir üst düzey eklenti türüdür. Bunlar temelde ayar eklentileridir. Çoğunun adında “Ayarlar” ifadesi bulunur, ancak birkaçında bulunmaz. V-Ray kamerası da böyle bir tekil eklenti tarafından tanımlanır.

Dil bağlamlarının her birinde, V-Ray motorundaki temel örneği için hafif bir sarmalayıcı olan bir Eklenti sınıfı bulunur. Bu nesneler gerçek özellik verilerini içermez, bu nedenle kopyalanabilirler (örneğin değer olarak geçirilebilirler). Desteklediğimiz statik olarak tiplendirilmiş dillerde – C++ ve C# – belirli V-Ray eklenti türleri için somut sınıfların yanı sıra genel Eklenti türü de vardır. Bunlar, özelliği tanımlamak için dizeler kullanan genel yöntemlere göre kolaylık sağlamak için özellik alıcıları ve ayarlayıcıları sunar.

Plugin nesneleri yalnızca sarmalayıcı olduklarından, kapsam dışına çıkmaları gerçek V-Ray eklentisini sahneden kaldırmaz. Sadece bir referanstır. Örnek ekleme ve kaldırma işlemleri VRayRenderer sınıfının yöntemleri aracılığıyla yapılır.

Plugin sınıfının varsayılan kurucusu geçersiz bir nesne oluşturur. Nesnenin geçerliliği boolean bir değer olarak kontrol edilebilir. getPlugin() gibi bazı API’ler bir Plugin nesnesi döndürür. Örneğin, istenen örnek adı bulunamadığında geçersiz olabilir. Bu tür döndürülen değerleri daha fazla kullanmadan önce geçerliliklerini kontrol etmek iyi bir uygulamadır.

Eklenti referansı alma #


Her dil için özel olarak tasarlanmış mevcut bir eklentiye referans elde etmenin çeşitli yolları vardır ( bir sonraki bölümde PluginRef’e de bakın ). Bunlar aşağıdaki örnekte gösterilmiştir:

# We know the plugin's name in advance
renderView = renderer.plugins["renderView"]
# or equivalently
renderView2 = renderer.plugins.renderView
assert renderView == renderView2

// We know the plugin's name in advance
RenderView renderView = renderer.getPlugin<RenderView>("renderView");
// We know only the type of the plugin and that it's a singleton
RenderView renderView2 = renderer.getInstanceOf<RenderView>();
// We get it as a generic plugin type
Plugin renderView3 = renderer.getPlugin("renderView");
// We can use this special cast similar to static_cast if we are certain of the type
RenderView renderView4 = plugin_cast<RenderView>(renderView3);
// There is a checked version similar to dynamic_cast. It returns invalid Plugin if the type doesn't match
RenderView renderView5 = plugin_checked_cast<RenderView>(renderView3);

assert(renderView == renderView2);
assert(renderView == renderView3); // note that the right side here is generic Plugin
assert(renderView == renderView4);
assert(renderView == renderView5);

// We know the plugin's name in advance
RenderView renderView = renderer.GetPlugin<RenderView>("renderView");
// We know only the type of the plugin and that it's a singleton
RenderView renderView2 = renderer.GetInstanceOf<RenderView>();
// We get it as a generic plugin type
Plugin renderView3 = renderer.GetPlugin("renderView");

System.Diagnostics.Debug.Assert(renderView == renderView2);
System.Diagnostics.Debug.Assert(renderView == renderView3);

var assert = require('assert');
// We know the plugin's name in advance
var renderView = renderer.plugins["renderView"];
// or equivalently
var renderView2 = renderer.plugins.renderView;
assert(renderView == renderView2);

Tüm eklenti adlarını veya tüm olası eklenti türlerini alabiliriz. Ayrıca, belirli bir eklenti türünün (örneğin Node) tüm örneklerini de alabiliriz.

# Print the names of all plugin instances
for plugin in renderer.plugins:
print(plugin.getName())
# Print the names of all available plugin classes
for cls in renderer.classes:
print(cls.getName())
# Print all instance names of a given type
for node in renderer.classes.Node.getInstances():
print(node.getName())

// Print the names of all plugin instances
for (const Plugin& plugin : renderer.getPlugins())
cout << plugin.getName() << endl;
// Print the names of all available plugin classes
for (const string& className : renderer.getAllPluginTypes())
cout << className << endl;
// Print all instance names of a given type
for (const Plugin& node : renderer.getPlugins("Node"))
cout << node.getName() << endl;
// Print the names of all plugin instances
foreach (Plugin plugin in renderer.GetPlugins())
Console.WriteLine(plugin.GetName());
// Print the names of all available plugin classes
foreach (string className in renderer.AllPluginTypes)
Console.WriteLine(className);
// Print all instance names of a given type
foreach (Plugin node in renderer.GetPlugins("Node"))
Console.WriteLine(node.GetName());
// Print the names of all plugin instances
for (var plugName in renderer.plugins)
    console.log(plugName);
// Or alternatively iterate over all plugin instances and print their names
for (var plugin of renderer.plugins)
console.log(plugin.getName());
// Print the names of all available plugin classes
for (var className in renderer.classes)
    console.log(className);
// Or alternatively iterate over all plugin classes and print their names
for (var cls of renderer.classes)
console.log(cls.getName());
// Print all instance names of a given type
var nodeInstances = renderer.classes.Node.getInstances();
for (var node of nodeInstances)
console.log(node.getName());

Meta Veriler #


Tüm eklentiler, özelliklerinin adları, türleri, varsayılan değerleri ve açıklamaları hakkında bilgi sunar. Bu bilgilere eklentinin meta verileri diyoruz . Bu verilere şu şekilde erişilebilir:

pluginDescription = renderer.classes.RenderView.getDescription()
# Description of a render view (camera) -- position, field of view, etc. [gpuSupport=(partial)]
 
pluginMeta = renderer.classes.RenderView.getMeta()
for propName, propMeta in pluginMeta.items():
    print("propName = " + repr(propName))
    # 'transform', 'fov', ...
    propertyDescription = propMeta["description"]
    # 'Camera transform - position and rotation', 'Horizontal field of view', ...
    propertyType = propMeta["type"]
    # 'Transform', 'float', ...
    defaultVal = propMeta["defaultValue"]
    # 'Transform(Matrix(Vector(1, 0, 0), Vector(0, 1, 0), Vector(0, 0, 1)), Vector(0, 0, 0))', '0.785398', ...
    gpuParamSupport = propMeta["GPUSupport"]
    # 'Full', 'Full', ...
PluginMeta pluginMeta = renderer.getPluginMeta("RenderView");
string pluginDescription = pluginMeta.getDescription();
// Description of a render view (camera) -- position, field of view, etc. [gpuSupport=(partial)]
const vector<string> propertyNames = pluginMeta.getPropertyNames();
// ["transform", "fov", ...]
for (const string& propName : propertyNames) {
PropertyMeta propertyMeta = pluginMeta.getPropertyMeta(propName);
string propertyDescription = propertyMeta.getDescription();
// "Camera transform - position and rotation", "Horizontal field of view", ...
string propertyType = propertyMeta.getTypeAsString();
// "Transform", "float", ...
Value defaultVal = propertyMeta.getDefaultValue();
// "Transform(Matrix(Vector(1, 0, 0), Vector(0, 1, 0), Vector(0, 0, 1)), Vector(0, 0, 0))", "0.785398", ...
GPUParamSupport gpuParamSupport = propertyMeta.getGPUSupport();
// GPUParamSupport::GPUParamSupport_Full, GPUParamSupport::GPUParamSupport_Full, ...
}
PluginMeta pluginMeta = renderer.GetPluginMeta("RenderView");
string pluginDescription = pluginMeta.Description;
// Description of a render view (camera) -- position, field of view, etc. [gpuSupport=(partial)]
string[] propertyNames = pluginMeta.PropertyNames;
// ["transform", "fov", ...]
foreach (var propName in propertyNames)
{
PropertyMeta propertyMeta = pluginMeta.GetPropertyMeta(propName);
string propertyDescription = propertyMeta.Description;
// "Camera transform - position and rotation", "Horizontal field of view", ...
string propertyType = propertyMeta.TypeString;
// "Transform", "float", ...
object defaultVal = propertyMeta.DefaultValue;
// "Transform(Matrix(Vector(1, 0, 0), Vector(0, 1, 0), Vector(0, 0, 1)), Vector(0, 0, 0))", "0.785398", ...
GPUParamSupport gpuParamSupport = propertyMeta.GPUSupport;
// GPUParamSupport.GPUParamSupport_Full, GPUParamSupport.GPUParamSupport_Full, ...
}
var pluginDescription = renderer.classes.RenderView.getDescription()
// Description of a render view (camera) -- position, field of view, etc. [gpuSupport=(partial)]
 
var pluginMeta = renderer.classes.RenderView.getMeta()
for (var propName in pluginMeta) {
var propMeta = pluginMeta[propName]
// 'transform', 'fov', ...
propertyDescription = propMeta['description']
// 'Camera transform - position and rotation', 'Horizontal field of view', ...
propertyType = propMeta['type']
// 'Transform', 'float', ...
defaultVal = propMeta['defaultValue']
// 'Transform(Matrix(Vector(1, 0, 0), Vector(0, 1, 0), Vector(0, 0, 1)), Vector(0, 0, 0))', '0.785398', ...
gpuParamSupport = propMeta['GPUSupport']
// 'Full', 'Full', ...
}
  • Açıklama,  kullanıcı arayüzüne yerleştirilebilen bir metin dizisidir.

  • “Type” , olası Özellik Türlerinden  birini belirten bir dizedir. 

  • Varsayılan değer, türünde  bir nesnedir  

  • GPUParamSupport, bir özelliğin V-Ray GPU tarafından ne ölçüde desteklendiğini açıklar.

Eklenti örnekleri oluşturma #


Aşağıdaki örnek, yeni eklenti örneklerinin nasıl oluşturulduğunu göstermektedir. İstenen örnek adı zaten kullanılıyorsa oluşturma işlemi başarısız olur.

# this will generate a unique name for the instance
renderView = renderer.plugins.classes.RenderView()
# or pass a name of your own
renderView = renderer.plugins.classes.RenderView("myRenderView")

// this will generate a unique name for the instance
RenderView renderView = renderer.newPlugin<RenderView>();
// or pass a name of your own
RenderView renderView = renderer.newPlugin<RenderView>("myRenderView");

// this will generate a unique name for the instance
RenderView renderView = renderer.NewPlugin<RenderView>();
// or pass a name of your own
RenderView renderView = renderer.NewPlugin<RenderView>("myRenderView");

// this will generate a unique name for the instance
var renderView = renderer.plugins.classes.RenderView();
// or pass a name of your own
var renderView = renderer.plugins.classes.RenderView("myRenderView");

Ek olarak , yalnızca zaten mevcut değilse örnek oluşturan getInstanceOrCreate() yöntemi de vardır . Aksi takdirde mevcut örneği döndürür. Bu, sahnede birden fazla örneğe sahip olmaması gereken ayarlar eklentileri için kullanışlıdır. Ayrıca C++’da getInstanceOf() , C#’da getInstanceOf() ve Python ve Node.js’de getInstance() yöntemi de vardır ; bu yöntem, mevcutsa en son eklenen örneği bulur.

Eklenti örneklerinin kaldırılması #


Bir eklenti örneği sahneden kaldırıldığında, ona yapılan tüm referanslar dahili olarak null değerine sıfırlanır. Silinen eklenti örneğine referans veren tüm Plugin nesneleri geçersiz hale gelir, ancak bunlar üzerinde yapılan bir boolean kontrolü yine de True değerini döndürür. Bunlar üzerindeki işlemler başarısız olur. Bir örneğin hala var olup olmadığından emin değilseniz, oluşturucudan tekrar adıyla bir Plugin referansı alın ve üzerinde bir boolean kontrolü yapın.

node = renderer.plugins['myNodeName']
del renderer.plugins['myNodeName']
# or
del renderer.plugins.myNodeName
# or
del renderer.plugins[node]
# or simply
node.deleteThis() # node variable won't reference any plugin instance after this call

Node node = renderer.getPlugin<Node>("myNodeName");
renderer.deletePlugin(node);
// or
renderer.deletePlugin("myNodeName");
// or (but not recommended)
renderer.deletePlugin(node.getName());

Node node = renderer.GetPlugin<Node>("myNodeName");
renderer.DeletePlugin(node);
// or
renderer.DeletePlugin("myNodeName");
// or (but not recommended)
renderer.DeletePlugin(node.getName());

var node = renderer.plugins['myNodeName'];
delete renderer.plugins['myNodeName'];
// or
delete renderer.plugins.myNodeName;
// or
delete renderer.plugins[node];
# or simply
node.deleteThis(); // node variable won't reference any plugin instance after this call

Eklenti örneklerinin değiştirilmesi #


Bazı durumlarda, birden fazla parametre yuvasına bağlı olabilecek başka bir eklenti örneğinin yerine yeni bir eklenti örneği kullanmak isteyebilirsiniz. Bu, örneğin malzemeleri veya dokularını değiştirmek için tipiktir. Tüm bağlantıları kendiniz yeniden ayarlamaktan kaçınmak için eklenti değiştirme API’sini kullanın. Ayrıca bağlantıları sıfırlamak için de kullanabilirsiniz.

oldPlugin = renderer.plugins["oldMaterial"]
newPlugin = renderer.classes.MtlSingleBRDF("newMaterial")
newPlugin.brdf = renderer.classes.BRDFDiffuse("grayDiffuse")
oldPlugin.replaceWith(newPlugin)
# or
oldPlugin.replaceWith(None)

Plugin oldPlugin = renderer.getPlugin("oldMaterial");
Plugin newPlugin = renderer.newPlugin("MtlSingleBRDF", "newMaterial");
newPlugin.set_brdf(renderer.newPlugin("BRDFDiffuse", "grayDiffuse"));
renderer.replacePlugin(oldPlugin, newPlugin);
// or pass default constructed Plugin to reset to null
renderer.replacePlugin(oldPlugin, Plugin());

Plugin oldPlugin = renderer.GetPlugin("oldMaterial");
Plugin newPlugin = renderer.NewPlugin("newMaterial", "MtlSingleBRDF");
newPlugin.Brdf = renderer.NewPlugin("BRDFDiffuse", "grayDiffuse");
renderer.ReplacePlugin(oldPlugin, newPlugin);
// or
renderer.ReplacePlugin(oldPlugin, null);

var oldPlugin = renderer.plugins["oldMaterial"];
var newPlugin = renderer.classes.MtlSingleBRDF("newMaterial");
newPlugin.brdf = renderer.classes.BRDFDiffuse("grayDiffuse");
oldPlugin.replaceWith(newPlugin);
// or
oldPlugin.replaceWith(null);

Tarafından desteklenmektedir BetterDocs

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir