ITJA
Member
ANA MOTOR DOSYALARI
11299 "Yeni Glb Zirhi" ... VALUE3 (Zırhın ShapeIndex'i)
(Burası %100 klasik Metin2 mantığıdır, GLTF sistemi Item_Proto'ya karışmaz).
Normalde .msm dosyanda zırhı tanıtırken şöyle yazarsın:
GLTF (.glb) Sisteminde Örnek Kullanım:
YUKARIDAKİ DOSYALAR NEYİ AMAÇLIYOR?
Oyuna girdiğinde "Kardeşim bana X klasöründeki kilic.glb dosyasını bul ve parçala" der.
Model.cpp kılıcı okuduktan sonra bu Mesh dosyasına paslar. Mesh dosyası, "Tamam bu kılıç 3000 üçgenden (poligon) oluşuyor, işte noktaları şunlar" diyerek Vertex Buffer (VB) ve Index Buffer (IB) dediğimiz ekran kartı belleklerini oluşturur. Yani ekran kartına "Al bu üçgenleri kendi hafızanda tut" der.
O yukarıdaki Mesh dosyası sadece renksiz/bembeyaz üçgenler üretti. Material ise o üçgenlerin üzerine:
Diğer bütün dosyalar sadece okudu, hazırladı ve boyadı. ModelInstance ise senin oyun içinde farenle sağa sola dönerken gördüğün o anlık şeydir.
Yaptığımız o devasa okuma/boyama/çizme işlemlerinin hiçbirini Metin2'nin ana kodları (InstanceBase.cpp vs.) anlamaz. Metin2 kodları sadece Thing kelimesinden anlar (Orijinal Granny render sistemi GrpThing mantığıyla çalışır).
İşte bu dosyalar, Metin2'nin sana "Kılıcı kuşan" dediğinde, arka planda bizim GLTF sistemini gizlice ateşleyen ajan bağlayıcılardır.
dosyalar DX9 VE ÜZERİ FİLESLER UYGUN
FİLESİNİZ DX8 İSE BOŞUNA KURMAYA ÇALIŞMAYIN..
MANTIK: gr2 aynı devam kalıyor. ama ek olarak yani paralel olarak .glb dosyalarını gr2. dosyalarını nasıl nerede nasıl kullanıyorsanız bu sistemi kurarak istediğiniz gibi kullanın.
tinygltf/json.hpp at release · syoyo/tinygltf
tinygltf/tiny_gltf.h at release · syoyo/tinygltf
1- PACK TARAFINDA (Dosyaların Yerleşimi)
Normalde bir zırh eklerken .gr2 model dosyasını atarsın, sonra klasörün içine bir de .dds VEYA .tga resim dosyasını atarsın, değil mi? .glb'de bu iş çok daha rahattır veya aynıdır.- Seçenek A (Tek Dosya - Embedded):
.glb (GLTF Binary) formatının en büyük özelliği, zırhın kaplamasını (resmini), PBR metalik parlama ayarlarını ve kemiklerini kendi içine (tek bir dosya halinde) gömebilmesidir.
Yani pack/pc/warrior/ klasörüne sadece yeni_zirh.glb dosyasını atarsın. Ekstra .dds atmana gerek kalmaz! - Seçenek B (Ayrı Dosyalar - External):
Eğer boyut büyük olmasın dersen modeli ayrı, kaplamaları ayrı atarsın.- yeni_zirh.glb
- yeni_zirh_basecolor.png (Ana doku)
- yeni_zirh_metallic.png (Metalik parlama haritası)
- yeni_zirh_normal.png (Girinti çıkıntı haritası)
2- ITEM_PROTO (Txt/SQL Tarafı)
Burada hiçbir şey değişmiyor! Eski eşya ekleme mantığının aynısı. Sen item_proto.txt veya veritabanına zırhı şu şekilde eklersin:11299 "Yeni Glb Zirhi" ... VALUE3 (Zırhın ShapeIndex'i)
(Burası %100 klasik Metin2 mantığıdır, GLTF sistemi Item_Proto'ya karışmaz).
3- PYTHON (Client - msm / msa Dosyaları)
İşte zurnanın zırt dediği yer burası. Oyun senin eklediğin yeni_zirh.glb dosyasını warrior_m.msm (ShapeData) içinden çekecek.Normalde .msm dosyanda zırhı tanıtırken şöyle yazarsın:
Python:
Group ShapeData15
{
SpecialPath "d:/ymir work/pc/warrior/"
ShapeIndex 15
Model "yeni_zirh.gr2" # ESKİ SİSTEM
SourceSkin "yeni_zirh.dds"
TargetSkin "yeni_zirh_kirmizi.dds"
}
GLTF (.glb) Sisteminde Örnek Kullanım:
Python:
Group ShapeData16
{
SpecialPath "d:/ymir work/pc/warrior/"
ShapeIndex 16
Model "yeni_zirh.glb" # YENİ GLTF SİSTEMİ!
# EĞER MODEL .GLB İSE VE KAPLAMASI İÇİNE GÖMÜLÜYSE:
# SourceSkin ve TargetSkin yazmana bile gerek YOKTUR! Motor onu içinden okuyup metalik/PBR render atar.
}
YUKARIDAKİ DOSYALAR NEYİ AMAÇLIYOR?
1- tiny_gltf.h ve Json
Bu dosyalar arka plandaki "Tercüman"dır. Sen oyuna bir .glb kılıcı eklediğinde, o dosyanın içindeki koordinatları (X,Y,Z), "bu kılıcın neresi parlak olacak?", "Bu kılıcın texture'u (resmi) nereden gelecek?" gibi tüm karmaşık metin tabanlı verileri Metin2'nin anlayabileceği sayılara çevirir. Başka da bir işe yaramaz.2- Model.cpp ve Model.h (İskelet Yükleyici)
Bu adam bizim kargo şirketimizdir.Oyuna girdiğinde "Kardeşim bana X klasöründeki kilic.glb dosyasını bul ve parçala" der.
- İçindeki LoadSkins() fonksiyonu: Zırh veya karakterin kemiklerini (kol nerede bükülüyor, kafa nerede) okur.
- İçindeki LoadAnimations() fonksiyonu: Vurma, koşma gibi hareketlerin verilerini (Hangi saniyede kol nereye kalkacak) çeker.
- Kısacası bu dosya dosyayı okur ama henüz ekrana hiçbir şey çizmez, sadece hafızaya alır.
3- Mesh.cpp ve Mesh.h (Ağ Örücü)
Bu dosyalar "Geometri" dosyalarıdır.Model.cpp kılıcı okuduktan sonra bu Mesh dosyasına paslar. Mesh dosyası, "Tamam bu kılıç 3000 üçgenden (poligon) oluşuyor, işte noktaları şunlar" diyerek Vertex Buffer (VB) ve Index Buffer (IB) dediğimiz ekran kartı belleklerini oluşturur. Yani ekran kartına "Al bu üçgenleri kendi hafızanda tut" der.
4- Material.cpp ve Material.h (Boyacı ve Cilacı)
Bu adam kütüphanenin PBR (Yeni nesil ışık/yansıma) kalbidir.O yukarıdaki Mesh dosyası sadece renksiz/bembeyaz üçgenler üretti. Material ise o üçgenlerin üzerine:
- Orijinal resmini (Base Color)
- Metal mi yoksa tahta mı olduğunu (Metallic Roughness)
- Derinlik girintilerini (Normal Map)
- Parlamalarını (Emissive) yapıştırır.
DX9 motoruna "Bu kılıcı metal gibi parlat" emrini verir.
5- ModelInstance.cpp ve ModelInstance.h (Aktör)
Bu dosya işin sahne şovudur (Oynatıcıdır).Diğer bütün dosyalar sadece okudu, hazırladı ve boyadı. ModelInstance ise senin oyun içinde farenle sağa sola dönerken gördüğün o anlık şeydir.
- Her karede (FPS) elindeki silahın nereye gittiğini hesaplar (UpdateSkeleton).
- Ekran kartına "Daha önce hafızana aldığın o boyalı üçgenleri TAM OLARAK ŞU KOORDİNATA VE ŞU GÖLGEYLE ÇİZ" der (Render fonksiyonu).
İşte bütün o DX9 / DX8 kavgaları bu dosyada çıkar. Çünkü doğrudan Ekran Kartı (Device) ile muhatap olan dosya budur.
6- Thing.cpp ve ThingInstance.cpp (Metin2 Baglantisi)
Bu ikisi en önemli dosyalarımızdır, bunlara "Köprü" denir.Yaptığımız o devasa okuma/boyama/çizme işlemlerinin hiçbirini Metin2'nin ana kodları (InstanceBase.cpp vs.) anlamaz. Metin2 kodları sadece Thing kelimesinden anlar (Orijinal Granny render sistemi GrpThing mantığıyla çalışır).
İşte bu dosyalar, Metin2'nin sana "Kılıcı kuşan" dediğinde, arka planda bizim GLTF sistemini gizlice ateşleyen ajan bağlayıcılardır.
Özet:
Sen bir zırh giydiğinde:- Thing der ki: "Hey, zırh.glb giyildi!".
- Model dosyayı okur.
- Mesh üçgenlerini çizer.
- Material metalik boyalarını sürer.
- ModelInstance her saniye karakter koş
dosyalar DX9 VE ÜZERİ FİLESLER UYGUN
FİLESİNİZ DX8 İSE BOŞUNA KURMAYA ÇALIŞMAYIN..
MANTIK: gr2 aynı devam kalıyor. ama ek olarak yani paralel olarak .glb dosyalarını gr2. dosyalarını nasıl nerede nasıl kullanıyorsanız bu sistemi kurarak istediğiniz gibi kullanın.
Performans (GPU Skinning)
Şu anki motorun en büyük derdi, karakter hareketlerinin (animasyonların) CPU üzerinde hesaplanması. Pazar meydanında FPS'nin sürünmesinin sebebi de bu. skinning.hlsl dosyası bu yükü CPU'dan alıp GPU’ya (ekran kartına) yıkıyor. Yani işlemciyi rahatlatıp, "daha kalabalık ama daha akıcı" bir oyun deneyimi sunabiliyorsun.Görüntü Kalitesi (PBR)
Oyunun şu anki hali biraz "plastik" gibi duruyor, değil mi? İşte bu kodun Material.h kısmında gördüğün metallic ve roughness değerleri sayesinde, oyun artık ışığı doğru yansıtacak. Silahlar, zırhlar gerçekten metal gibi parlayacak, deri kısımlar mat duracak. Yani oyuna girdiğinde "Metin2 ama 2026 versiyonu" dedirtecek o kalite farkını yaratacaksın.Bu Yapıyla Neler Yapabilirsin?
- Devasa Bosslar: Mevcut motorun sınırları yüzünden düşük poligonlu yaratıklar yerine, çok daha detaylı, modern modelleri kasmadan oyuna ekleyebilirsin.
- Akıcı Haritalar: ThingInstance.cpp içerisindeki frustum culling kodları sayesinde, baktığın yerin dışındaki nesneler render edilmez. Bu da çok daha büyük, detaylı ve "bayağı uğraşılmış" haritalar yapabilmene olanak tanır.
- Daha Az Bug: Kendi sistemini kurduğun için, dosya yükleme süreçleri daha stabil olur. Bellek sızıntısı (memory leak) gibi sıkıntılarda kontrol tamamen sende olur.
tinygltf/json.hpp at release · syoyo/tinygltf
tinygltf/tiny_gltf.h at release · syoyo/tinygltf