Autor Wątek: Overlay i zmiana tekstury  (Przeczytany 1766 razy)

Offline aphity

  • Użytkownik

# Czerwiec 06, 2015, 18:33:06
Nie potrafię zmusić Ogra do zmiany tekstury na Overlay'u w czasie pracy.

Mam następujące skrypty:
panel.overlay
Overlay
{
zorder 200

container Panel(Overlay/Background)
{
left 0
top 0
width 0.75
height 0.75
}
}
panel.material
material Overlay/Background/Material
{
technique
{
pass
{
texture_unit
{
texture sc.png
}
}
}
}

Jak widać, panel nie ma materiału - zaczyna więc jako czarny. Po upływie pewnego czasu chcę ustawić materiał:
Kod: (c++) [Zaznacz]
auto *panel = Ogre::OverlayManager::getSingleton().getOverlayElement("Overlay/Background");
panel->setMaterialName("Overlay/Background/Material");

Oczekiwałbym że w miejscu panelu pojawi się obrazek z pliku sc.png. Zamiast tego, cały panel wypełniany jest kolorem który przypomina te użyte w obrazku - więc może z niego pochodzić, ale nie wygląda na lewy górny róg. Log podaje że tekstura została załadowana:
Texture: sc.png: Loading 1 faces(PF_R8G8B8,1024x1024x1) with 10 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1024x1024x1.Ładowanie robię (póki co) w wątku głównym/renderowania. Screenshot z aplikacji w załączniku.

(oczywiście zamierzam przenieść ładowanie na osobny wątek, oraz wywalić mipmapping, ale tym zajmę się gdy sprawię żeby to co mam działało jak należy)

Jeżeli w kodzie panelu w .overlay umieszczę
material Overlay/Background/Material
wtedy wyświetla się tak, jak powinno. Ja jednak chcę ustawić to dopiero po pewnym czasie.

Gdyby mogło mieć to znaczenie, pracuję pod OS X, renderuję przez RenderSystem_GL (nie GL3+). Ma ktoś pomysł co robię źle?


EDIT: znalazłem workaround. Paskudztwo, ale przynajmniej działa. Polega na wywaleniu panelu z overlaya, zrobieniu kopii, przypisaniu materiału tej kopii i dodaniu tej kopii do overlay'a. Oczywiście nadal mam nadzieję na jakieś lepsze wyjście:

auto *background = Ogre::OverlayManager::getSingleton().getOverlayElement("Overlay/Background");
auto *ov = Ogre::OverlayManager::getSingleton().getByName("Overlay");
auto *background2 = dynamic_cast<Ogre::OverlayContainer*>(background->clone("Overlay/Background2"));
background2->setMaterialName(materialName);
ov->clear();
ov->add2D(background2);
« Ostatnia zmiana: Czerwiec 06, 2015, 21:21:32 wysłana przez aphity »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline RootKiller

  • Użytkownik

# Czerwiec 08, 2015, 12:00:53
A może jest dostepna jakaś metoda która odświezy "OverlayContainer"? Nie wiem hide() + show(), initialize()? Warto zajrzeć w źródła i zobaczyć dlaczego tak się właśnie dzieje. Ewentualnie mógłbyś usunąć i dodać bez klonowania OverlayContainera - może pomoże :-).

http://www.ogre3d.org/docs/api/1.9/class_ogre_1_1_overlay_container.html