[Projekt] breeze 2.0

Hier könnt ihr euch selbst, eure Homepage, euren Entwicklerstammtisch, Termine oder eure Projekte vorstellen.
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.

Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.

This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Code: Alles auswählen

<world name="My World!!111">
	<entity name="Light" type="Entity" id="0">
		<property name="cell">0;0;0</property>
		<property name="position">0;0;0</property>
		<property name="orientation">1;0;0;0;1;0;0;0;1</property>
		<property name="scaling">1;1;1</property>
		<property name="id">0</property>
		<controller type="DirectionalLightController" id="0">
			<property name="color">1;1;1;1</property>
			<property name="attenuation">1</property>
			<property name="attenuation offset">1</property>
			<property name="range">2.00000007e+032</property>
			<property name="shadow">0</property>
			<property name="shadow resolution">1024</property>
		</controller>
	</entity>
	<entity name="Mesh" type="Entity" id="1">
		<property name="cell">0;0;0</property>
		<property name="position">-2.98057961;0.951938987;2.04536462</property>
		<property name="orientation">0.939023495;-0.253350616;-0.232482746;0.166855037;0.926906168;-0.336160541;0.300656348;0.27687186;0.912659883</property>
		<property name="scaling">1;1;1</property>
		<property name="id">1</property>
		<controller type="MeshController" id="0"/>
	</entity>
</world>
Oh rly? Das muss ich wohl im Koma programmiert haben.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Code: Alles auswählen

<world name="My World!">
  <entities>
    <Entity name="Light" id="1">
      <properties>
        <p n="cell">0;0;0</p>
        <p n="position">-3.19933319;1.42814028;0</p>
        <p n="orientation">1;0;0;0;1;0;0;0;1</p>
        <p n="scaling">1;1;1</p>
      </properties>
      <controllers>
        <DirectionalLightController>
          <properties>
            <p n="color">1;1;1;1</p>
            <p n="attenuation">1</p>
            <p n="attenuation offset">1</p>
            <p n="range">2.00000007e+032</p>
            <p n="shadow">0</p>
            <p n="shadow resolution">1024</p>
          </properties>
        </DirectionalLightController>
      </controllers>
    </Entity>
    <Entity name="Mesh" id="2">
      <properties>
        <p n="cell">0;0;0</p>
        <p n="position">2.99975753;0.657639086;11.1062222</p>
        <p n="orientation">0.975369394;-0.0777570456;-0.206418186;0.0345901921;0.978146672;-0.205018744;0.217848867;0.192828879;0.956743896</p>
        <p n="scaling">1;1;1</p>
      </properties>
      <controllers>
        <MeshController/>
      </controllers>
    </Entity>
  </entities>
</world>
Datenorientierter Entwurf, Lektion 1: Sortiere deine Daten. Und: XML ist wirklich ein außerordentlich hässliches Format, sobald man versucht, übermäßige Redundanz zu vermeiden.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: [Projekt] breeze 2.0

Beitrag von Artificial Mind »

XML is like violence - if it doesn’t solve your problems, you are not using enough of it.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von Schrompf »

Ich muss hier mal meckern: manche Beiträger schreiben Beiträge wie früher Zudo (Sorry, Zudo) - einfach ein Stück Bild oder Text hingeklatscht ohne Kontext oder irgendeine Deutungshilfe. Ihr steht vielleicht im Stoff, ihr wisst, was ihr da ausdrücken wollt. Ich stehe davor wie das Schwein vorm Uhrweg, mir bleibt am Ende nix anderes übrig als die Schultern zu zucken und darüber hinweg zu scrollen. Das finde ich unschön.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: [Projekt] breeze 2.0

Beitrag von Artificial Mind »

Hm, Schrompf, ich weiß nicht genau, worauf du dich beziehst. Cat hat nen Teil seiner Serialisierung der Szene gepostet (hoffe, ich habe das richtig zugeordnet) und sich über seinen XML-Stil selbstironisch geäußert (property-elements sind schon amüsant). Daraufhin die korrigierte Version mit etwas aufgeräumteren Properties und Elementen im Allgemeinen. Ich konnte dann nicht widerstehen, das "berüchtigt-berühmte" XML-is-like-violence-Zitat zu posten. Oder beziehst du dich auf was ganz anderes?
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Schrompf hat geschrieben:Ich muss hier mal meckern: manche Beiträger schreiben Beiträge wie früher Zudo (Sorry, Zudo) - einfach ein Stück Bild oder Text hingeklatscht ohne Kontext oder irgendeine Deutungshilfe. Ihr steht vielleicht im Stoff, ihr wisst, was ihr da ausdrücken wollt. Ich stehe davor wie das Schwein vorm Uhrweg, mir bleibt am Ende nix anderes übrig als die Schultern zu zucken und darüber hinweg zu scrollen. Das finde ich unschön.
Diese Kritik kann ich jetzt auch ganz und gar nicht einordnen. Ich habe die letzten Tage relativ viele Code-Schnipsel gepastet, weil ich denke, dass diese einen gewissen Einblick in die Architektur bieten. (Dein Vergleich passt in dieser Hinsicht überhaupt nicht?) Meiner Meinung nach kann man viel aus dem Code herauslesen, ansonsten gerne jederzeit fragen.

