Forum: Diğer Konular RSS
Horde3D grafik motoru
erdem (Moderator) #1
Member since Jul 2009 · 463 posts · Location: Eskişehir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Subject: Horde3D grafik motoru
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ü:

[Image: 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.p…?title=Language_Bind…

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.
acehreli (Moderator) #2
User title: Ali Çehreli
Member since Jun 2009 · 2279 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by 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
erdem (Moderator) #3
Member since Jul 2009 · 463 posts · Location: Eskişehir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by 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-…

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
This post was edited on 2011-04-14, 13:43 by erdem.
acehreli (Moderator) #4
User title: Ali Çehreli
Member since Jun 2009 · 2279 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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;

2) foo.o'yu -m32 ile oluşturun:

gcc -m32 -c foo.c

3) 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
erdem (Moderator) #5
Member since Jul 2009 · 463 posts · Location: Eskişehir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by 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..
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Not logged in. · Lost password · Register
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Current time: 2012-05-18, 09:53:14 (UTC -07:00)