3DS Bibliothek für C#

Es gibt unter http://code.google.com/p/lib3ds/ ein Google Code Projekt welches eine Bibliothek zum lesen und schreiben von 3DS implementiert. Leider gab es bis vor kurzem keine freie 3DS Bibliothek für .NET respektive Mono. Nun gibt es unter http://code.google.com/p/lib3dsnet/ eine Portierung der lib3ds, welche wie das Original unter LGPL steht.

Die Bibliothek unterstützt dabei nicht nur das lesen und schreiben, sondern auch alle möglichen Arten von 3DS Nodes wie Kameras oder Meshes. Auch die Transformation der Objekte zueinander wird in dieser Bibliothek vorgenommen. In Grenzen kommt lib3ds.Net auch mit defekten 3DS Dateien zurecht. Nach den ersten Tests funktioniert die Bibliothek tadellos :)

Weitere Informationen gibt es unter:
http://en.wikipedia.org/wiki/.3ds

Probleme mit textContent und dem Internet Explorer 8

Der Internet Explorer 8 hat mit der Javascript Eigenschaft textContent so seine Probleme. Es kommt ein undefined heraus wenn man diese Eigenschaft im Internet Explorer 8 abfragt. Eli Grey hat für dieses Problem eine schöne Lösung gefunden:

if (Object.defineProperty && Object.getOwnPropertyDescriptor && !Object.getOwnPropertyDescriptor(Element.prototype, "textContent").get)
 (function() {
     var innerText = Object.getOwnPropertyDescriptor(Element.prototype, "innerText");
     Object.defineProperty(Element.prototype, "textContent",
     { // It won't work if you just drop in innerText.get
       // and innerText.set or the whole descriptor.
       get : function() {
         return innerText.get.call(this)
       },
       set : function(x) {
         return innerText.set.call(this, x)
       }
     }
  );
 })();

Diese Funktion fügt man dabei in eine extra Javascript Datei ein und bindet sich dann per Browserweiche ein:

<!--[if gte IE 8]><script type="text/javascript" src="textContent.js"></script><![endif]-->

Anschließend kann man die textContent Eigenschaft normal benutzen.

Weitere Informationen gibt es unter:
http://eligrey.com/blog/post/textcontent-in-ie8

Probleme mit dem Abfragen der Cursortasten unter .NET

Unter .NET bzw. Windows Forms gibt es für das Abfragen von Tasten die Events KeyDown, KeyUp und KeyPress, welche am Formular hängen bzw. an den Controls. In meinem Fall hängen sie an einem Formular bei welchem die KeyPreview Eigenschaft auf true gesetzt ist.

Mit diesen Events kann man problemlos fast alle Tasten abfangen. Problematisch wird es aber bei den Cursortasten. Hier bekomme ich nur ein KeyUp Event. Nun gibt es eine Möglichkeit diese Tasten trotzdem abzufragen in dem die Funktion ProcessCmdKey überladen wird:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    bool shift=(keyData&Keys.Shift)!=0;
    bool control=(keyData&Keys.Control)!=0;
    bool alt=(keyData&Keys.Alt)!=0;
    Keys unmodifiedKey=(keyData&Keys.KeyCode);

    if(unmodifiedKey==Keys.Up) DoFoobar(unmodifiedKey);

    return base.ProcessCmdKey(ref msg, keyData);
}

Allerdings funktionierte diese Methode nicht wie gewünscht. Eine andere Methode ist die Überladung der Funktion IsInputKey. Dort wird dann festgelegt das die Cursortasten wie normale Eingabetasten behandelt werden. Allerdings brachte es nichts, diese Funktion im Hauptformular zu überladen, da sie dort nie erreicht wurde. Deshalb wurde sie in dem im Formular befindlichen OpenGL Control überladen:

protected override bool IsInputKey(System.Windows.Forms.Keys keyData)
{
    if((keyData&Keys.KeyCode)==Keys.Up) return true;
    if((keyData&Keys.KeyCode)==Keys.Right) return true;
    if((keyData&Keys.KeyCode)==Keys.Left) return true;
    if((keyData&Keys.KeyCode)==Keys.Down) return true;

    return base.IsInputKey(keyData);
}

Damit kamen die Events für die Cursortasten ganz normal bei den entsprechenden Events des Hauptformulares an.

Weitere Informationen gibt es unter:
http://stackoverflow.com/questions/2434834/processcmdkey-wait-for-keyup
http://familie-ottenhaus.de/simon/blog/2009/12/csharp-eigenes-control-keys-up-down-left-right-onkeydown-onkeypress-vs-processcmdkey/

Die drei Fragezeichen

Das Visual Studio von Microsoft besitzt ja eine Funktion zur automatischen Einrückung und Formatierung des Quellcodes. Diese funktioniert auch fast immer. Kopiert man aber z.B. folgenden Ausdruck:

object o=1;
int i=o as int? ??1;

in eine Datei macht das Visual Studio dieses hier daraus:

object o=1;
int i=o as int???1;

Das Problem ist das der Ausdruck nun einen Syntaxfehler produziert und damit ungültig ist. Hier sollte Microsoft mal nachjustieren ;)