Ich habe eigentlich nie Text hingeklatscht. Wenngleich die letzten Bilder und Kommentare nicht allzu informativ waren, so steckt doch hinter jedem ein großes Stück Arbeit, welches ich jeweils (bisweilen sehr knapp) beschrieben habe. Ein Teil zum Reflection-System ist unglücklicherweise im Jammer-Thread gelandet, weshalb der Thread an dieser Stelle etwas unvollständig ist.

Wenn es dir hilft, sieh die Posts als Angebot, mehr zu erfragen. Ich arbeite mich momentan durch Unmengen von unhandlicher Architektur und unangenehmer UI-Funktionalität. Diese weiter auszubreiten lohnt sich erst, wenn zumindest einer hier spezifisches Interesse an jeweils kurz Genanntem oder Gezeigtem anmeldet.
Zuletzt geändert von CodingCat am 28.01.2012, 18:45, insgesamt 1-mal geändert.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: [Projekt] breeze 2.0

Beitrag von Artificial Mind »

Also ich finde es immer sehr interessant was du postest, Cat. Ich überlege mir dann immer inwieweit ich den Konzepten zustimme und ob ich was davon verwenden könnte. Wir stehen ja im Endeffekt vor ähnlichen Aufgaben und da finde ich es immer sehr hilfreich zu sehen, wie andere sowas lösen.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Irgendwann fällt einem dann auf, dass alles, was vorne als Tag steht, hinten gleich nochmal auftaucht. Und so landet man fluchs bei etwas, das Open Street Map XML an Hässlichkeit nur noch in Wenigem nachsteht.

Code: Alles auswählen

<world name="World">
  <entities>
    <e name="Light" id="0" type="Entity">
      <properties>
        <p n="cell">0;0;0</p>
        <p n="position">0;0;0</p>
        <p n="orientation">1;0;0;0;1;0;0;0;1</p>
        <p n="scaling">1;1;1</p>
      </properties>
      <controllers>
        <c type="DirectionalLightController">
          <properties>
            <p n="color">1;1;1;1</p>
            <p n="attenuation">1</p>
            <p n="attenuation offset">1</p>
            <p n="range">2.00000007e+032</p>
            <p n="shadow">0</p>
            <p n="shadow resolution">1024</p>
          </properties>
        </c>
      </controllers>
    </e>
    <e name="Mesh" id="1" type="Entity">
      <properties>
        <p n="cell">0;0;0</p>
        <p n="position">2.12125421;4.67558336;24.1438293</p>
        <p n="orientation">0.934479415;-0.170359507;-0.312611252;0.0696782395;0.948615015;-0.308666587;0.349131882;0.266660392;0.898331404</p>
        <p n="scaling">1;1;1</p>
      </properties>
      <controllers>
        <c type="MeshController"/>
      </controllers>
    </e>
  </entities>
</world>
An diesem Punkt wäre wohl jedes andere (entsprechend reduzierte) textbasierte Format geeigneter, schöner, und sogar relativ einfach zu implementieren. Es siegt die Bequemlichkeit.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: [Projekt] breeze 2.0

Beitrag von eXile »

CodingCat hat geschrieben:Toll, wie einfach sich viele Dinge im Clip Space umsetzen lassen, wenn man ihn mal durchschaut hat.
Ich selber habe den Clip Space nur … naja zum Clippen benutzt. Lineare Transformationen im Clip Space sind halt projektive Transformationen im World Space. Ob das häufig nützlich ist, weiß ich nicht. ;)

(Achtung: Ich bin gerade in Klausurstress und mein Gehirn geplättet wie eine via Möbius-Transformation auf C abgemanschte Kugel. Kann also sein, dass ich gerade einen zu großen Brainfuck habe, um die Möglichkeiten des Clip-Space zu erkennen.)

Nachtrag:
CodingCat hat geschrieben:An diesem Punkt wäre wohl jedes andere (entsprechend reduzierte) textbasierte Format geeigneter, schöner, und sogar relativ einfach zu implementieren. Es siegt die Bequemlichkeit.
Ist doch OK. Darüber kann man nachdenken, wenn's ein Problem wird. Was es wohl nie wird, wobei es auch sehr gut LZ-komprimierbar sein dürfte.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

eXile hat geschrieben:Ich selber habe den Clip Space nur … naja zum Clippen benutzt. Lineare Transformationen im Clip Space sind halt projektive Transformationen im World Space. Ob das häufig nützlich ist, weiß ich nicht. ;)
Allzu häufig wohl nicht, aber im Rahmen von pixelgenauer Selektion, allgemeingültiger Sichtstrahlkonstruktion und Transformationswerkzeugen durchaus praktisch.

So lässt sich für die Selektion das Zentrum des gerenderten Bildes einfach an die Position der Maus verschieben, ohne dabei das Projektionszentrum der Kamera zu beeinflussen, indem man die entsprechende homogene Verschiebematrix per Verkettung nach Anwendung der Projektionsmatrix anhängt. Obwohl die eigentliche Projektion dort noch nicht stattgefunden hat, sorgt die w-Koordinate, die je nach Art der Projektion unterschiedlich ausfällt, dafür, dass die Verschiebung immer nach der Projektion im Bildraum "stattfindet". Auf diese Weise stimmen die Oberflächenpunkte unter der Maus bei der ursprünglichen Projektion und die Oberflächenpunkte im Zentrum eines 1x1-Objekt-ID-Ausschnitts bei der modifizierten Selektionsprojektion stets überein, ohne dass man überhaupt die Richtung des Sichtstrahls berechnen müsste.

