Перейти в начало страницы

Здравствуйте, гость ( Авторизация | Регистрация )

Gameru.net останавливает работу в связи с вторжением армии РФ в Украину. Следите за дальнейшими анонсами.
Support Gameru!
 
Ответить в данную темуНачать новую тему
> Исходные коды конвертеров игровых форматов
autistic
сообщение 05.01.2016, 12:51
Сообщение #1


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Всем привет.
По случаю перехода хостинга проектов с открытым исходным кодом, Google Code, в режим read-only и последующим закрытием сервиса, перенес все сохранившиеся наработки на GitHub.


Также, в связи с поступающими в личку предложениями продолжить работу над плагинами, хочу отметить - я не против, но в связи с нехваткой личного времени не могу заниматься этим с прежней отдачей.
Однако, могу предложить идею, которая заключается в разработке единой консольной утилиты, которая бы конвертировала ресурсы всех этих игр в формат Autodesk FBX. При наличии энтузиастов с достаточным знанием С++, готовых взять на себя нелегкое бремя разработки, со своей стороны обещаю любую помощь.

З.Ы. Пожалуйста, любые комментарии, пожелания, предложения и угрозы, касающиеся вскрытия ресурсов пишите сюда, а не в личку, чтобы остальные участники форума тоже могли поучаствовать и возможно что-то предложить.


--------------------
nop
Перейти в начало страницы
 
Молния в вакууме
сообщение 05.01.2016, 13:12
Сообщение #2


Почти Игроман
*********

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Почему никто никогда не делает конвертеры обратно в игровой формат?
Перейти в начало страницы
 
autistic
сообщение 05.01.2016, 13:33
Сообщение #3


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


saas,
Обратный процесс гораздо сложнее, т.к. назначение львиной части данных в файловых форматах остаётся неизвестно и нет никакой гарантии, что ресурс будет правильно перевариваться движком, если просто перезаписать информацию об индексах, вершинах и материалах. Однако, для некоторых игр существуют фанатские утилиты, позволяющие экспорт обратно в игру, например NifTools


--------------------
nop
Перейти в начало страницы
 
ForserX
сообщение 25.07.2017, 17:17
Сообщение #4


Почти Игроман
*********

Репутация:   91  
Группа: Модератор
Сообщений: 516
Награды: 4
Регистрация: 19.07.2015




Вставить ник Цитировать выделенное в форуму быстрого ответа


Ну, написать общую софтину можно, если есть раб для тестов.


--------------------

В армии по 01.07.2020.
Перейти в начало страницы
 
autistic
сообщение 25.07.2017, 20:34
Сообщение #5


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Forser, Нужна какая-то отправная точка. Скажем, конвертер с минимальным функционалом который будет конвертировать например статическую модель Metro2033 в формат FBX. Если реализуешь такой функционал и будет желание продолжить работу, то буду рад оказать любую помощь, в т.ч. могу оказать содействие при тестировании и поиску ошибок в коде, а также дать рекомендации по исправлению ошибок, рефакторингу и архитектурным решениям.

Сообщение отредактировал refuse - 25.07.2017, 20:36


--------------------
nop
Перейти в начало страницы
 
ForserX
сообщение 26.07.2017, 00:23
Сообщение #6


Почти Игроман
*********

Репутация:   91  
Группа: Модератор
Сообщений: 516
Награды: 4
Регистрация: 19.07.2015




Вставить ник Цитировать выделенное в форуму быстрого ответа


Окей. Покурю твои тулзы и FBX SDK, как желание будет. У меня сейчас дикое желание дописать свой старый 2D двиг.

Сообщение отредактировал Forser - 26.07.2017, 00:25


--------------------

В армии по 01.07.2020.
Перейти в начало страницы
 
Modera
сообщение 29.01.2018, 02:57
Сообщение #7


.
**********************

Репутация:   750  
Группа: Участник
Сообщений: 7072
Награды: 4
Регистрация: 30.07.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Потребовалось почитать конфиги из сурвариума, набросал на скорую руку конвертер в текстовый формат:
Исходник

