Offline rendering - končno tudi na GPU

Posted by Krof Drakula on Feb 8th, 2008

nVidia je nedolgo nazaj izdala Gelato - rendering pipeline za RenderMan-združljive protokole, ki vpreže tudi do sedaj na tem področju še neizkoriščeno konjsko moč GPU.

Seveda tu umetnik ni omejen na uporabo zgolj rasterskih metod izrisa, grafični procesor renderer uporablja kot splošnonamenski floating point procesor, ki je odvisen izključno samo od algoritmov in implementacij znotraj RenderMan protokola. Sedaj bom sam sebi lažje upravičil strošek nakupa dobre grafične kartice.

Kako se izogniti uporabi Flasha pri demo CD-jih

Posted by Krof Drakula on Aug 29th, 2007

Ker trenutno pomagam zbirati in urejati gradivo za Labirint trenutkov in ga lično zapakirati v dinamično obliko, sem se odločil narediti nekaj dokaj neortodoksnega - narediti “Flash” predstavitev brez Flasha.

Kako, porečete? No, ideja je taka - ker zelo nerad programiram in delam v Flashu, se ga rad izognem, ko je le-to možno. In ker sem zelo domač v Javascriptu (ki je neke vrste ActionScript, natančneje “sibling” jezik v grupi, imenovani ECMAScript) in XHTML-ju kot prezentacijskem sloju, se mi je posvetilo - zakaj pa ne bi zadeve naredil kar v XHTML-ju? Glede na to, da so dandanes knjižnice z efekti res dobre (jQuery in maljon vtičnikov za le-tega) in računalniki dovolj dobri za predvajanje JS animacij, zakaj ne bi tega res naredil kot offline XHTML?

Vse lepo in prav, dokler se ne udariš ob eno prepreko - nešteta množica različnih brskalnikov, ki se nahajajo na računalnikih končnih uporabnikov (CD je namenjen distribuciji medijem in sponzorjem), od katerih je najbolj problematičen IE - 5.5, 6.0 in 7.0. Trije brskalniki, ki se med seboj po sposobnostih in funkcionalnosti razlikujejo huje kot različni brskalniki drugih ponudnikov med seboj. Nočna mora - še posebej, kar se tiče podpore JS knjižnic in prikaza strani, pa četudi gre za še najbolj preproste CSS vmesnike.

…in potem, ključni trenutek - kaj pa če bi prisilil uporabnika, da uporabi Firefox? Lame rešitev bi sicer bila ikona na dnu strani (mogoče še celo splash screen pred dejansko stranjo), kjer bi propagiral “Best viewed in Firefox,” ampak vsak spletni oblikovalec in programer ve, da je to formalni no-no. Tega se ne počne že od davnega leta 1997. Seveda bi lahko priložil inštalacijsko kopijo Firefoxa na CD-ju, ampak kaj, če bi s tem povozil kakšne nastavitve in novejše različice brskalnika, ki je že na sistemu (recimo Firefox 1.5-)? Najti je bilo treba boljšo, izolirano in samozadostno rešitev. Rezultat? Portable Firefox!

Seveda pa sama predstavitev zna zavajati ljudi, ker, seveda, gre še vedno za brskalnik v vsej svoji veličini. Še vedno lahko dodajaš zaznamke, vtičnike, uporabljaš multi-tab vmesnik, itd. Pa tudi vsi menuji so še vedno vidni, kar seveda nima mesta v namenskem brskalniku, ki služi le predstavitvi.

Slednje pa lahko, vsaj vizualno (do sem sem trenutno prišel), popravimo s pomočjo userChrome.css datoteke. Le-ta se nahaja v PortableFirefox/Data/profile/chrome, določa pa izgled XUL vmesnika. V mojem primeru sem hotel v prvem koraku izbrisati zgornjo vrstico z menuji, kar sem dosegel z naslednjo vsebino:

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
#toolbar-menubar, #nav-bar {
  display: none !important;
}