Auch eine allgemeine Konstruktion des Sichtstrahls gestaltet sich sehr viel einfacher, als ich angenommen hatte: Im Grunde interessiert man sich hier für den Punkt auf der Near Plane, der mit dem betrachteten Pixel an (x, y) (Normierte Koordinaten in [-1, 1]) übereinstimmt. Hierzu könnte man (n * x, n * y, 0, n) mit der inversen Sicht-Projektionsmatrix transformieren, um den entsprechenden Punkt vor der Kamera in Weltkoordinaten zu erhalten. Dafür bedürfte es jedoch einer explizit bekannten Near Plane. Tatsächlich handelt es sich aber nach Dehomogenisierung bei (n * x, n * y, 0, n) und (x, y, 0, 1) um denselben Punkt. Transformiert man diesen zurück in Weltkoordinaten, reicht dort die Dehomogenisierung (p / p.w) aus, um den richtigen Punkt zu erhalten, die Near Plane muss hierzu nicht explizit bekannt sein.

Bei den Transformationswerkzeugen schließlich ist es gegebenenfalls wünschenswert, dass die Werkzeuge unabhängig von der perspektivischen Transformation stets dieselbe Größe beibehalten. Da nach der Welt-Sicht-Projektionstransformation immer noch lineare Koordinaten vorliegen, genügt es, dort die vierte Zeile der Welt-Sicht-Projektionsmatrix abzuziehen (welche gerade der Weltposition des jeweiligen Werkzeuges in den Clip Space transformiert entspricht), dann die jeweilige transformierte Vertexposition mit der W-Komponente der transformierten Werkzeugposition (Eintrag 4,4 in der WSP-Matrix) und einem gewünschten Skalierungsfaktur durchzumultiplizieren, und anschließend die transformierte Werkzeugposition (vierte Zeile) wieder hinzuzuaddieren.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von Schrompf »

Zur Erklärung meines Meckerbeitrags: ich bezog mich konkret auf diesen Beitrag
CodingCat hat geschrieben: [XML-Schnipsel]
Oh rly? Das muss ich wohl im Koma programmiert haben.
Ich fand an dem XML-Ausschnitt nichts Böses - es sieht halt aus wie automatisiert erstelltes XML. Ich nahm den Beitrag zum Anlass, aber ich will damit jetzt nicht aussagen, dass darin die Bosheit der Welt konzentriert ist oder was weiß ich. Das war eher exemplarisch gemeint, es gibt auch andere Beispiele von anderen Autoren. Krishty zum Beispiel schreibt auch gern Assembler-Schnipsel mit einem dekorativen GIF dazu, und ich erkenne nur anhand des Threads (Jammer oder Anti-Jammer), ob ihm dieser konkrete Compiler-Output jetzt gefällt oder nicht :-)

Fühl Dich bitte nicht angegriffen, das wollte ich definitiv nicht bezwecken. Stell Dir stattdessen einfach ein Schulterzucken zu diesem Beitrag vor und meine Frage, was daran jetzt so schlimm sei :) Das kann ich auch gern so posten, wenn Du möchtest. Aber es wär doch schöner, wenn's ohne Nachfrage auch erklärend wäre.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Ok, es hat mich nur irritiert, weil ich in diesem Thread doch auch schon relativ ausführlich auf einige Details eingegangen bin, inklusive Hintergedanken und angedachter Alternativen.

Und nochmal zur eben angesprochenen Sichtstrahlkonstruktion: Damit auch diese unabhängig von der Projektionsart ist, bedarf es natürlich zweier Punkte; nimmt man einfach die Kameraposition als Strahlursprung, so erhält man offensichtlich trotz orthographischer Projektion keine parallelen Sichtstrahlen. Doch auch ein zweiter Punkt lässt problemlos sich analog zum ersten konstruieren. Leider kann das nicht der Punkt an Kameraebene 0 sein. Weil dessen w-Koordinate bei perspektivischer Transformation ebenfalls 0 wäre, der entsprechende Punkt (x, y, -inf, 1) sich jedoch nur bedingt zur Transformation durch Matrizen eignet (schon wegen 0 * inf = NaN), wäre das Ergebnis ziemlich unbrauchbar. Mit einem kleinen Epsilon lässt sich allerdings ein Punkt auf dem Sichtstrahl in der Nähe der Kameraposition konstruieren, so liefert zum Beispiel (x, y, -1, 1) nach inverser Transformation und Dehomogenisierung im Welt-Raum brauchbare Ergebnisse (liegt auf dem Sichtstrahl mittig zwischen Kamera und Near Plane).

Damit funktionieren alle drei angesprochenen Verfahren ohne Modifikation sowohl mit orthographischer als auch mit perspektivischer Transformation. Darüber war ich zunächst durchaus erstaunt, bin ich doch sonst im Internet meist nur auf umständlich geometrisch hergeleitete und sehr projektionsspezifische Ansätze gestoßen.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von dot »

CodingCat hat geschrieben:Leider kann das nicht der Punkt an Kameraebene 0 sein. Weil dessen w-Koordinate bei perspektivischer Transformation ebenfalls 0 wäre [...]
Sollte das nicht eher die Viewspace z-Koordinate der near plane sein?
Abgesehen davon kannst du einfach zwei Punkte an z = 0 und z = 1 mit jeweils w = 1 konstruieren und nach der Rücktransformation wieder durch w teilen ;)

