Skip to content

Latest commit

Β 

History

33 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

C++ glTF License Sacred Community

English Β· Deutsch

grn2glb

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ Sacred Gold ΠΈΠ· Granny 1.2 (.grn) Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ glTF (.glb) прямо Π² памяти. Она Π½ΡƒΠΆΠ½Π° ΠΌΠΎΠ΄Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΠ³Ρ€Ρ‹, ΠΈ Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°Π΄ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠΌ.

Π’Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚Π΅ Π±Π°ΠΉΡ‚Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π±Π°ΠΉΡ‚Ρ‹ GLB: мСши, скСлСт, вСса скиннинга, ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΈ тСкстуры Π² PNG Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»Π°. Π€Π°ΠΉΠ»ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΈ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄ сам Ρ€Π΅ΡˆΠ°Π΅Ρ‚, ΠΎΡ‚ΠΊΡƒΠ΄Π° Π²Π·ΡΡ‚ΡŒ модСль ΠΈ ΠΊΡƒΠ΄Π° ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ тСкстур Sacred Ρ…Ρ€Π°Π½ΠΈΡ‚ Π½Π΅ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Для Ρ‚Π°ΠΊΠΈΡ… слотов Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π°Π·Ρ‹Π²Π°Π΅Ρ‚ имя Ρ„Π°ΠΉΠ»Π°, Π° пиксСли RGBA присылаСтС Π²Ρ‹. ВстроСнныС тСкстуры, сырыС ΠΈ сТатыС VTex, ΠΎΠ½Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ сама.

grn2glb.dll β€” 64-битная DLL с простым C ABI. Java 22 ΠΈ Π½ΠΎΠ²Π΅Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Ρ‘ Ρ‡Π΅Ρ€Π΅Π· FFM (Panama) Π±Π΅Π· JNI. CRT собран статичСски, поэтому ΠΈΠ³Ρ€ΠΎΠΊΡƒ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ VC++ Redistributable.

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ

  1. Π‘ΠΎΠ±Π΅Ρ€ΠΈΡ‚Π΅ grn2glb.dll, ΠΊΠ°ΠΊ описано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π‘Π±ΠΎΡ€ΠΊΠ°Β». Π“ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ€Π΅Π»ΠΈΠ·ΠΎΠ² ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚.

  2. ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅ DLL рядом с ΠΌΠΎΠ΄ΠΎΠΌ ΠΈ свяТитС Π½ΡƒΠΆΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

    Linker linker = Linker.nativeLinker();
    SymbolLookup lib = SymbolLookup.libraryLookup(dllPath, Arena.global());
    MethodHandle open = linker.downcallHandle(lib.find("grn2glb_open").orElseThrow(),
            FunctionDescriptor.of(ADDRESS, ADDRESS, JAVA_LONG));
    MethodHandle export = linker.downcallHandle(lib.find("grn2glb_export_glb").orElseThrow(),
            FunctionDescriptor.of(JAVA_INT, ADDRESS, ADDRESS, ADDRESS));
    // grn2glb_texture_count, grn2glb_texture_file_name, grn2glb_set_texture_rgba,
    // grn2glb_free, grn2glb_close ΠΈ grn2glb_last_error ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅.
  3. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ модСль, Π΄Π°ΠΉΡ‚Π΅ пиксСли внСшним тСкстурам ΠΈ Π·Π°Π±Π΅Ρ€ΠΈΡ‚Π΅ GLB:

    try (Arena arena = Arena.ofConfined()) {
        MemorySegment grn = arena.allocateFrom(JAVA_BYTE, grnBytes);
        MemorySegment model = (MemorySegment) open.invokeExact(grn, (long) grnBytes.length);
        // Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ слота, Π³Π΄Π΅ grn2glb_texture_has_pixels Π²Π΅Ρ€Π½ΡƒΠ»Π° 0:
        // grn2glb_texture_file_name Π½Π°Π·ΠΎΠ²Ρ‘Ρ‚ Ρ„Π°ΠΉΠ», grn2glb_set_texture_rgba ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ пиксСли.
        MemorySegment outData = arena.allocate(ADDRESS);
        MemorySegment outSize = arena.allocate(JAVA_LONG);
        int rc = (int) export.invokeExact(model, outData, outSize);
        MemorySegment glb = outData.get(ADDRESS, 0).reinterpret(outSize.get(JAVA_LONG, 0));
        byte[] glbBytes = glb.toArray(JAVA_BYTE);
        free.invokeExact(outData.get(ADDRESS, 0));
        close.invokeExact(model);
    }