To skrije naslovno vrstico in menu, bookmark toolbar pa sem skril že prej s pomočjo kontekstnega menuja z desnim klikom na sivi prostor med gumbi. Željeno predstavitveno stran pa lahko odprem s preprostim ukazom v smislu PortableFirefox.exe file:///c:/pot/do/projektnega/index.html in voilá! Gecko engine s Flash pluginom in polnim JavaScript VM-jem, z vsemi dobrotami XHTML in CSS.

Sicer je še veliko ostalo - treba je izključiti vse t.i. “acceleratorje” (bližnjice na tipkovnici), ki jih je trenutno še moč klicati (Ctrl+O, Ctrl+B, Ctrl+H in podobno), izklopiti je treba še kontekstni menu pri desnem kliku na “non-input” HTML elemente (torej, vse, razen input, textarea in podobno) in par ostalih bonbončkov.

Končen nabor datotek in komentirana navodila pa bom objavil, če koga zanima takšno početje. ;) Če ne drugega, lahko sedaj res oblikujete brskalnik natančno tako, kot želite.

Mr. T predava o MVC ahitekturi ter virtualizaciji

Posted by Krof Drakula on Jun 13th, 2007

Res. Majke mi. Poglejte:

LOL.

Posted by Krof Drakula on Apr 24th, 2007

Aja, BTW, tole je sumo igra, v kateri lutke SAME vzdržujejo ravnotežje - kontrola, ki je prepuščena igralcu, je pa dokaj omejena. S stališča same tehnične implementacije še kako vredno ogleda. Aja, celotna igra je velika 96 kB.

Vsi ostali pa lahko vidite, kako se debeluhi tepejo. :)

Klik klik.

OMG kaka ezoterika

Posted by Krof Drakula on Mar 1st, 2007

Bentim nad ActionScriptom 2.0. No, sicer je moja napaka, ker se še nisem čisto navadil na prototype-based language. Posledično me je nekaj zaj–alo v zvezi s tem.

Če si v PHP ali v vsakem klasičnem OO jeziku pisal metode znotraj klase in delegiral izvajanje neki funkciji ob eventu, računaš na to, da se kontekst metode nanaša na klaso objekta, na katerem se nahaja. Not so v ActionScriptu. In JavaScriptu, predvidevam, ker sta oba ECMAscript.

V glavnem, problem je takle:

class XMLLoader {
  private var xml_object:XML;
  public function XMLLoader(location:String) {
    this.xml_object = new XML();
    this.xml_object.ignoreWhite = true;
    this.xml_object.onLoad = this.xmlLoaded;
    this.xml_object.load(location);
  }
  private function xmlLoaded(success:Boolean):Void {
    trace(this);
  }
}

// nekje v timeline
var a:XMLLoader = new XMLLoader("myxml.xml");

Bi kdo rad uganil, kaj se izpiše v output oknu? Vsebina XML fajla. Tako je. Ne _level0.a, ampak vsebina XML fajla. Ker nastaviš XMLLoader::xmlLoaded funkcijo kot handler za onLoad event, le ta postane member objekta XML, in tako kontekst ključne besede this pade znotraj objekta XML.

Zabavno, ne?

Update: našel rešitev. Če hočeš izvesti zgornjo kodo, to narediš s pomočjo Delegate klase:

import mx.utils.Delegate;

class A {
  private var xml_input:XML;
  public function A(xml_location:String) {
    this.xml_input = new XML();
    this.xml_input.ignoreWhite = true;
    this.xml_input.onLoad = Delegate.create(this, onLoadXml);
    this.xml_input.load(xml_location);
  }
  private function onLoadXml(success:Boolean) {
    trace(this.xml_input.firstChild);
  }
}

// v timeline:
var a = new A("myxml.xml");

Rezultat je sedaj pričakovano vsebina XML datoteke myxml.xml.

Next »

To sem jaz.

  • Krof Drakula osebno.



  • N3rd badge.

G33K!

  • qrcode

Sla.st.no

Google Analytics