Code: Alles auswählen

    public ray ComputePickRay(vector2 p)
    {
      vector4 ph;
      ph.x =  p.x;
      ph.y =  p.y;
      ph.z =  1.0f;
      ph.w =  1.0f;
      ph = InvProjectionMatrix * ph;
      float rhw = 1.0f / ph.w;
      vector3 p1 = new vector3(ph.x * rhw, ph.y * rhw, ph.z * rhw);

      ph.x =  p.x;
      ph.y =  p.y;
      ph.z = -1.0f;
      ph.w =  1.0f;
      ph = InvProjectionMatrix * ph;
      rhw = 1.0f / ph.w;
      vector3 p0 = new vector3(ph.x * rhw, ph.y * rhw, ph.z * rhw);

      vector3 d = p1 - p0;
      d.normalize();

      return new ray(InvViewMatrix.transformPoint(p0), ViewMatrix.transformDirectionTranspose(d));
    }
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

dot hat geschrieben:Abgesehen davon kannst du einfach zwei Punkte an z = 0 und z = 1 mit jeweils w = 1 konstruieren und nach der Rücktransformation wieder durch w teilen
Du meinst wohl z = 0 und z = -1. z = 1 ginge zwar in vielen Fällen auch und läge gerade bei der Far Plane, je nach Projektionsmatrix handelt man sich damit aber eventuell doch wieder unschön große Werte und Ungenauigkeiten ein (besonders bei Far Plane in der Unendlichkeit könnte das wieder problematisch werden, genau wie der Punkt im Projektionszentrum, siehe Post obendrüber). Und ja, warum genau das geht, habe ich doch gerade beschrieben. ;)
dot hat geschrieben:Sollte das nicht eher die Viewspace z-Koordinate der near plane sein?
Die z-Koordinate im Kameraraum entspräche zwar im Falle einer perspektivischen Projektion gerade der w-Koordinate im Clip Space, da ich aber anhand der Identifikation eines Punkts (x,y,z) mit allen Punkten (x,y,z,1) * w in der projektiven Geometrie argumentiere, spreche ich hier von der w-Koordinate. ;)
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von dot »

Ok, vermutlich bin ich grad etwas verwirrt, aber willst du deine Punkte nicht im Clipspace bauen? In dem Fall entspräche ein Punkt auf der far Plane mit einer infinite Projection Matrix doch einfach (x, y, *, 0)!? Der muss dann durch die inverse Projection Matrix und dann homogenisieren. Habs mir jetzt nicht ganz durchgedacht, aber sollte doch eigentlich funktionieren!?

EDIT: Das Homogenisieren kann man sich evtl. sogar sparen weil man eh nur an Richtungen interessiert is...

EDIT2: Die geometrisch basierten Ansätze sind eben für Laien (die nicht so sehr auf projektive Geometrie stehen) leichter nachzuvollziehen und wohl auch etwas effizienter weil sie in der Regel nur eine Matrixmultiplikation brauchen.
Ich verwend aber auch lieber die allgemein gültige Variante mit zwei Punkten, find ich einfach viel eleganter :D
Wobei ich mir denk dass man eigentlich evtl. irgendwie den Strahl schon direkt im Clipspace bauen und dann einfach nurmehr rücktransformieren können müsste. Hab mir das aber noch nie ganz durchüberlegt...
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

(x, y, 1, 1) wäre eine Repräsentation des Pixels an (x, y) projiziert auf eine endliche Far Plane, vor der Division wäre das (f * x, f * y, f, f).

Konstruiert man entsprechend dem Strahl im World Space einen Strahl im Clip Space, mit Ursprung in der Kameraebene, bei perspektivischer Transformation also (0 * x, 0 * y, -nf/(f-n), 0), und Punkt auf der Near Plane, bei perspektivischer Transformation (n * x, n * y, 0, n), so entspricht letzterem der Punkt (x, y, 0, 1) und ersterem der Punkt (x, y, -inf, 1). Mit Kameraebene meine ich dabei z = 0 im View Space, nicht z = n.

Ich sehe im Moment keinen Weg, für den Ursprung, an Stelle des Pixels projiziert ins Projektionszentrum, allgemeingültig einen Punkt im Clip Space zu konstruieren. Aber mit Eps > 0 und (Eps * x, Eps * y, (Eps-n)f/(f-n), Eps) bzw. (x, y, (1-n/Eps)f/(f-n), 1) lässt sich eben ein Punkt nahe der Kameraebene projizieren, für Eps = n/2, d.h. Urpsrung in der Mitte zwischen Kamera und Near Plane, ergibt sich (x, y, -f/(f-n), 1), wobei man getrost mit f = f-n rechnen kann, und sich der Punkt im Clip Space zu (x, y, -1, 1) vereinfachen lässt.

Ein Punkt (x, y, *, 0) würde wohl bei orthographischer Projektion nach Rücktransformation wieder auf einen Punkt mit w-Koordinate 0 abgebildet, was sich mit der anschließenden Division auch nicht gut verträgt. :-/
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Ich habe mich lange um ein ordentliches Ressourcen-System gedrückt, nun habe ich mir endlich die Zeit genommen. Folgende Fragen stehen dabei im Raum: Wo liegen die Ressourcen, wie werden sie geladen, wie werden sie programmintern eindeutig identifiziert, wie werden sie extern (persistenten Speicherabbildern, z.B. Asset- oder Szenendatei) identifiziert?

Programmintern erscheinen mir nur absolute und/oder kanonisierte Pfade sinnvoll, um Ressourcen schnell und eindeutig identifizieren zu können, wobei die Eigenschaften solcher Pfade zunächst nicht festgeschrieben sind. Hierzu habe ich ein PathResolver-Interface eingeführt, welches beliebige Strings zur Ressoucenidentifikation entgegennimmt und diese in eindeutige Pfade umwandelt. So nimmt die FileSystemPathResolver-Implementierung beispielsweise alle Arten von Dateipfaden entgegen (absolut, relativ zum Programm oder relativ zu einer gegebenen Pfadumgebung, z.B. "Meshes", "Materials" etc.), und wandelt diese in absolute Dateipfade um. An jede Ressourcenverwaltungsklasse wird also solch ein polymorphes PathResolver-Objekt übergeben, welches dort für alle nachfolgenden Anfragen gespeichert wird. Die Ressourcenverwaltungsklassen lösen dabei angefragte Pfade stets zunächst zu eindeutigen absoluten Pfaden auf, bevor sie diese mit den Pfaden bereits geladener Ressourcen vergleichen.

Um nun aufgelöste Pfade jeweils korrekt interpretieren zu können und Zugriff auf den Inhalt dahinter zu erhalten, gibt es ein weiteres Interface ContentProvider, welches aufgelöste Pfade entgegennimmt und und Objekte zurückgibt, die das Content-Interface implementieren. Ressourcenverwaltungsklassen speichern also ein weiteres polymorphes ContentProvider-Objekt, welches als Fabrik für Content-Objekte dient. Zum Öffnen einer bestimmten Ressource übergibt die Ressourcenverwaltungsklasse den aufgelösten Pfad an sein ContentProvider-Objekt. Dieses erzeugt ein passendes Content-Objekt, welches in der FileContent-Implementierung zum Beispiel durch Herstellen eines Memory-Mappings Direktzugriff auf den Inhalt der jeweiligen Datei gewährt.

Zuletzt bleibt die Frage der externen Identifikation von Ressourcen. Hier habe ich mich für den Moment dazu entschlossen, Pfade relativ zu einer ressourcentypabhängigen Pfadumgebung zu speichern, für Meshes wäre das z.B. die Location "Meshes", die beim Laden problemlos wieder durch einen FileSystemPathResolver aufgelöst werden kann.

(Das Clone-Muster eignet sich hervorragend zum Speichern leichtgewichtiger polymorpher Objekte.)
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Ich verstehe jetzt, warum so viele Entwickler den Weg gehen, zwei Engines zu schreiben, eine für die Content Creation und eine für das Endprodukt. Es ist einfach unendlich mühsam, bisweilen sogar unmöglich, dynamische Datenstrukturen halbwegs so effizient zu gestalten wie statische Äquivalente.

So wäre es beispielsweise für das Rendering ein schöner datenorientierter Ansatz, Culling-, Transformations- und Zustandsdaten konsekutiv in getrennten Arrays zu halten: Cullingdaten am besten in Cull-Reihenfolge, Transformations- und Zustandsdaten in Render- und Materialreihenfolge. Im Renderablauf würden in diesem Fall alle Zustandsdaten genau einmal konsekutiv durchlaufen, wobei allenfalls Vorwärtssprünge aufgrund von vorangegangenem Culling aufträten. Transformationsdaten würden gleichermaßen, jedoch für jeden Teilrenderablauf, einmal konsekutiv (mit Sprüngen) durchlaufen (ohne dass dabei irrelevante Zustandsdaten aus anderen Teilrenderabläufen eingestreut wären). Culling-Daten würden im Rahmen des Culling ein einizges Mal konsekutiv und sogar ohne Sprünge durchlaufen.

In einer (weitgehend) statischen Umgebung ließe sich jede dieser Anordnungen problemlos umsetzen: Wichtig wäre eine feste Anzahl von Render-Jobs, um die jeweiligen Datensegmente von vorneherein groß genug reservieren zu können, und zwei Vorsortierungen der Render-Jobs, um die jeweiligen Dateneinträge von vorneherein in der richtigen Reihenfolge in die Segmente legen zu können.

Gestaltet man dieselbe Struktur jetzt dynamisch, treten unzählige Probleme auf. Die Datensegmente müssen eventuell vergrößert werden, wodurch sich alle Daten verschieben können. Doch auch IDs statt fester Adressen helfen nicht: Render-Jobs können entfernt und hinzugefügt werden, wobei die Sortierung erhalten werden muss. Nicht nur Render-Jobs, sondern auch alle relevanten Dateneinträge müssen also verschoben werden. Um die Daten von Seite der zugehörigen Einheiten aktuell halten zu können (veränderte Transformation etc.), bedarf es einer umfangreichen Handle-Aktualisierungslogik, die die Einheiten über Verschiebung ihrer Daten informiert.

So erscheint es gar der einzig vernünftige Weg, bei der Content Creation auf unoptimierten Wegwerfcode zurückzugreifen, und beim Endprodukt am besten auf sämtliche Generizität zu pfeifen. Ich werde mich dann mal mit Handle-Logik abmühen. ;)
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

