History

Basic blinking.

Andrzej Kapolka committed 13 years ago

Commit ef7c6eb1 parent 81d03735 files · +203 −2Browse files

Showing the changes to interface/src/renderer/GeometryCache.cpp (1 of 5 files). Show all

Unified · Split

interface/src/renderer/GeometryCache.cpp+101−0
@@ -0,0 +1,101 @@
1//
2// GeometryCache.cpp
3// interface
4//
5// Created by Andrzej Kapolka on 6/21/13.
6// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
7
8#include <cmath>
9
10#include "GeometryCache.h"
11#include "world.h"
12
13GeometryCache::~GeometryCache() {
14 foreach (const VerticesIndices& vbo, _hemisphereVBOs) {
15 glDeleteBuffers(1, &vbo.first);
16 glDeleteBuffers(1, &vbo.second);
17 }
18}
19
20void GeometryCache::renderHemisphere(int slices, int stacks) {
21 VerticesIndices& vbo = _hemisphereVBOs[SlicesStacks(slices, stacks)];
22 int vertices = slices * (stacks - 1) + 1;
23 int indices = slices * 2 * 3 * (stacks - 2) + slices * 3;
24 if (vbo.first == 0) {
25 GLfloat* vertexData = new GLfloat[vertices * 3];
26 GLfloat* vertex = vertexData;
27 for (int i = 0; i < stacks - 1; i++) {
28 float phi = PIf * 0.5f * i / (stacks - 1), z, radius;
29 sincosf(phi, &z, &radius);
30
31 for (int j = 0; j < slices; j++) {
32 float theta = PIf * 2.0f * j / slices;
33 float x, y;
34 sincosf(theta, &x, &y);
35 x *= radius;
36 y *= radius;
37
38 *(vertex++) = x;
39 *(vertex++) = y;
40 *(vertex++) = z;
41 }
42 }
43 *(vertex++) = 0.0f;
44 *(vertex++) = 0.0f;
45 *(vertex++) = 1.0f;
46
47 glGenBuffers(1, &vbo.first);
48 glBindBuffer(GL_ARRAY_BUFFER, vbo.first);
49 const int BYTES_PER_VERTEX = 3 * sizeof(GLfloat);
50 glBufferData(GL_ARRAY_BUFFER, vertices * BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW);
51 delete[] vertexData;
52
53 GLushort* indexData = new GLushort[indices];
54 GLushort* index = indexData;
55 for (int i = 0; i < stacks - 2; i++) {
56 GLushort bottom = i * slices;
57 GLushort top = bottom + slices;
58 for (int j = 0; j < slices; j++) {
59 int next = (j + 1) % slices;
60
61 *(index++) = bottom + j;
62 *(index++) = top + next;
63 *(index++) = top + j;
64
65 *(index++) = bottom + j;
66 *(index++) = bottom + next;
67 *(index++) = top + next;
68 }
69 }
70 GLushort bottom = (stacks - 2) * slices;
71 GLushort top = bottom + slices;
72 for (int i = 0; i < slices; i++) {
73 *(index++) = bottom + i;
74 *(index++) = bottom + (i + 1) % slices;
75 *(index++) = top;
76 }
77
78 glGenBuffers(1, &vbo.second);
79 glBindBuffer(GL_ARRAY_BUFFER, vbo.second);
80 const int BYTES_PER_INDEX = sizeof(GLushort);
81 glBufferData(GL_ARRAY_BUFFER, indices * BYTES_PER_INDEX, indexData, GL_STATIC_DRAW);
82 delete[] indexData;
83
84 } else {
85 glBindBuffer(GL_ARRAY_BUFFER, vbo.first);
86 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second);
87 }
88 glEnableClientState(GL_VERTEX_ARRAY);
89 glEnableClientState(GL_NORMAL_ARRAY);
90
91 glVertexPointer(3, GL_FLOAT, 0, 0);
92 glNormalPointer(GL_FLOAT, 0, 0);
93
94 glDrawRangeElementsEXT(GL_TRIANGLES, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0);
95
96 glDisableClientState(GL_VERTEX_ARRAY);
97 glDisableClientState(GL_NORMAL_ARRAY);
98
99 glBindBuffer(GL_ARRAY_BUFFER, 0);
100 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
101}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t