[riešenie] neviditeľné objekty za priehľadnými

1 view
Skip to first unread message

Milan Laslop

unread,
Apr 7, 2011, 2:16:53 PM4/7/11
to tim16_2010
zrejme stačí prídať:
(nejaké Drawable)->setRenderingHint (osg::StateSet::TRANSPARENT_BIN);

takže celé nastavenie priehľadnosti je napríklad:
sd->setColor (osg::Vec4 (0, 0, 1.0, 0.06));
sd->getOrCreateStateSet()->setMode (GL_BLEND, osg::StateAttribute::ON);
sd->getStateSet()->setRenderingHint (osg::StateSet::TRANSPARENT_BIN);
(sd je Drawable objekt, ktorý chceme priehľadný)

zdroj:
http://groups.google.com/group/osg-users/browse_thread/thread/329bf9b4ef23b946?pli=1

Jaroslav Prokop

unread,
Apr 7, 2011, 4:50:57 PM4/7/11
to tim16_2010
Vďaka za typ, otestujem aj toto riešenie a zavesím sem výsledok.
> zdroj:http://groups.google.com/group/osg-users/browse_thread/thread/329bf9b...

Jaroslav Prokop

unread,
Apr 8, 2011, 9:48:07 AM4/8/11
to tim16_2010
Milan,

otestoval som nastavenie pre drawable ->getStateSet()->setRenderingHint (osg::StateSet::TRANSPARENT_BIN);, mode som už používal. Je to lepšie, ale v určitých uhloch nie sú viditeľlné hrany, v niektorých guliach, takže ešte na tom budem robiť.

Skúsil som si aj mergnut tvoju branchu, ale padá mi to tam v runtime na null pointri v metóde void RestrictionsManager::notifyRestrictionAdded v triede RestrictionManager. Tam sa volá metóda observer_->restrictionAdded (shapeGetter), ale vyzerá to, že observer_ ešte nebol pred týmto volaním incializovaný, teda je null. _observer sa inicializuje v metóde void RestrictionsManager::setObserver, ale táto pred tým nie je volaná. Prosím pozri sa na to, v čom je problém, momentálne ešte riešim škálovanie polomeru gule, takže chcel by som otestovať už aj layout manager. Dík.

2011/4/7 Jaroslav Prokop <jaro....@gmail.com>

Milan Laslop

unread,
Apr 8, 2011, 3:02:25 PM4/8/11
to tim16...@googlegroups.com
Mám tam chybu. Ty pridávaš obmedzovače ešte vtedy, keď nie je nastavený
observer (teda hneď počas vytvárania grafu). Observer sa pridá, až keď je
graf vytvorený a vytvára sa nad ním Viewer. Neuvedomil som si toto možné
poradie. Pri pridávaní obmedzovačov z GUI mi to vždy fungovalo, lebo tam
sa pridávajú už do vytvoreného grafu (nad ktorým je už vytvorený Viewer,
takže observer je nastavený).
Zatiaľ si to nejako vykomentuj alebo tam daj podmienku, aby sa notifikoval
iba ak je nastavený (čo ale by sa nemalo tak používať, keďže sa tak
niektoré informácie, ktoré mal observer dostať, stratia).
Ja to opravím, keď budem mať čas - pomeniť poradie inicializácie (graf,
obmedzovače, viewer) asi tak ľahko nepôjde, preto asi budem musieť
zhromažďovať notifikácie v RestrictionsManager a pri zaregistrovaní
observera mu ich dať. Alebo je možnosť urobiť to úplne bez observera,
niečo na spôsob synchronizeEdges a synchronizeNodes, že počas
vykresľovania sa to zosynchronizuje s reálnym stavom. Neviem teraz vybrať
lepšie (menej horšie) riešenie.
V mojej branchi je inak vykresľovanie všetkých obmedzovačov, teda aj tých,
ktoré sú kvôli vnoreným grafom. Preto asi stráca význam to, že ty tam
pridávaš vlastné spheres do osg stromu. Musíme to potom nejako dať dokopy,
neviem, či ty tam máš ešte nejakú funkcionalitu navyše, ktorá nie je
zahrnutá v mojom riešení.

Milan Laslop

unread,
Apr 8, 2011, 4:00:51 PM4/8/11
to tim16...@googlegroups.com
Opravil som to - zatiaľ tak, že:
- pokiaľ tam nie je observer, tak sa neposielajú notifikácie (veď sa
nemajú komu)
- keď príde observer (setObserver ()), tak sa mu pošlú také notifikácie,
aby sa dostal do stavu, v akom by bol, keby bol registrovaný už od začiatku

Neviem ale zatiaľ, či to naozaj nebude lepšie urobiť bez observera (že
Viewer nebude dostávať notifikácie, ale bude si ťahať informácie, kedy
bude treba).

Reply all
Reply to author
Forward
0 new messages