In der Zwischenzeit habe ich den datenorientieren Ansatz zum Rendering tatsächlich dynamisch umgesetzt: Jedes renderbare Objekt (Controller) registriert sich hierfür in einer Szenerie. Verändert sich die Zusammensetzung der Szenerie (heißt, Objekte werden hinzugefügt oder entfernt, was nur sehr selten vorkommen sollte), so werden alle renderbaren Objekte zunächst entsprechend eines (in der Regel materialabhängigen) Sortierindex neu sortiert. In dieser Reihenfolge wird später auch das Culling durchgeführt, worduch Objekte im gesamten Renderablauf schonmal grob nach Material sortiert sind. (Weglassen unsichtbarer Render Jobs zerstört die Sortierung natürlich nicht.)

Anschließend werden die registrierten Objekte in dieser neuen Reihenfolge zurückgerufen, um ihre RenderJob-Daten linear in mehreren, von der Szenerie bereitgestellten Speicherbereichen unterzubringen. Das Daten-Layout ist dabei nicht vorgeschrieben, dahinter stehen einfach Chunk-Allokatoren. Im Rahmen dieser Allokationen registriert jedes zurückgerufene Objekt auch gleich noch die Anzahl seiner Passes, sowie deren Einzel-Sortierindizes, die sich je nach Shader-Zusammensetzung der Materialien von den groben Sortierindizes unterscheiden können. Diese werden nun genutzt, um die einzelnen Passes noch einmal (getrennt, pro Pipeline Stage / Render Queue) vorzusortieren, bevor die renderbaren Objekte ein weiteres Mal zurückgerufen werden, um auch noch ihre Pass-Daten linear in den Speicher zu legen.

Alles bis hierhin passiert einmalig, nicht pro Frame.

Damit ergibt sich im Renderablauf das im vorigen Post beschrieben Speicherlayout: Culling und Einreihung in den Renderablauf in Materialreihenfolge; von mehreren Passes geteilte Objektdaten (z.B. Transformationsmatrizen) ebenfalls in Materialreihenfolge; Pass-Daten (z.B. Input Layouts, Vertex Buffers, Shader / State Setup) in "Stage-Queue-Shader-State-Reihenfolge". Viel schöner ist jedoch, dass die eigentlichen, über den Speicher verstreuten renderbaren Einzelobjekte im gesamten Renderablauf dank eines echten Funktionszeigers überhaupt nicht mehr referenziert werden.

Leider habe ich absolut keine Messdaten, wieviel schneller das jetzt läuft, weil ich im Moment nicht mal ansatzweise über ausreichend komplexe Testszenen verfüge.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: [Projekt] breeze 2.0

Beitrag von Artificial Mind »

Das klingt zwar alles soweit sinnvoll, allerdings ist mir beim Planen meiner Szene-Klasse aufgefallen, dass die Annahme "Objekte werden hinzugefügt oder entfernt, was nur sehr selten vorkommen sollte" vielleicht gefährlich ist. Ich weiß ja nicht, was für Verwendungszwecke dir vorschweben, aber wenn ich an Zauber, Projektile, sich ein- und ausloggende Spieler und generell auch an Charactere (NPC oder nicht), die das Gebiet betreten oder verlassen, denke, dann ändert sich die Szene vielleicht nicht pro Frame, aber mit alle 5-10 Frames sollte man schon rechnen, oder? Und in genau solchen Situationen (z. B. großen Kämpfen) will der Spieler am wenigsten einen Leistungseinbruch haben.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Objekte, die oft hinzugefügt oder entfernt werden, sollten einfach immer in der Szene bleiben, und per Culling (oder Visibility Flag, ich nutze einfach Sphären mit sehr negativem Radius) aktiviert / deaktiviert werden. Gebiete habe ich keine. Hätte ich welche, bestünde nur dann ein Problem, wenn ich das Speicherlayout auf Gebietslokalität optimieren wollte, was zweifelsohne sinnvoll wäre, aber wenn ich es einfach nicht tue, bin ich immer noch nicht schlechter dran als vorher bei vollständiger Fragmentierung. :mrgreen:
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von Schrompf »

Klingt ansonsten nach einem echt guten Ansatz. Da werde ich gerade ein bisschen neidisch. Die mangelnde Dynamik kann aber wirklich ein Problem werden. Was mir dazu von den Splitterwelten noch so einfällt:

- kurzlebige Lichter, Partikeleffekte, Objekte für Schüsse, Ausrüstung von Spielern und NSCs
- spontane Shader-Wechsel oder hinzugefügte Passes, z.B. zur Hervorhebung des interaktiven Objekts unter dem Mauszeiger
- wechselnde Texturen, z.b. die Spiegel-CubeMap auf dem Schwert, wenn ein Mensch ein Haus betritt oder verlässt.

