internal void Render() { v3 light_direction = {0, 0, -1.0f}; light_direction = Normalize(light_direction); v3i p[3]; int height = g_game_backbuffer.height; int width = g_game_backbuffer.width; if (!g_model.is_loaded) LoadModelFromFile("african_head.model", "african_head_diffuse.tga"); if (!g_game_backbuffer.is_initialized) { g_game_backbuffer.z_buffer = (int *)VirtualAlloc( 0, 4 * width * height * sizeof(int), MEM_COMMIT, PAGE_READWRITE); for (int i = 0; i < width * height; ++i) { g_game_backbuffer.z_buffer[i] = INT_MIN; } g_game_backbuffer.is_initialized = true; } // Draw model for (int i = 0; i < g_model.face_count; ++i) { Face *face = &g_model.faces[i]; v3 vert[3]; // Look up actual coordinates from the model for (int j = 0; j < 3; ++j) { vert[j] = g_model.vertices[face->v[j] - 1]; } v3 normal = Normalize(CrossProduct(vert[2] - vert[0], vert[1] - vert[0])); r32 intensity = DotProduct(normal, light_direction); if (intensity <= 0) continue; // Adjust the vertices to fit the window size for (int j = 0; j < 3; ++j) { for (int k = 0; k < 3; ++k) { p[j].e[k] = static_cast<int>((vert[j].e[k] + 1.0f) * height / 2.0f); } } v2i uv[3]; for (int j = 0; j < 3; ++j) { uv[j] = g_model.texture_coords[face->uvs[j] - 1]; } Triangle(p, uv, intensity, g_model.texture, g_game_backbuffer.z_buffer); } // u32 color = 0x00AAAAAA; // v2i p0[3] = {{10, 70}, {50, 160}, {70, 100}}; // v2i p1[3] = {{180, 50}, {150, 1}, {70, 180}}; // v2i p2[3] = {{180, 150}, {120, 160}, {130, 180}}; // DebugTriangle(&p0[0], &p0[1], &p0[2], 0x00FF0000); // DebugTriangle(&p1[0], &p1[1], &p1[2], 0x00FF0000); // DebugTriangle(&p2[0], &p2[1], &p2[2], 0x00FF0000); // Triangle(&p0[0], &p0[1], &p0[2], color); // Triangle(&p1[0], &p1[1], &p1[2], color); // Triangle(&p2[0], &p2[1], &p2[2], color); }
bool Model::InitializeBuffers(ID3D11Device* device) { D3D11_BUFFER_DESC vertexBufferDesc, indexBufferDesc; D3D11_SUBRESOURCE_DATA vertexData, indexData; HRESULT hresult; bool result; // Load the model file result = LoadModelFromFile("res/test.ngm"); if (!result) { return false; } // Fill out the vertex buffer description vertexBufferDesc.Usage = D3D11_USAGE_IMMUTABLE; vertexBufferDesc.ByteWidth = sizeof(Vertex) * m_vertexCount; vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; vertexBufferDesc.CPUAccessFlags = 0; vertexBufferDesc.MiscFlags = 0; vertexBufferDesc.StructureByteStride = 0; // Create the vertex buffer data vertexData.pSysMem = m_vertices; vertexData.SysMemPitch = 0; vertexData.SysMemSlicePitch = 0; // Create the vertex buffer hresult = device->CreateBuffer(&vertexBufferDesc, &vertexData, &m_vertexBuffer); if (FAILED(hresult)) { return false; } // Fill out the index buffer description indexBufferDesc.Usage = D3D11_USAGE_IMMUTABLE; indexBufferDesc.ByteWidth = sizeof(unsigned int) * m_indexCount; indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; indexBufferDesc.CPUAccessFlags = 0; indexBufferDesc.MiscFlags = 0; indexBufferDesc.StructureByteStride = 0; // Create the index buffer data indexData.pSysMem = m_indices; indexData.SysMemPitch = 0; indexData.SysMemSlicePitch = 0; // Create the index buffer hresult = device->CreateBuffer(&indexBufferDesc, &indexData, &m_indexBuffer); if (FAILED(hresult)) { return false; } return true; }