Если open Π²Π΅Ρ€Π½ΡƒΠ»Π° NULL ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ мСньшС нуля, grn2glb_last_error() ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ. ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ описан Π² include/grn2glb.h.

C ABI

Ѐункция Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚
grn2glb_api_version() ВСрсия ABI. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ Π΅Ρ‘ с GRN2GLB_API_VERSION Π΄ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²
grn2glb_open(data, size) Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ модСль ΠΈΠ· Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Ρ‘ дСскриптор
grn2glb_texture_count(model) Число слотов тСкстур
grn2glb_texture_name(model, slot) Имя слота, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ записано Π² GRN
grn2glb_texture_file_name(model, slot) Имя Ρ„Π°ΠΉΠ»Π° тСкстуры, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ записано Π² GRN
grn2glb_texture_format(model, slot) Код Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°: 7 β€” внСшний Ρ„Π°ΠΉΠ», 4 ΠΈ 5 β€” VTex, 0, 1 ΠΈ 6 β€” сырыС пиксСли
grn2glb_texture_size(model, slot, &w, &h) Π Π°Π·ΠΌΠ΅Ρ€ тСкстуры Π² пиксСлях
grn2glb_texture_has_pixels(model, slot) 1, Ссли пиксСли ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ, ΠΈ 0, Ссли ΠΈΡ… ΠΆΠ΄ΡƒΡ‚ ΠΎΡ‚ вас
grn2glb_set_texture_rgba(model, slot, rgba, w, h) ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ пиксСли RGBA для слота
grn2glb_export_glb(model, &data, &size) Π‘ΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚ GLB Π² Π±ΡƒΡ„Π΅Ρ€
grn2glb_free(buffer) ΠžΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π±ΡƒΡ„Π΅Ρ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
grn2glb_close(model) Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ модСль
grn2glb_last_error() ВСкст послСднСй ошибки Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ИмСна приходят Π±Π°ΠΉΡ‚ Π² Π±Π°ΠΉΡ‚, ΠΊΠ°ΠΊ ΠΈΡ… Ρ…Ρ€Π°Π½ΠΈΡ‚ GRN. Π’ Sacred это ASCII, ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ°ΠΊ windows-1252. Π‘Π»ΠΎΡ‚ Π±Π΅Π· пиксСлСй ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² GLB сСрым ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠΌ 2Γ—2.

Π§Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Sacred

ВСст test_game ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ всСм 1571 модСлям ΠΈΠ· PAK\models.pak ΠΈ считаСт слоты тСкстур:

Π€ΠΎΡ€ΠΌΠ°Ρ‚ Код Π‘Π»ΠΎΡ‚ΠΎΠ²
Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Ρ„Π°ΠΉΠ» 7 1922
VTex Π±Π΅Π· Π°Π»ΡŒΡ„Ρ‹ 4 104
VTex с Π°Π»ΡŒΡ„ΠΎΠΉ 5 41
Π‘Ρ‹Ρ€ΠΎΠΉ RGBA 1 9
Π‘Ρ‹Ρ€ΠΎΠΉ RGBX 0 6

