Thread overview
Horde3D grafik motoru
Apr 14, 2011
erdem
Apr 14, 2011
erdem
Apr 14, 2011
erdem
April 14, 2011

D ile oyun geliştirmek isteyen arkadaşlar için eğer bir grafik motoru kullanmak isterseniz Horde3D'yi tavsiye edebilirim. OPENGL kullandığı için platformdan bağımsız uygulamalar geliştirebiliyorsunuz. Kaynak kodu C++ ile nesne yönelimli şekilde yazılmış.

İşte örnek bir ekran görüntüsü:

http://www.horde3d.org/screenshots/alfred.jpg

Ana sayfası:

http://www.horde3d.org

D ile kullanabilmek için ilintiler (bindings):

http://www.horde3d.org/wiki/index.php5?title=Language_Bindings

http://www.horde3d.org/forums/viewtopic.php?f=1&t=180

Bu arada ben bu bir kütüphane için ilinti yazma (d binding) merak etmeye başladım.

Gene ilgimi çeken grafik kütüphanelerinden biri.Kendi sitesindeki açıklamasına göre:

http://www.clutter-project.org

'Clutter hızlı, taşınabilir ve dinamik grafik arabirimleri oluşturmak için tasarlanan açık kaynak bir yazılım kütüphanesi'

Ayrıca Google Chrome OS'un açık kaynaklı sürümü de sanırım bu kütüphaneyi kullanıyormuş.

Aslında bu kütüphane için D ilintileri yok. Var olan projeler bittikten sonra bu kütüphane için D ilintileri yazmayı düşünürmüsünüz. Böylece hem bir kütüphane için nasıl ilinti (binding) yazılacağını öğrenmiş oluruz, hem de bir grafik kütüphanesiyle çalışmış oluruz. Bu da yeni bir deneyim olur.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 14, 2011

Alıntı (acehreli):

>

Uyarı: Ben D programını yine de oluşturamadım. Nedeni; 32-bit, 64-bit, vs. etrafında dönüyor ama onu çözecek zamanım yok. :) (Derleme tamam; sorun bağlamada.)

Ama amacıma ulaştım: C kütüphanesi için bir D ilintisi yazdım ve derleyebildim.

Teşekkürler. İyi bir başlangıç olmuş oldu.

Ben de bağlayamadım. Anladığım kadarıyla sorun gcc tarafından oluşturulan object dosyalarının D derleyicisi tarafından oluşturulan object dosyaları ile aynı formatta olmamasından kaynaklanıyor.

Burada yazanlara göre Digital Mars araçları Intel 32 bit OMF nesne(object) formatını kullanıyormuş.

http://www.digitalmars.com/ctg/coff2omf.html

Ama burada gcc'nin oluşturduğu nesne formatını anlayamadım. Bazı kişilerin söylediklerinden ben sanki COFF formatı kullanıyor gibi anladım.

http://stackoverflow.com/questions/3642940/writing-a-d-d2-binding-for-existing-c-libraries

Objconv isimli bir programı denedim. Ama başarılı olmadı:

http://www.agner.org/optimize/objconv.zip

$ ./objconv -fomf -nu foo.o

Input file: foo.o, output file: foo.obj
Converting from ELF32 to OMF32
Adding leading underscores to symbol names

 2 Debug sections removed
 0 Exception sections removed
 0 Changes in leading underscores on symbol names

Bu programın çıktısına göre sanki ELF32'den OMF32'ye çeviriyormuş gibi geldi. Ya da Linux altında konsol uygulamaları da 16bit olarak mı geçiyor bilmiyorum açıkçası :)

Sanırım buraki bir program direkt bir C başlık dosyasını d uzantılı bir dosyaya çevirebiliyormuş( ama *.exe dosyasıymış :o )

http://www.digitalmars.com/d/2.0/htod.html

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 14, 2011

Alıntı (acehreli):

>

Çalışıyor:

Evet bende de bu şekilde çalıştı. Ben de ne kadar alakasız konulara bakmışım.

'
$ ./deneme
sonuç: 33, s.c: �, s.d: 2.5'

Teşekkürler..

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 14, 2011

Alıntı (erdem):

>

bir kütüphane için ilinti yazma (d binding) merak etmeye başladım.

İlinti aslında çok basit bir kavram.

C başlık dosyalarını D programlarına ekleyemiyoruz ama o başlıkların tanımlarını içeren kütüphaneleri D programlarında kullanabiliyoruz.

Örneğin şöyle bir C kütüphane başlığı olsun:

// foo.h

typedef struct S
{
   char c;
   double d;
} S;

int foo(S * s, char c, int i, double d);

Kütüphanenin gerçekleştirmesi de şu:

// foo.c

#include "foo.h"

int foo(S * s, char c, int i, double d)
{
   s->c = c + i;
   s->d = d * 2;
}

Onu bir kütüphane (tek .o da olur) haline getirmek için:

'gcc -c foo.c'

Biz, S yapısını ve foo işlevini D programımızda kullanmak istiyoruz:

import std.stdio;

void main()
{
   S s;
   int sonuç = foo(&s, 'a', 42, 1.25);
   writefln("sonuç: %s, s.c: %s, s.d: %s", sonuç, s.c, s.d);
}

foo.o ile birlikte derliyoruz ve tabii S ve foo bilinmedikleri için derleme hatası alıyoruz.

'$ dmd deneme.d foo.o
deneme.d(35249): Error: undefined identifier S
deneme.d(35249): Error: S is used as a type
deneme.d(35250): Error: undefined identifier foo
'

Sorun: C başlık dosyalarını D modüllerine "#include edemeyiz".

Çözüm: foo.h başlığının D'ye uyarlanmışını yazacağız. İşte foo_d.d:

// foo_d.d

module foo_d;

struct S
{
   char c;
   double d;
}

extern (C) int foo(S * s, char c, int i, double d);

Gördüğünüz gibi, foo.h ile hemen hemen bire bir... (Tabii ki değil ve akıllı davranarak diziler gibi konulara girmedim.)

Şimdi bu modülü D programımıza ekleyebiliriz:

import std.stdio;
import foo_d;           // <--
// ...

Uyarı: Ben D programını yine de oluşturamadım. Nedeni; 32-bit, 64-bit, vs. etrafında dönüyor ama onu çözecek zamanım yok. :) (Derleme tamam; sorun bağlamada.)

Ama amacıma ulaştım: C kütüphanesi için bir D ilintisi yazdım ve derleyebildim.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 14, 2011

Bir kaç farkla çalıştı:

  1. foo.c'de unuttuğum dönüş satırı ve c + 1 daha görünür bir karakter oluşturur:
   s->c = c + 1;
// ...
   return 33;
  1. foo.o'yu -m32 ile oluşturun:

'gcc -m32 -c foo.c'

  1. Program satırına foo_d.d'yi de ekleyin:

'dmd deneme.d foo.o foo_d.d'

Çalışıyor:

'$ ./deneme
sonuç: 33, s.c: b, s.d: 2.5
'

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]