und was mich interessieren würde: wie setzt Du die notwendigen Zusatz-Passes für Lichtquellen-Schatten, planare Spiegelungen und sowas um? Sind das dann separate Pipelines?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Schrompf hat geschrieben:- kurzlebige Lichter, Partikeleffekte, Objekte für Schüsse, Ausrüstung von Spielern und NSCs
Ja, sowas wird in der Tat etwas umständlicher. Mir fällt hierzu nichts anderes ein als das bereits genannte Caching: Alle möglichen Effekte vorher erzeugen und einfügen, dann an/abschalten. Für manche Effekte heißt das dann wohl auch, extra zu diesem Zweck Pools anzulegen. Andererseits würde ich so oder so stets um jeden Preis vermeiden, zur Laufzeit Objekte anlegen zu müssen.
Schrompf hat geschrieben:- spontane Shader-Wechsel oder hinzugefügte Passes, z.B. zur Hervorhebung des interaktiven Objekts unter dem Mauszeiger
- wechselnde Texturen, z.b. die Spiegel-CubeMap auf dem Schwert, wenn ein Mensch ein Haus betritt oder verlässt.
Interessanter und wichtiger Punkt, den ich bis jetzt nicht gesondert betrachtet habe. Die Rendering Pipeline bietet jedoch Pipeline Stages, die sich mittels Bitmasken an- und abschalten lassen. In der Szenerie finden sich also immer alle Passes, die erst bei der Einreihung in die Pipeline entsprechend der Bitmaske der aktuell gerenderten Perspektive herausgefiltert werden.
Schrompf hat geschrieben:und was mich interessieren würde: wie setzt Du die notwendigen Zusatz-Passes für Lichtquellen-Schatten, planare Spiegelungen und sowas um? Sind das dann separate Pipelines?
Fast, jedoch nicht separate Pipelines, sondern genau solche separaten Perspektiven mit eigenen Pipeline-Stage-Bitmasken. Renderbare Objekte können sich über einen Flag im Render Job für einen Rückruf bei erfolgter Einreihung in die Pipeline registrieren. Dieser Rückruf wird zum Beispiel von Lichtern genutzt, um entsprechend der jeweiligen Perspektive weitere Perspektiven für Schatten mit Shadow-Stage-Bitmaske in die Pipeline einzufügen.

Ich sollte wirklich langsam mal den Source hochladen. Auch wenn ich im Moment wohl kaum zu ordentlichen Samples und/oder Dokumentation komme, würde damit vielleicht einiges klarer.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Ich habe gerade zum ersten Mal in meinem ganzen Leben eine vollständige 3D-Szene in XML gespeichert und erfolgreich wieder geladen. Deshalb nun gleich noch ein kurzer Abriss über das Serialisierungssystem.

An unterster Stelle steht ein Typverzeichnis, das registrierten Typen (int, float, ...) eine eindeutige Identifikationsnummer aus [0, n] zuordnet. Das Typverzeichnis wird bei Programmstart automatisch durch die dynamischer Initialisierung statischer Typindex-Konstanten aufgebaut, die sich dezentral verstreut in verschiedenen Übersetzungseinheiten finden, wenn sie dort benötigt werden. Das sähe bei rohem Zugriff in etwa so aus:

Code: Alles auswählen

const uint4 IntTypeIndex = GetTypeIndex().Add("int"); // Fiktiver direkter Zugriff auf Typ-Index, so nicht im Quelltext
Daneben gibt es ein Text-Serialisierer-Verzeichnis, das in einem einfachen Vektor entsprechend den Typ-Identifikationsnummern Zeiger auf Text-Serialisierer-Objekten speichert. Diese Text-Serialisierer-Objekte wiederum liegen beliebig verteilt als statische Objekte in einzelnen Übersetzungseinheiten, wo sie vollkommen dezentral durch noch mehr statische Hilfsobjekte bei deren dynamischen Initialisierung (also automatisch bei Programmstart, sehr praktisch) in das globale Text-Serialisierer-Verzeichnis eingetragen werden.

Code: Alles auswählen

class Serializer;
struct Hilfskonstrukt
{
   Serializer serializer;
   Hilfskonstrukt()
   {
      // Fiktiver direkter Zugriff auf Serializer-Index, so nicht im Quelltext
      GetTextSerialization().AddSerializer(&serializer);
   }
};
const Hilfsklasse Hilfsobjekt;
Da das alles für jeden Wertetyp ziemlich umständlich wäre, wurde das ganze am Ende in bequeme Templates zusammengefasst, die das intern erledigen:

Code: Alles auswählen

const uint4 IntTypeIndex = RegisterType<int>();
Dasselbe Muster gibt es nun noch einmal eine Stufe höher für Entity- und Controller-Typen. Statische Entity- und Controller-Serialisierer-Objekte werden bei Programmstart durch statische Hilfsobjekte in entsprechende globale Entity- oder Controller-Serialisierer-Verzeichnisse eingetragen.

Wird nun ein Asset oder eine Welt geladen, so wird zunächst für jedes Entity entsprechend eines "type"-XML-Attributes der passende Serialisierer aus dem Verzeichnis gefischt und damit das Entity geladen. Der Entity-Serialisierer fischt seinerseits für jeden Controller entsprechend seines "type"-XML-Attributes weitere Controller-Serialisierer aus dem Verzeichnis, lädt auch diese, und fügt sie in die Controller-Liste des jeweils geladenen Entities ein. Die meisten Serialisierer greifen dabei auch noch auf das generische Property-Serialisierungssystem zurück, welches in der Regel aufgrund gegebener Property-Reflection-Informationen (siehe ältere Posts) mithilfe des eingangs beschriebenen Werte-Typverzeichnisses alle numerischen Objekteigenschaften voll automatisch laden kann.