Π‘ΠΊΠ΅Π»Π΅Ρ‚ с вСсами Π΅ΡΡ‚ΡŒ Ρƒ 1009 ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. БТатия DXT Π½ΠΈ ΠΎΠ΄Π½Π° модСль Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚, поэтому Π΅Π³ΠΎ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ я ΡƒΠ±Ρ€Π°Π».

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ

  • Анимации парсСр Ρ‡ΠΈΡ‚Π°Π΅Ρ‚, Π½ΠΎ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΊ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ GRN ΠΏΠΎΠΊΠ° нСльзя. Из 1571 ΠΌΠΎΠ΄Π΅Π»ΠΈ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ Π² GLB ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π°.
  • Π‘ΠΊΠΈΠ½, суставы ΠΈ вСса ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² GLB, ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ Khronos ΠΈΡ… ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚. Как мСш дСформируСтся Π² ΠΏΠΎΠ·Π΅, Π΅Ρ‰Ρ‘ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ провСрял.
  • ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ направлСния, ΠΈΠ· GLB Π² GRN, здСсь Π½Π΅Ρ‚.

Π‘Π±ΠΎΡ€ΠΊΠ°

НуТны MSVC x64 ΠΈ CMake 3.22 ΠΈΠ»ΠΈ Π½ΠΎΠ²Π΅Π΅. Из Developer Command Prompt:

cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
ctest --test-dir build --output-on-failure

DLL появится Π² build\bin\grn2glb.dll. ВСсты test_core ΠΈ test_abi ΠΈΠ³Ρ€Ρ‹ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚. test_game Π±Π΅Ρ€Ρ‘Ρ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΠ· ΠΈΠ³Ρ€Ρ‹ ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ Π² GRN2GLB_GAME, Π° Π±Π΅Π· ΠΈΠ³Ρ€Ρ‹ сообщаСт ΠΎ пропускС.

Π Π΅Π»ΠΈΠ·Ρ‹

Кнопки Release Ρƒ рСпозитория ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚. CI собираСт ΠΈ тСстируСт ΠΊΠΎΠ΄ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ push Π² master ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ pull request ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚. ΠžΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° описаны Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ CONTRIBUTING.

Благодарности

Бпасибо karolak6612 Π·Π° врСмя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΡˆΠ»ΠΎ Π½Π° Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Granny GRN вмСстС с ИИ-Π°Π³Π΅Π½Ρ‚ΠΎΠΌ. Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° β€” ΡƒΡ€Π΅Π·Π°Π½Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΊ open-grn-converter, ΠΈ Π΅Π³ΠΎ история ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² сохранСна здСсь.

ЛицСнзия

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ распространяСтся ΠΏΠΎΠ΄ MIT, см. LICENSE. ΠŸΡ€Π°Π²Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ karolak6612 ΠΈ ΠΌΠ½Π΅. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ β€” Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ VTex Π² src/codecs/vtex_*. Он основан Π½Π° Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π΅ Bink ΠΈΠ· FFmpeg (libavcodec/bink.c ΠΈ binkdata.h) ΠΈ распространяСтся ΠΏΠΎΠ΄ LGPL-2.1-or-later. ΠŸΠΎΠ»Π½Ρ‹ΠΉ тСкст Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ Π»Π΅ΠΆΠΈΡ‚ Π² LICENSES/LGPL-2.1.txt.

Бобранная grn2glb.dll содСрТит этот ΠΊΠΎΠ΄, поэтому Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ распространяСтся ΠΏΠΎΠ΄ LGPL-2.1-or-later. Мод Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ DLL динамичСски Ρ‡Π΅Ρ€Π΅Π· FFM (Panama), ΠΈ LGPL это Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚: сам ΠΌΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Π»ΠΈΡ†Π΅Π½Π·ΠΈΡŽ. nlohmann/json ΠΈ stb_image_write ΠΈΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄ своими лицСнзиями.

About

🧊 Converts Sacred Gold Granny 1.2 .grn models to glTF .glb in memory, with a C ABI for Java Panama

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages