Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
void CMesh::CreateCube() { CSurface* surf = new CSurface(); // Vertices hinzufügen surf->AddVertex(-1, 1,-1); surf->AddVertex(-1, 1, 1); surf->AddVertex( 1, 1, 1); surf->AddVertex( 1, 1,-1); surf->AddVertex(-1,-1,-1); surf->AddVertex(-1,-1, 1); surf->AddVertex( 1,-1, 1); surf->AddVertex( 1,-1,-1); // Indices hinzufügen surf->AddTriangle(0,3,7); surf->AddTriangle(0,7,4); // Vorderseite surf->AddTriangle(2,1,5); surf->AddTriangle(2,5,6); // Hinterseite surf->AddTriangle(1,0,4); surf->AddTriangle(1,4,5); // Linke Seite surf->AddTriangle(3,2,6); surf->AddTriangle(3,6,7); // Rechte Seite surf->AddTriangle(0,1,2); surf->AddTriangle(0,2,3); // Oberseite surf->AddTriangle(6,5,4); surf->AddTriangle(6,4,7); // Unterseite this->AddSurface(surf); } int CSurface::AddVertex(float x, float y, float z, float u , float v , float w ) { CVertex1* tmpVertices = new CVertex1[nVertexCount+1]; if ( m_pVertices != NULL) memcpy( (void*)tmpVertices, (void*)m_pVertices, nVertexCount*sizeof(CVertex1)); tmpVertices[nVertexCount].pos = D3DXVECTOR3(x,y,z); tmpVertices[nVertexCount].normal = D3DXVECTOR3(0.0,0.0,0.0); tmpVertices[nVertexCount].tex0 = D3DXVECTOR3(u,v,0.0); tmpVertices[nVertexCount].diffuse = 0xFFFFFFFF; tmpVertices[nVertexCount].specular = 0xFFFFFFFF; nVertexCount++; if ( m_pVertices != NULL) delete[] m_pVertices; m_pVertices = tmpVertices; return nVertexCount; } int CSurface::AddTriangle(int v0, int v1, int v2) { unsigned short* tmpIndices = new unsigned short[nIndexCount+3]; if ( m_pIndices != NULL ) memcpy( (void*)tmpIndices, (void*)m_pIndices, nIndexCount*sizeof(unsigned short)); tmpIndices[nIndexCount] = v0; tmpIndices[nIndexCount+1] = v1; tmpIndices[nIndexCount+2] = v2; nIndexCount+=3; if ( m_pIndices != NULL ) delete[] m_pIndices; m_pIndices = tmpIndices; return nIndexCount/3; } HRESULT CCamera::Update() { m_pDevice->SetRenderState(D3DRS_ZENABLE,TRUE); m_pDevice->SetRenderState(D3DRS_LIGHTING,FALSE); m_pDevice->SetRenderState(D3DRS_FOGENABLE, FALSE); m_pDevice->SetViewport(&m_ViewPort); // Sichtkegel definieren D3DXMatrixPerspectiveFovLH(&m_mProj, D3DX_PI/4, (float)m_ViewPort.Width / (float)m_ViewPort.Height, range_near, range_far ); m_pDevice->SetTransform(D3DTS_PROJECTION,&m_mProj); // Transform vectors based on camera's rotation matrix D3DXVECTOR3 vWorldUp, vWorldAhead; D3DXVECTOR3 vLocalUp = D3DXVECTOR3(0,1,0); D3DXVECTOR3 vLocalAhead = D3DXVECTOR3(0,0,1); D3DXVec3TransformCoord( &vWorldUp, &vLocalUp, &mRotation ); D3DXVec3TransformCoord( &vWorldAhead, &vLocalAhead, &mRotation ); // Update the lookAt position based on the eye position m_vLookAt = m_vPos + vWorldAhead; // Update the view matrix D3DXMatrixLookAtLH( &m_mView, &m_vPos, &m_vLookAt, &vWorldUp ); m_pDevice->SetTransform(D3DTS_VIEW,&m_mView); return 0; } void CSurface::Render() { HRESULT hResult; // Vertex-Format setzen m_pDevice->SetFVF( D3DFVF_VERTEX1); // rendern hResult = m_pDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, nIndexCount, nIndexCount/3, m_pIndices, D3DFMT_INDEX16, m_pVertices, sizeof(CVertex1)); } |
Treue Seele
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int i = 0; for(i = 0; i < nIndexCount/3; i++) { Log.WriteToLog("Vertex: %d x: %f y: %f z: %f", i, m_pVertices[i].x, m_pVertices[i].y, m_pVertices[i].z); //Oder alternativ, wenn es eine Konsolenanwendung ist, geht auch printf("Vertex: %d x: %f y: %f z: %f", i m_pVertices[i].x, m_pVertices[i].y, m_pVertices[i].z); } for(i = 0; i < nIndexCount; i++) { Log.WriteToLog("Index: %d %d", i, m_pIndices[i]); //oder printf("Index: %d %d", i, m_pIndices[i]); } |
Zitat
PS: Dein Code scheint mir stark Speicherfragmentierend. Vielleicht solltets du nicht so oft, immer größeren Speicher reservieren, sondern von Anfang an gleich mehr?
Treue Seele
Zitat
aber generell soll halt die Möglichkeit bestehen einfach Dreiecke hinzuzufügen, ohne sich um Speicherreservierung kümmern zu müssen...
C-/C++-Quelltext |
|
1 2 |
CSurface TestSur; TestSur.Init(200, 800); //Am Anfang Speicher für 200 Vertices und 800 Inidices reservieren. |
Werbeanzeige