PDA

Voir la version complète : ShaderData et BaseObject Python



gr4ph0s
04/05/2016, 01h00
Salut encore et toujours moi :)

Je voulais savoir y'a moyen de récupérer un BaseObject attaché à un ShaderData en python?
J'ai vu qu'en C++ y'avais une fonction draw qui retournais justement un baseObject. Je sais que cette fonction est appelé uniquement dans le viewport mais je suppose qu'il s'agit de la même instance du coup si on définit une variable dans notre class contenant le baseObject on peux ainsi récupéré le baseObject sur le quel notre shader est en cours lors de notre rendu. Mais en python je sèche...

Merci d'avance :)

xs_yann
04/05/2016, 10h34
Salut gr4ph0s,

A priori en C++, tu utilises le ChannelData passé en paramètre de la méthode Output. Dans ce ChannelData tu as un attribut vd de type VolumeData, dans le vd tu as un attribut op de type RayObject qui lui-même possède un attribut link qui est le BaseObject.
Genre cd->vd->op->link (en faisant attention parceque vd, op et link peuvent ne pas être définis).

En python le VolumeData n'a pas d'attribut op, je ne pense pas que tu puisses avoir accès au BaseObject.
Par contre tu peux récupérer le matériau en faisant sh->GetMain().

gr4ph0s
04/05/2016, 11h34
Merci oui javais vu cette technique aussi cependant je récupère le materiaux pas le basetag et impossible ditentifier quelle instance du materiaux est rendu :/

Mon but étais de faire un color random pour chaque objet. Mais finalement ce n'est pas possible en python dommage :/


Merci en tout cas :)

EDIT:
j'étais parti sur un truc avec le tag et tout mais si on ne peux pas avoir ni le tag de texture, ni l'objet ça va être difficile ^^'

César Vonc
21/05/2016, 15h03
Du coup, il serait possible de dire à un ShaderData d'utiliser une propriété UVW autre que celle définie par la propriété Texture, en C++ ?

gr4ph0s
21/05/2016, 15h42
Je dirais oui vu que les info UV sont passé dans un channelData qui est de base initialisé lorsque tu fais un BaseShader.Sample(cd).
Mais rien ne t'empeche de te créer un autre channelData avec les données du basevolume que tu veux (dedans tu as les info d'uvw) puis après d'assigner ton ChannedData initialisé de base(via BaseShader.Sample(cd)) avec les uvw de l'autre vu que ces valeurs ne sont pas en read-only.

Après je n'ai pas testé mais comme ça en parcourant le sdk ça me semble possible ^^'

clemz
21/05/2016, 15h59
offtopic / (bon je vais m'inscrire à la Mjm de Nantes ! apparemment on passe un doctorat en programmation en bonus quand on choisit la formation 3D c'est cool ! ^^ ) / offtopic

César Vonc
21/05/2016, 17h05
Sur le papier ça a l'air simple, oui.

D'après mes essais, le VolumeData contient la liste de tous les objets, chacun contenant un ou plusieurs TexData.

Dans ce TexData, on trouve un entier uvwind, qui semble correspondre à l'index de la propriété UVW de l'objet, et le TexData serait donc la propriété Texture.


Quand je modifie le uvwind, pour rendre avec une autre propriété UVW, ça le change pour toute la propriété Texture, et non pour le ChannelData, du coup ça revient à modifier l'ordre des propriétés UVW, ce qui n'est pas très utile. : p


De plus, les propriétés UVW doivent être utilisées dans le rendu, sans quoi elles ne sont pas incluse dans la liste des UV du TexData accessible avec uvwind.


Enfin, y a sûrement un moyen, je continue de chercher.

César Vonc
21/05/2016, 18h40
Alors après pas mal d'essais, la seule solution que j'ai trouvé est de calculer les UV non pas en précisant une autre propriété UV mais à partir d'une autre propriété Texture, avec VolumeData->ProjectPoint, puis de passer le résultat dans le ChannelData->p.


Remarque, c'est pas mal, car on a toutes les options de la propriété Texture pour affiner nos UV !



Vector BitmapData::Output(BaseShader* chn, ChannelData* cd)
{
if (!shader)
return Vector(1.0);

Vector uv = cd->p;

if (cd->vd) {
TexData* td = cd->vd->GetTexData(cd->vd->GetObj(0), 0); // Une des propriétés Texture du premier objet de la scène
if (td) {
Vector uv2;
if (cd->vd->ProjectPoint(td, cd->vd->lhit, cd->vd->p, cd->vd->n, &uv2)) {
cd->p.x = uv2.x;
cd->p.y = uv2.y;
}
}
}

Vector res = shader->Sample(cd);
cd->p = uv;

return res;
}

17977