====== PanGL ======
===== Zielsetzung =====
performanter, WebGL-basierter Panoramaviewer für kubische 180/360° Panoramen mit unterschiedlichen Qualitäts/Zoomstufen sowie intelligentem nachladen selbiger.
Objektorientierter Ansatz zur Strukturierung (d.h. es gibt ein Objekt "texturierte 2D fläche", ...)
===== ToDo =====
* laden Würfel/Kacheln in verschiedenen Qualitätsstufen, on-the-fly Texturen laden (v0.1) :-D done
* onresize-Handler :-D nahezu done (aspect ratio wird nicht resettet)
* Mausnavigation im Firefox fixen (Mausrad!) (v0.11) :-D done
* ermitteln welcher Bildausschnitt gerade gezeigt wird (xyz/rgb colorcube), nur entsprechende Kacheln nachladen wenn bspw 1 Texturpixel größer als 1 Bildschirmpixel ist, eine Textur also vergrößert/pixelig wäre: intelligentes Nachladen der Kacheln :-/ in progress
* Hotspots basierend auf radialem Koordinatensystem (auf Kugeloberfläche)
* Pfad muss zum Zeichnen in Polygone/Fläche umgewandelt werden (delaunay?) --> ear clipping prototyp funktioniert zufriedenstellend :-D
* einbauen (als objekt/klasse) :-D
* hotspots mit links/tooltips versehen (auch mittels colorpicking, am besten eigenen algo hierfür [im vergl. zu nachlade-colorcube, 16777216 möglichkeiten vorhanden, nur 393216 genutzt, sind 2,3%, ein renderpass für beides reicht also/kein clear])
* externes Konfigurationsfile/parser
* Soundscape (richtungsabhängiges Hintergrundgedudel) :-D done, eigene js-Klasse (html5 audio-basiert; firefox opera chrome funktionieren)
* fx
* ein/ausblend-effekte (von/zu farbe) nach dem laden/beim überblenden
* Lensflare :-D done, auch nette Gegenlichteffekte möglich
* Regen/Schnee/Partikeleffekte
* mobile firefox: https://developer.mozilla.org/en/DOM/Touch_events webgl tut schon
===== OOP Struktur =====
* flatsquare [Texturierte 2d-Fläche]
* init(textur_url)
* render()
* setoffset(ofsx,ofsy,ofsz) <- funktionalität ggf. in init verschieben
* setscale(sclx,scly,sclz) <- funktionalität ggf. in init verschieben
* square [2d-Array von flatsquares]
* init(textur_url(mit wildcards) ,breite(px),höhe(px),kachelbreite/höhe)
* render()
* cube [würfel, beinhaltet 6 squares]
* init(level of detail) <- überarbeiten! / nachlade-logik intigrieren
* trigger_texload(xmin,xmax,ymin,ymax) <- neu einfügen für colorcube-basiertes nachladen?
* render()
* colorcube [für colorpicker würfel aus 6 flächen, wobei die farbe der Flächen für r,g,b jeweils proportional zur raumposition (x,y,z) ist.]
* init()
* render()
* hotspot [gefülltes polygon] <- noch nicht implementiert
* init(polygon-pfad, render-einstellungen(farbe,transparenz,rand,dicke,...),link)
* render(colorpick?)
* uIDMan
* init()
* register(callback)
* event(uID,type) <- vom colorpick; type=mouse move, click etc.
init() beinhaltet jeweils das generieren der Meshs, laden der Shader etc. render() beinhaltet die Zeichenkommandos und ggf. nötige Vorarbeit
später noch szenen-manager etc. notwenig, welcher dann auch das configfile parsed etc... noch fliegen die Objekte lose umher
===== colorpick =====
==== colorcube ====
Farbwürfel nutzt Farben [0,0-255,0-255], [255,0-255,0-255], [0-255,0,0-255], [0-255,255,0-255], [0-255,0-255,0], [0-255,0-255,255] für Cursorpositionsermittlung über Würfel bzw. welchen Bereich des Würfels die Kamera abdeckt / sieht
Extrem langsamer als Projezieren und gucken obs sichtbar ist... daher das verwendet.
==== unique IDs ====
es bleiben die IDs nach folgender Vorschrift übrig:
[1-254,1-254,1-254];
uID = (farbe[0]-1) + (farbe[1]-1)*255 + (farbe[2]-1)*255*255
farbe = [r,g,b]
-> uID-Handler/Verwaltungs-Klasse notwendig, welche Callbacks zu den IDs verwaltet und bei entsprechenden Events zurückruft (somit kein pollen aller objekte notwendig)
===== Ideen =====
* http://wiki.panotools.org/Panorama_Viewers
* http://www.panoramaphotographer.com/comparisons
* http://www.vtfusion.com/fusionplayer-demo.html
* Panning, tilting and zooming. Full navigation using either mouse or keyboard. - check :!:
* Link any document to any point in the image using hotspots. - check :!: (nearly done)
* Complete VR-Tours in Browsers and Appletviewer. -> config file / links
* Scriptable via html/javascript -> theoretisch... interface muss definiert werden
* Tiny file size - check :!:
* high performance ... momentan völlig Banane
*