[Pedido] Alguem sabe fazer uma dll?

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[Pedido] Alguem sabe fazer uma dll?

Mensagem por Rodrigo Santiago em Seg 08 Abr 2013, 21:36

Olha, eu tenho um script feito por min para ler arquivos .obj. O que acontece é que é meio lento e eu acho que dentro de uma dll ficaria bem mais rápido, mais eu já tentei de todo jeito e não consigo fazer a dll, na hora de compialr sempre falta alguma coisa, compilou errado e blablabla.

Alguem se disponibiliza a fazer uma dll pra min? Calma... eu tenho aqui a gml e é fácil converter pra C, só na hora de fazer isso é que complica.

Eu dividi, mais no final das contas, tudo é junto
Código:
file=file_text_open_read(argument0)
xx=ds_list_create();yy=ds_list_create();zz=ds_list_create()//Coordenadas
nx=ds_list_create();ny=ds_list_create();nz=ds_list_create()//Normais
tx=ds_list_create();ty=ds_list_create()//Texturas
t_g[0,0]=ds_list_create();t_g[0,1]=ds_list_create();t_g[0,2]=ds_list_create()//Possuem o indice do vertice,normal,textura da 1
t_g[1,0]=ds_list_create();t_g[1,1]=ds_list_create();t_g[1,2]=ds_list_create()//Possuem o indice do vertice,normal,textura da 2
t_g[2,0]=ds_list_create();t_g[2,1]=ds_list_create();t_g[2,2]=ds_list_create()//Possuem o indice do vertice,normal,textura da 3
while(!file_text_eof(file)){
str=file_text_read_string(file)
file_text_readln(file)
switch(string_copy(str,1,string_pos(' ',str)-1)){
case 'v':{//Ler vertice
        tnum=string_pos(' ',str)+1
        str=string_copy(str,tnum,string_length(str))
        tnum=string_copy(str,1,string_pos(' ',str)-1)
        str=string_copy(str,string_pos(' ',str)+1,string_length(str))
        ds_list_add(xx,real(tnum))
        tnum=string_copy(str,1,string_pos(' ',str)-1)
        str=string_copy(str,string_pos(' ',str)+1,string_length(str))
        ds_list_add(zz,real(tnum))
        ds_list_add(yy,real(str))
        };break;
case 'vt':{//Ler textura
        tnum=string_pos(' ',str)+1
        str=string_copy(str,tnum,string_length(str))
        tnum=string_copy(str,1,string_pos(' ',str)-1)
        str=string_copy(str,string_pos(' ',str)+1,string_length(str))
        ds_list_add(tx,real(tnum))
        ds_list_add(ty,1-real(str))//Inversão em y
        };break;
case 'vn':{//Ler normais
        tnum=string_pos(' ',str)+1
        str=string_copy(str,tnum,string_length(str))
        tnum=string_copy(str,1,string_pos(' ',str)-1)
        str=string_copy(str,string_pos(' ',str)+1,string_length(str))
        ds_list_add(nx,real(tnum))
        tnum=string_copy(str,1,string_pos(' ',str)-1)
        str=string_copy(str,string_pos(' ',str)+1,string_length(str))
        ds_list_add(nz,real(tnum))
        ds_list_add(ny,real(str))
        };break;
case 'f':{//Ler faces
        tnum=string_pos(' ',str)+1
        str=string_copy(str,tnum,string_length(str))
        tnum=string_copy(str,1,string_pos(' ',str)-1)
        str=string_copy(str,string_pos(' ',str)+1,string_length(str))
        {//Primeira vértice
        str2=tnum
        tnum2=string_copy(str2,1,string_pos('/',str2)-1)
        str2=string_copy(str2,string_pos('/',str2)+1,string_length(str2))
        ds_list_add(t_g[0,0],real(tnum2))
        tnum2=string_copy(str2,1,string_pos('/',str2)-1)
        str2=string_copy(str2,string_pos('/',str2)+1,string_length(str2))
        ds_list_add(t_g[0,2],real(tnum2))
        ds_list_add(t_g[0,1],real(str2))
        }
       
        tnum=string_copy(str,1,string_pos(' ',str)-1)
        str=string_copy(str,string_pos(' ',str)+1,string_length(str))
       
        {//Segunda vértice
        str2=tnum
        tnum2=string_copy(str2,1,string_pos('/',str2)-1)
        str2=string_copy(str2,string_pos('/',str2)+1,string_length(str2))
        ds_list_add(t_g[1,0],real(tnum2))
        tnum2=string_copy(str2,1,string_pos('/',str2)-1)
        str2=string_copy(str2,string_pos('/',str2)+1,string_length(str2))
        ds_list_add(t_g[1,2],real(tnum2))
        ds_list_add(t_g[1,1],real(str2))
        }
       
        {//Terceira vértice
        str2=str
        tnum2=string_copy(str2,1,string_pos('/',str2)-1)
        str2=string_copy(str2,string_pos('/',str2)+1,string_length(str2))
        ds_list_add(t_g[2,0],real(tnum2))
        tnum2=string_copy(str2,1,string_pos('/',str2)-1)
        str2=string_copy(str2,string_pos('/',str2)+1,string_length(str2))
        ds_list_add(t_g[2,2],real(tnum2))
        ds_list_add(t_g[2,1],real(str2))
        }
       
        };break;
}
}
file_text_close(file)