Übrig bleiben für die Controller-Serialisierer nur strukturspezifische Aufgaben. So muss der Mesh Controller beispielsweise neben generischen Objekteigenschaften auch Mesh-Subsets und deren Materialzuordnungen laden. Materialien haben mir lange Zeit großes Kopfzerbrechen bereitet, weil es mir widerstrebt hätte, wenn alle Materialien in extra Materialdateien abgelegt werden müssten. Einfach alle Materialien aus dem Material Cache, die über keine Dateizuordnung verfügen, mit in die Map-Datei zu schreiben, erschien mir jedoch ebenso unschön. Schlussendlich habe ich heute noch in den gesamten Serialisierungsprozess eine Serialisierungswarteschlage integriert, welche von beliebigen Serialisierer-Objekten zu beliebiger Zeit mit zusätzlichen Serialisierungsaufgaben befüllt werden kann, welche dann nach allen regulären Serialisieurngsvorgängen (im Moment nur Entities und Controllers) ausgeführt werden. Mit einer zusätzlichen Materialserialisierungsaufgabe in der Warteschlange, die im Laufe der regulären Serialisierung alle referenzierten Materialien sammelt (jedes Material nur einmal!), und diese am Ende der Serialisierung mit in die Map-Datei hineinspeichert, bin ich auch dieses Problem los. Natürlich müssen diese Materialien dann auch vor allen Entities und Controllers wieder geladen werden. Die Lösung liegt nach all den statischen Systemen nahe, eine weitere globale Serialisierungswarteschlange, die bei Programmstart durch statische Hilfsobjekte mit Serialisierungsaufgaben gefüllt wird, erledigt auch dies.

Im Moment sieht das Ergebnis so aus:

Code: Alles auswählen

<world name="Some Scene" nextPersistentID="2">
	<entities>
		<e name="Barn" id="0" type="Entity">
			<properties>
				<p n="cell">0;0;0</p>
				<p n="position">0.984296083;1.52951145;1.46267819</p>
				<p n="orientation">0.982881844;-0.0469291434;0.178160235;0.0734675601;0.986638784;-0.145418867;-0.16895543;0.15601857;0.973197043</p>
				<p n="scaling">1;1;1</p>
			</properties>
			<controllers>
				<c type="MeshController" mesh="C:/Development/Graphics/breeze 2/Bin/Data/Meshes/Static/Barn/Barn1.mesh" materialName="beMeshController.Material"/>
			</controllers>
		</e>
		<e name="Light" id="1" type="Entity">
			<properties>
				<p n="cell">0;0;0</p>
				<p n="position">0;-1.86264515e-009;-7.4505806e-009</p>
				<p n="orientation">1;0;0;0;1;0;0;0;1</p>
				<p n="scaling">1;1;1</p>
			</properties>
			<controllers>
				<c type="DirectionalLightController">
					<properties>
						<p n="color">1;1;1;1</p>
						<p n="attenuation">1</p>
						<p n="attenuation offset">1</p>
						<p n="range">2.00000007e+032</p>
						<p n="shadow">0</p>
						<p n="shadow resolution">1024</p>
					</properties>
				</c>
			</controllers>
		</e>
	</entities>
	<materials>
		<m name="beMeshController.Material" effect="C:/Development/Graphics/breeze 2/Bin/Data/Effects/2.0/Materials/Simple.fx">
			<setup>
				<properties>
					<p n="Diffuse">1;1;1;0.0529999994</p>
					<p n="Specular">1;1;1;0</p>
				</properties>
			</setup>
			<setup effect="C:/Development/Graphics/breeze 2/Bin/Data/Effects/2.0/Prototypes/Shadow.fx"/>
			<setup effect="C:/Development/Graphics/breeze 2/Bin/Data/Effects/2.0/Prototypes/Feedback.fx"/>
			<technique name="Geometry" idx="0" setup="0"/>
			<technique name="Shadow" idx="1" setup="1"/>
			<technique name="ObjectIDs" idx="2" setup="2"/>
		</m>
	</materials>
</world>
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

sourceRelease.png

Wenn auch leider wenig feierlich, ab sofort ist alles da.

Der Code von breeze 2.0 macht regen Gebrauch von meiner bereits des öfteren hier verlinkten C++-Bibliothek lean, auch deren Code könnte also zum Verständnis hilfreich sein.

Für eine Weile muss ich den Source wohl erstmal ohne Support stehen lassen, ich hoffe er hilft und inspiriert dennoch. Für Rückmeldung bin ich jederzeit sehr dankbar.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
joggel

Re: [Projekt] breeze 2.0

Beitrag von joggel »

Coool... vlt. verstehe ich dann endlich mal ein wenig mehr was hier immer geschrieben wurde.
gracias!
Benutzeravatar
Jonathan
Establishment
Beiträge: 2395
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von Jonathan »

D.h. deine komplette Engine ist jetzt OpenSource? Nicht schlecht :D
Aber sollte es da nicht eine etwas offiziellere Ankündigung geben?
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

Jonathan hat geschrieben:D.h. deine komplette Engine ist jetzt OpenSource? Nicht schlecht :D
Ja. :)
Jonathan hat geschrieben:Aber sollte es da nicht eine etwas offiziellere Ankündigung geben?
Da im Moment wohl kaum jemand ernsthaft damit arbeiten könnte, sehe ich dafür im Moment eigentlich noch keinen Bedarf. (Andererseits könnte mein "Blog" echt mal ein Update vertragen. :mrgreen:)

Inzwischen ist auch eine vorläufige API-"Dokumentation" online.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: [Projekt] breeze 2.0

Beitrag von eXile »

Okay, wth machst du in DirectionalLight.fx? (Meine Richtungslichtquellen sehen eigentlich in Codeform etwas anders aus.) ;)
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Projekt] breeze 2.0

Beitrag von CodingCat »

An welcher Stelle? Licht/Schatten?
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Antworten