CODE
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void *loadfile(const char *filename)
{
FILE *f;
void *buffer;
size_t len;

f = fopen(filename, "rb");

if(!f)
{
puts("Can't open file");
return NULL;
}

fseek(f, 0, SEEK_END);
len = ftell(f);
fseek(f, 0, SEEK_SET);

buffer = malloc(len);

if(!buffer)
{
puts("Out of memory!");
fclose(f);
return NULL;
}

fread(buffer, 1, len, f);
fclose(f);

return buffer;
}

struct binary_config
{
__int64 value; // value if integer or float, file offset to value otherwise
__int64 name; // file offset to name, or index array
int hash;
short type;
short count; // count of elements if table, memory usage otherwise
};

enum binary_config_type
{
EMPTY = 0,
INTEGER = 1,
FLOAT = 2,
TABLE = 3,
ARRAY = 4,
STRING = 5,
VEC2 = 6,
VEC3 = 7
};

void print_table(void *start, struct binary_config *cfg, int indent)
{
int i,j;

if(cfg->type == ARRAY)
{
struct binary_config *c = (struct binary_config*)((char*)start + cfg->value);

for(i = 0; i < cfg->count; i++)
{
for(j = 0; j < indent; j++) putchar('\t');

switch(c[i].type)
{
case EMPTY:
continue;
case INTEGER:
printf("%d\n", (int)c[i].value);
break;
case FLOAT:
printf("%f\n", *(float*)&c[i].value);
break;
case TABLE:
case ARRAY:
printf("{\n");
print_table(start, &c[i], indent+1);
for(j = 0; j < indent; j++) putchar('\t');
printf("}\n");
break;
case STRING:
printf("\"%s\"\n", (char*)start + c[i].value);
break;
case VEC2:
{
float *pv = (float*)((char*)start + c[i].value);
printf("float2( %f, %f )\n", pv[0], pv[1]);
} break;
case VEC3:
{
float *pv = (float*)((char*)start + c[i].value);
printf("float3( %f, %f, %f )\n", pv[0], pv[1], pv[2]);
} break;
default:
printf("not implemented type %d!!!\n", c[i].type);
}
}
}
else if(cfg->type == TABLE)
{
struct binary_config *c = (struct binary_config*)((char*)start + cfg->value);

for(i = 0; i < cfg->count; i++)
{
for(j = 0; j < indent; j++) putchar('\t');

switch(c[i].type)
{
case EMPTY:
continue;
case INTEGER:
printf("%s = %d\n", ((char*)start) + c[i].name, (int)c[i].value);
break;
case FLOAT:
printf("%s = %f\n", ((char*)start) + c[i].name, *(float*)&c[i].value);
break;
case TABLE:
case ARRAY:
printf("%s = {\n", ((char*)start) + c[i].name);
print_table(start, &c[i], indent+1);
for(j = 0; j < indent; j++) putchar('\t');
printf("}\n");
break;
case STRING:
printf("%s = \"%s\"\n", ((char*)start) + c[i].name, (char*)start + c[i].value);
break;
case VEC2:
{
float *pv = (float*)((char*)start + c[i].value);
printf("%s = float2( %f, %f )\n", ((char*)start) + c[i].name, pv[0], pv[1]);
} break;
case VEC3:
{
float *pv = (float*)((char*)start + c[i].value);
printf("%s = float3( %f, %f, %f )\n", ((char*)start) + c[i].name, pv[0], pv[1], pv[2]);
} break;
default:
printf("not implemented type %d!!!\n", c[i].type);
}
}
}
else
printf("???\n");
}

int main(int argc, char *argv[])
{
void *buffer;

if(argc < 2)
return 1;

buffer = loadfile(argv[1]);

if(!buffer)
return 2;

print_table(buffer, (struct binary_config*)buffer, 0);
free(buffer);

return 0;
}

Перейти в начало страницы
 

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 19.04.2024, 13:25