Agora aqui faz o modelo:

Obs: f_v é o mesmo que ds_list_find_value
Código:
model=argument0
d3d_model_primitive_begin(model,pr_trianglelist)
for(i=0;i<ds_list_size(t_g[0,0]);i+=1){
pos1=f_v(t_g[0,0],i)-1
pos2=f_v(t_g[0,1],i)-1
pos3=f_v(t_g[0,2],i)-1
d3d_model_vertex_normal_texture(model,f_v(xx,pos1)*argument1,f_v(yy,pos1)*argument1,f_v(zz,pos1)*argument1,
f_v(nx,pos2),f_v(ny,pos2),f_v(nz,pos2),f_v(tx,pos3),f_v(ty,pos3))
pos1=f_v(t_g[1,0],i)-1
pos2=f_v(t_g[1,1],i)-1
pos3=f_v(t_g[1,2],i)-1
d3d_model_vertex_normal_texture(model,f_v(xx,pos1)*argument1,f_v(yy,pos1)*argument1,f_v(zz,pos1)*argument1,
f_v(nx,pos2),f_v(ny,pos2),f_v(nz,pos2),f_v(tx,pos3),f_v(ty,pos3))
pos1=f_v(t_g[2,0],i)-1
pos2=f_v(t_g[2,1],i)-1
pos3=f_v(t_g[2,2],i)-1
d3d_model_vertex_normal_texture(model,f_v(xx,pos1)*argument1,f_v(yy,pos1)*argument1,f_v(zz,pos1)*argument1,
f_v(nx,pos2),f_v(ny,pos2),f_v(nz,pos2),f_v(tx,pos3),f_v(ty,pos3))
}
d3d_model_primitive_end(model)

Só lembrando, que ao converter , o melhor é tirar o máximo possível das funções do GameMaker, por exemplo trocando as funções do Gm de leitura de arquivos por outras nativas de C, trocando ds_list por qualquer outra coisa(eu não sei o que pode ser usado, mais ela é meio pesada), trocando as funções de string do GM por uma nativa da linguagem em fim, o máximo possível , pra ver se fica mais rápida a leitura de .obj. E também de colocar as variáveis como temporárias.

Eu conheco algumas dll que fazem isso , até a gmsdk, mais sempre tem um problema, eurealmente queria uma feita com esse script, MAIS EU não consigo Zangado

Rodrigo Santiago

Ranking : Nota B
Número de Mensagens : 1281
Idade : 20
Data de inscrição : 28/07/2012
Notas recebidas : C + C + B
Reputação : 73
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 1
   : 3

Voltar ao Topo Ir em baixo

Re: [Pedido] Alguem sabe fazer uma dll?

Mensagem por PedroX em Seg 08 Abr 2013, 22:09

Em C++, uma DLL para GM é feita mais ou menos assim:

Código:
#include <windows.h>
#define GML extern "C" __declspec (dllexport)

//Funcao que retorna double
GML double NomedaFuncao(char * argumento1, double argument2)
{
return resultado_double;
}

//Funcao que retorna string
GML char * NomedaFuncao(char * argumento1, double argument2)
{
return resultado_ptchar; // string.c_str() pode ser necessário dependendo
}

BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
    return TRUE;
}

char * = string
double = real

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: [Pedido] Alguem sabe fazer uma dll?

Mensagem por Rodrigo Santiago em Ter 09 Abr 2013, 16:43

Ok...já tentei, mais como eu compilo pra sair uma dll? Ela vai servir pra 32 e 64 bit? E mais umas 300 perguntas...e... por isso que eu queria que alguem compilasse pra min, eu deixei em gml pq uma dll pode ser feita em várias linguagens...

Rodrigo Santiago

Ranking : Nota B
Número de Mensagens : 1281
Idade : 20
Data de inscrição : 28/07/2012
Notas recebidas : C + C + B
Reputação : 73
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 1
   : 3

Voltar ao Topo Ir em baixo

Re: [Pedido] Alguem sabe fazer uma dll?

Mensagem por Conteúdo patrocinado Hoje à(s) 22:11


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum