ПрограммированиеФорумОбщее

Проблема с поверхностью

#0
12:50, 28 апр 2011

Почему-то при создании поверхности больше 4х4 клетки приложение закрывается или вылетает с ошибкой. При дебаге с любым количеством клеток дебаггер ругается на ShowWindow(). Путем отключения разных частей кода поял, что ошибка в той части кода, что между двумя большими двойными полосками, но в чем именно ошибка до сих пор понять немогу((

//Global.h
#pragma once

#include <d3d9.h>
#include <d3dx9.h>
#include "Terrain.h"


#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)

struct CUSTOMVERTEX
{
  D3DXVECTOR3 position; // The position
  //D3DCOLOR    color;    // The color
  FLOAT       tu, tv;   // The texture coordinates
};
//Terrain.h


#pragma once

#include <d3d9.h>
#include <d3dx9.h>

class Terrain{
private:
  LPDIRECT3DVERTEXBUFFER9 m_vb;
  LPDIRECT3DINDEXBUFFER9 m_ib;
  D3DMATERIAL9 m_material;

  D3DXVECTOR3 minBounds;
  D3DXVECTOR3 maxBounds;
  int numCellsWide;
  int numCellsHigh;
  int numVertsX;
  int numVertsZ;

public:
  Terrain(int CellsWide, int CellsHigh, D3DXVECTOR3 minPos, D3DXVECTOR3 maxPos);
  void CreateTerrain(LPDIRECT3DDEVICE9 g_pd3dDevice);
  void DrawTerrain(LPDIRECT3DDEVICE9 g_pd3dDevice);
};
//Terrain.cpp

#include "Global.h"
#include "Terrain.h"


Terrain::Terrain(int CellsWide, int CellsHigh, D3DXVECTOR3 minPos, D3DXVECTOR3 maxPos){
  numCellsHigh = CellsWide;
  numCellsWide = CellsWide;
  minBounds = minPos;
  maxBounds = maxPos;
  numVertsX = numCellsWide+1;
  numVertsZ = numCellsHigh+1;
}

void Terrain::CreateTerrain(LPDIRECT3DDEVICE9 g_pd3dDevice){
  g_pd3dDevice->CreateVertexBuffer( numVertsX*numVertsZ*sizeof(CUSTOMVERTEX),
    D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX,
    D3DPOOL_MANAGED, &m_vb, NULL );

  CUSTOMVERTEX* pVertices;
  m_vb->Lock( 0, 0, (void**)&pVertices, 0 );
  float stepX=(maxBounds.x-minBounds.x)/numCellsWide;
  float stepZ=(maxBounds.z-minBounds.z)/numCellsHigh;

  D3DXVECTOR3 pos(minBounds.x, minBounds.y, minBounds.z);

  int count=0;
  int uvcount=0;
  // Loop across and up
  for (int z=0;z<numVertsZ;z++)
  {
    pos.x=minBounds.x;
    for (int x=0;x<numVertsX;x++)
    {
      if (uvcount=0){pVertices[count].tu=0;
      pVertices[count].tv=0;}
      if (uvcount=1){pVertices[count].tu=0;
      pVertices[count].tv=1;}
      if (uvcount=2){pVertices[count].tu=1;
      pVertices[count].tv=1;}
      if (uvcount=3){pVertices[count].tu=0;
      pVertices[count].tv=1;}

      // Create the verts
      pVertices[count].position=pos;
      // Increment x across
      pos.x+=stepX;
      count++;
    }
    // Increment Z
    pos.z+=stepZ;
  }
  m_vb->Unlock();
   //-------------------------------------------------------------------------------------------------------
   //-------------------------------------------------------------------------------------------------------
  g_pd3dDevice->CreateIndexBuffer(2*numVertsX*numVertsZ,D3DUSAGE_WRITEONLY, D3DFMT_INDEX16,
    D3DPOOL_MANAGED, &m_ib, NULL);

  WORD *indices=NULL;
  m_ib->Lock( 0, 0, (void**)&indices, 0 );

  count=0;
  int vIndex=0;
  for (int z=0;z<numCellsHigh;z++)
  {
    for (int x=0;x<numCellsWide;x++)
    {
      // first triangle
      indices[count++]=vIndex;
      indices[count++]=vIndex+numVertsX;
      indices[count++]=vIndex+numVertsX+1;

      // second triangle
      indices[count++]=vIndex;
      indices[count++]=vIndex+numVertsX+1;
      indices[count++]=vIndex+1;

      vIndex++;
    }
    vIndex++;
  }

  m_ib->Unlock();
  //-----------------------------------------------------------------------------------------------------------
  //-----------------------------------------------------------------------------------------------------------
  // CREATING MATERIAL
  ZeroMemory( &m_material, sizeof(D3DMATERIAL9) );
  m_material.Diffuse.r = m_material.Ambient.r = 0.5;
  m_material.Diffuse.g = m_material.Ambient.g = 0.5;
  m_material.Diffuse.b = m_material.Ambient.b = 0.5;
  m_material.Diffuse.a = m_material.Ambient.a = 1.0f;


}

void Terrain::DrawTerrain(LPDIRECT3DDEVICE9 g_pd3dDevice){
  
  g_pd3dDevice->SetMaterial( &m_material );
  //g_pd3dDevice->SetTexture(0,NULL);
  g_pd3dDevice->SetStreamSource( 0, m_vb,0, sizeof(CUSTOMVERTEX) );
  g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
  g_pd3dDevice->SetIndices( m_ib);

  // draw a triangle list using vertices and triangles
  g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST,0,0,numVertsX*numVertsZ,0,numCellsHigh*numCellsWide*2);
}
#1
13:33, 28 апр 2011

Индексный буфер ты создал размером 2*numVertsX*numVertsZ,при 4*4 клетках это у тебя 2*5*5=50 байт, это 3 с хвостиком ворда :)
Далее ты в двух циклах проходишь numCellsHigh*numCellsWide*6 вордов, при 4*4 клетках это 4*4*6=96 вордов. Это определенно больше 3-х с хвостиком, вот за границу и вылазишь.
И еще не помешали бы хоть минимальные проверки на возвращаемые значения директа...

#2
14:21, 28 апр 2011

Спасибо, помогло.

#3
15:52, 28 апр 2011

Да, был тут один товарищ, который советовал всегда больше памяти выделять :)
Видимо KLkon не слушал его :)

#4
17:19, 29 апр 2011

Не совсем понятно почему, если поменять режим рисования на D3DPT_LINELIST, то отображается не квадрат, а прямоугольник с углами по сторонам, к тому же даже он не до конца.
Untitled-2 | Проблема с поверхностью

#5
20:48, 29 апр 2011

KLkon
> Не совсем понятно почему, если поменять режим рисования на D3DPT_LINELIST, то
> отображается не квадрат, а прямоугольник с углами по сторонам, к тому же даже
> он не до конца.
Линия рисуется по 2м индексам, а треугольник(3 линии) по 3м индексам.

ПрограммированиеФорумОбщее

Тема в архиве.