Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Loopen en 01 de Enero de 1970, 01:00:00 AM

Título: Ayuda por favor, tengo un problema.
Publicado por: Loopen en 01 de Enero de 1970, 01:00:00 AM
                                Tengo un problema, estoy intentando implementar una funcion para poder asignarle los vertices de un triangulo a un buffer,uso DX8, el problema q tengo es q soy muy novato en esto y la funcion me falla en algo, lo que he observado es que el puntero al buffer no conserva su valor cuando salgo de la funcion, alguien me puede ayudar, os pongo el codigo de la funcion
   

void CreaBufferVertice(IDirect3DDevice8 *obj_dispositivo_D3D,unsigned char a,IDirect3DVertexBuffer8 *Triangulo,Vertice Triangulo_vertices[]){


HRESULT hr;
unsigned char *vb_vertices;




hr=obj_dispositivo_D3D->CreateVertexBuffer(a,D3DUSAGE_WRITEONLY,D3D8T_CUSTOMVERTEX,
                                      D3DPOOL_MANAGED,&Triangulo);      
                                                     
 
 
if(FAILED(hr)){
     Error_Fatal(
"Error al crear el buffer del triangulo");
  }

 

  hr=Triangulo->Lock(0,
// Offset(Desplazamiento), 0 por que queremos empezar desde el inicio
                      0,
// Tamaño de bloqueado, 0 significa bloquear todo el buffer
                      &vb_vertices,
// Si es exitoso eso apuntará a la memoria que deseamos
                      0);  
//Banderas, nada en especial

 
 
if(FAILED(hr)){
     Error_Fatal(
"Error bloqueando el buffer del triangulo");
  }
 
 
// vb_vertices ahora apunta hacia el buffer que deseamos, ahora copiamos los datos
  memcpy(vb_vertices, Triangulo_vertices, a );

 
// Desbloqueamos el buffer
  Triangulo->Unlock();


}



                               
Título: Ayuda por favor, tengo un problema.
Publicado por: _Grey en 01 de Enero de 1970, 01:00:00 AM
                               
Como tu dices el problema estara en el puntero........

cada vez que quieras acceder a este buffer tendras que hacer ->Lock(), por que la posicion de los datos puede variar y directx entiende cuando haces ->Unlock() que te los puede mover de sitio.........                                
Título: Ayuda por favor, tengo un problema.
Publicado por: Loopen en 01 de Enero de 1970, 01:00:00 AM
                                Y de que manera podria hacerlo, es que me gustaria poder meter estas cosas en funcioncillas para luego no tener que repetir todo.                                
Título: Ayuda por favor, tengo un problema.
Publicado por: _Grey en 01 de Enero de 1970, 01:00:00 AM
                               
jeje.... ahora que me fijo, tengo que advertirte de que e visto algo mas...

como veo en esta funcion es donde haces la copia de los datos, es decir que no juegas con el puntero despues de esta funcion como yo pensaba....

y los errores que he visto ahora son:

CreateVertexBuffer() : el parametro "a" supongo que sera la cantidad de vertices que tiene que mantener el vertexbuffer?? no?? pues lo que tienes que ponerle es la cantidad de memoria que ocupara, no se si me explico... suponiendo que cada vertice ocupe 80bytes el valor de a tendria que ser cantidad_de_vertices*80, la manera mas facil de hacerlo es:
  si la estructura de los vertices se llama MyVertex,por poner un ejemplo, pondriamos:
  hr=obj_dispositivo_D3D->CreateVertexBuffer(cantidad_de_vertices*sizeof(MyVertex),D3DUSAGE_WRITEONLY,D3D8T_CUSTOMVERTEX,D3DPOOL_MANAGED,&Triangulo);

En el memcpy has de hacer lo mismo puesto que copia "a" cantidad en bytes y tus vertices ocupan mas.

Tambien deberias cambiar:
IDirect3DDevice8 *obj_dispositivo_D3D por esto LPDIRECT3DDEVICE8 obj_dispositivo_D3D
IDirect3DVertexBuffer8 *Triangulo por esto LPDIRECT3DVERTEXBUFFER8 Triangulo

por ultimo tengo que decirte que el puntero de vertexBuffer que creas en Triangulo no sale de la funcion, supongo que pasas un puntero de LPDIRECT3DVERTEXBUFFER8 a la funcion en su tercer parametro(Triangulo) si es asi quitale el & en el CreateVertexBuffer.

Espero no haberte liado mas.... tenia muchas cosas que plantear........

y si no ... ya llegara berserker...... o, no?

Saludotes.

P.D.: hey!! acabo de leer tu segundo mensaje... a ke te refieres...                                
Título: Ayuda por favor, tengo un problema.
Publicado por: _Grey en 01 de Enero de 1970, 01:00:00 AM
                               
Como veo que esto esta algo liado .... me e tomado algunas "libertades artisticas", y me ha salido esto:


// Suponiendo que a sea la cantidad de vertices
// Y que la estructura de los vertices se llama Vertice
// Y la llamada seria por ejemplo, asi : CreaBufferVertice(Device3D,10,&VertexBufferExterno,array_de_vertices)

void CreaBufferVertice(LPDIRECT3DDEVICE8 obj_dispositivo_D3D,unsigned char a,LPDIRECT3DVERTEXBUFFER8 Triangulo,Vertice Triangulo_vertices[]){


HRESULT hr;
unsigned char *vb_vertices;



// Ten encuenta que con D3DUSAGE_WRITEONLY    NO PODRAS LEER EL CONTENIDO DEL VERTEXBUFFER
hr=obj_dispositivo_D3D->CreateVertexBuffer(a*sizeof(Vertice),D3DUSAGE_WRITEONLY,D3D8T_CUSTOMVERTEX,
                                      D3DPOOL_DEFAULT,Triangulo);      
                                                     
 
  if(FAILED(hr)){
     Error_Fatal("Error al crear el buffer del triangulo");
  }

 

  hr=Triangulo->Lock(0, // Offset(Desplazamiento), 0 por que queremos empezar desde el inicio
                      0, // Tamaño de bloqueado, 0 significa bloquear todo el buffer
                      &vb_vertices, // Si es exitoso eso apuntará a la memoria que deseamos
                      0);  //Banderas, nada en especial

 
  if(FAILED(hr)){
     Error_Fatal("Error bloqueando el buffer del triangulo");
  }
 
  // vb_vertices ahora apunta hacia el buffer que deseamos, ahora copiamos los datos
  memcpy(vb_vertices, Triangulo_vertices, a*sizeof(Vertices) );

  // Desbloqueamos el buffer
  Triangulo->Unlock();


}

lo siento ... yo no se hacer una tabla :triste:

bye!                                
Título: Ayuda por favor, tengo un problema.
Publicado por: Loopen en 01 de Enero de 1970, 01:00:00 AM
                                Muchas gracias a los dos, pero esto me sigue sin ir, una pregunta, q diferencia hay entre las variables q habia creado yo y las q me habeis dicho, me refiero al VertexBuffer                                
Título: Ayuda por favor, tengo un problema.
Publicado por: _Grey en 01 de Enero de 1970, 01:00:00 AM
                                Supongo que te refieres al LPDIRECT3DVERTEXBUFFER8, el LP significa LONG POINTER, con lo cual el LPDIRECT3DVERTEXBUFFER8 es un PUNTERO a un objeto vertexBuffer, el IDIRECT3DVERTEXBUFFER8 es el objeto en si, pero con el LP especificas esplicitamente que es un puntero, vamos que te ahorras el asterisco(*).                                
Título: Ayuda por favor, tengo un problema.
Publicado por: Loopen en 01 de Enero de 1970, 01:00:00 AM
                                Muchas gracias, casi da vergüenza preguntar tanto, se nota q soy mu novatillo, pero ya veo que x aki hay buena gente, siempre dispuesta a ayudar
                               
Título: Ayuda por favor, tengo un problema.
Publicado por: Loopen en 01 de Enero de 1970, 01:00:00 AM
                                A ver, os posteo otra vez como ha quedado mi codigo, tengo el mismo error, el problema es que fuera de la funcion, el VertexBuffer no me toma valor, estoy ya desesperao, porque puede ser esto.

   


void CreaBufferVertice(LPDIRECT3DDEVICE8 obj_dispositivo_D3D,unsigned char a,LPDIRECT3DVERTEXBUFFER8 Triangulo,Vertice Triangulo_vertices[]){


HRESULT hr;
unsigned char *vb_vertices;



// Ten encuenta que con D3DUSAGE_WRITEONLY NO PODRAS LEER EL CONTENIDO DEL VERTEXBUFFER
hr=obj_dispositivo_D3D->CreateVertexBuffer(a*
sizeof(Vertice),D3DUSAGE_WRITEONLY,D3D8T_CUSTOMVERTEX,
D3DPOOL_DEFAULT,&Triangulo);


if(FAILED(hr)){
Error_Fatal(
"Error al crear el buffer del triangulo");
}



hr=Triangulo->Lock(0,
// Offset(Desplazamiento), 0 por que queremos empezar desde el inicio
0,
// Tamaño de bloqueado, 0 significa bloquear todo el buffer
&vb_vertices,
// Si es exitoso eso apuntará a la memoria que deseamos
0);
//Banderas, nada en especial


if(FAILED(hr)){
Error_Fatal(
"Error bloqueando el buffer del triangulo");
}

// vb_vertices ahora apunta hacia el buffer que deseamos, ahora copiamos los datos
memcpy(vb_vertices, Triangulo_vertices, a*
sizeof(Vertice) );

// Desbloqueamos el buffer
Triangulo->Unlock();


}





En el CreateVertexBuffer he tenido que poner como ultimo parametro &Triangulo, porque a pesar de que Triangulo ya es un puntero, la funcion necesita un puntero a puntero.

He probao a pasarle a la funcion en la cabecera el puntero a puntero **, pero entonces el compilador se queja al hacer el Triangulo-> Lock
y el
Triangulo -> Unlock

Por favor, agradeceria un monton vuestra ayuda, me estoy devanando los sesos y no consigo encontrar el error.


                               
Título: Ayuda por favor, tengo un problema.
Publicado por: Juan Mellado en 01 de Enero de 1970, 01:00:00 AM
                                Hola Loopen,
puedes definir el parámetro Triangulo de dos formas:

1) Como LPDIRECT3DVERTEXBUFFER8 * Triangulo, en cuyo caso utilizas:
CreateVertexBuffer(..., Triangulo);
(*Triangulo)->Lock(...);
(*Triangulo)->Unlock(...);

2) Como LPDIRECT3DVERTEXBUFFER8 & Triangulo, en cuyo caso utilizas:
CreateVertexBuffer(..., &Triangulo);
Triangulo->Lock(...);
Triangulo->Unlock(...);

El primer método pasa el parámetro como un puntero a un puntero, el segundo pasa el parámetro por referencia.

Espero te sirva, saludos.                                
Título: Ayuda por favor, tengo un problema.
Publicado por: Loopen en 01 de Enero de 1970, 01:00:00 AM
                                Siiiiiiiiiiiii, menos mal que era eso, gracias Juan, y gracias a todos, ya se donde tengo un sitio con gente en la que confiar