Exemple #1
0
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);
}
Exemple #2
0
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;
}