コード例 #1
0
bool rGeometryUtil::CreateCircleVerticies(const rCircle2& circle, size_t segments, rImmediateBuffer& geometry, float zValue){
	if (geometry.GeometryType() != rGeometryType::Triangles) return false;


	geometry.PushVertex(circle.center.x, circle.center.y, zValue);
	
	float step = 360.0f / (float)segments;
	unsigned short index = 1;
	
	rVector3 vertex;
	rVector3 circleCenter(circle.center.x, circle.center.y, zValue);

	for (float angle = 0.0f; angle <= 360.0f; angle += step){
		float radians = rMath::DegreeToRad(angle);
		
		vertex.Set(std::cos(radians),std::sin(radians), 0.0f);
		vertex *= circle.radius;
		vertex += circleCenter;
		
		geometry.PushVertex(vertex);
		
		if (index > 1){
			geometry.PushIndex(index, index - 1, 0);
		}
		
		index++;
	}


	return true;
}
コード例 #2
0
void CircleSweep(float x, float y, float radius, float start, float end, size_t count, rImmediateBuffer& geometry, float zValue, CircleIndexFunc indexFunc){
	unsigned short centerIndex = geometry.VertexCount();
	unsigned short currentIndex = centerIndex;
	rVector3 center(x,y, zValue);

	geometry.PushVertex(center);

	float deg = start;
	float step = (end - start) / (float)count;
	rVector3 vertex;

	for (uint16_t i = 0; i <= count; i++){
		float rad = rMath::DegreeToRad(deg);

		vertex.Set(std::cos(rad), std::sin(rad), 0.0);
		vertex.x *= radius;
		vertex.y *= -radius;
		vertex = center + vertex;

		geometry.PushVertex(vertex);
		currentIndex += 1;

		indexFunc(centerIndex, i, currentIndex);
		
		deg += step;

		if (deg > end)
			deg = end;
	}
}
コード例 #3
0
void AppendRectVerticies(const rRect& rect, rImmediateBuffer& geometry, float zValue){
	unsigned short offset = geometry.VertexCount();

	CreateRectVerticies(rect, geometry, zValue);

	for (size_t i = 0; i < 6; i ++)
		geometry.PushIndex(offset + rectIndicies[i]);

}
コード例 #4
0
bool rGeometryUtil::CreateWireRectVerticies(const rRect& rect, rImmediateBuffer& geometry, float zValue){
	if (geometry.GeometryType() != rGeometryType::Lines) return false;

	uint16_t baseIndex = (uint16_t)geometry.VertexCount();
	for (uint16_t i = 0; i < 8; i++){
		geometry.PushIndex(wireRectIndicies[i] + baseIndex);
	}

	CreateRectVerticies(rect, geometry, zValue);

	return true;
}
コード例 #5
0
bool rGeometryUtil::CreateRectVerticies(const rRect& rect, rImmediateBuffer& geometry, bool texCoords, float zValue){
	if (geometry.GeometryType() != rGeometryType::Triangles) return false;
	if (texCoords && !geometry.HasTexCoords()) return false;

	uint16_t baseIndex = (uint16_t)geometry.VertexCount();
	for (uint16_t i = 0; i < 6; i++){
		geometry.PushIndex(rectIndicies[i] + baseIndex);
	}
	
	if (texCoords){
		CreateRectVerticiesWithTexCoords(rect, geometry, zValue);
	}
	else{
		CreateRectVerticies(rect, geometry, zValue);
	}

	return true;
}
コード例 #6
0
bool rGeometryUtil::CreateRoundedRectVerticies(const rRect& rect, float radius, int detail, rImmediateBuffer& geometry, float zValue){
	if (geometry.GeometryType() != rGeometryType::Triangles) return false;

	CircleIndexFunc indexFunc = [&](uint16_t centerIndex, uint16_t vertexNum, uint16_t currentIndex){
		geometry.PushIndex(centerIndex, currentIndex - 1, currentIndex);
	};

	GenerateRoundedBorders(rect, radius, detail, geometry, zValue, indexFunc);

	rRect r(rect.x + radius, rect.y, rect.width - (2* radius), rect.height);
	AppendRectVerticies(r, geometry, zValue);

	r.Set(rect.x, rect.y+ radius, radius, rect.height - (2* radius));
	AppendRectVerticies(r, geometry, zValue);

	r.x = rect.Right() - radius;
	AppendRectVerticies(r, geometry, zValue);

	return true;
}
コード例 #7
0
void rGeometryUtil::CreateWireAlignedBoxVerticies(const rAlignedBox3& box,  rImmediateBuffer& geometry){
	unsigned short indicies[] = { 0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7 };

	geometry.Reset(rGeometryType::Lines, 3, false);
	geometry.SetIndexBuffer(indicies, 24);

	geometry.PushVertex(box.min.x, box.max.y, box.max.z);
	geometry.PushVertex(box.max.x, box.max.y, box.max.z);
	geometry.PushVertex(box.max.x, box.min.y, box.max.z);
	geometry.PushVertex(box.min.x, box.min.y, box.max.z);

	geometry.PushVertex(box.min.x, box.max.y, box.min.z);
	geometry.PushVertex(box.max.x, box.max.y, box.min.z);
	geometry.PushVertex(box.max.x, box.min.y, box.min.z);
	geometry.PushVertex(box.min.x, box.min.y, box.min.z);
}
コード例 #8
0
bool rGeometryUtil::CreateRoundedWireRectVerticies(const rRect& rect, float radius, size_t detail, rImmediateBuffer& geometry, float zValue){
	if (geometry.GeometryType() != rGeometryType::Lines) return false;

	CircleIndexFunc indexFunc = [&](uint16_t centerIndex, uint16_t vertexNum, uint16_t currentIndex){
		if (vertexNum)
			geometry.PushIndex(currentIndex - 1, currentIndex);
	};

	size_t offset = geometry.VertexCount();

	GenerateRoundedBorders(rect, radius, detail, geometry, zValue, indexFunc);
	
	geometry.PushIndex(offset + detail + 1, offset + detail + 3);
	geometry.PushIndex(offset + (2 * detail) + 3, offset + (2 * detail) + 5);
	geometry.PushIndex(offset + (3 * detail) + 5, offset + (3 * detail) + 7);
	geometry.PushIndex(offset + (4 * detail) + 7, offset + 1);

	return true;
}
コード例 #9
0
void rOpenGLGraphicsDevice::RenderImmediate(const rImmediateBuffer& geometry, const rMatrix4& transform, rMaterial* material){
	if (material && geometry.VertexCount() > 0){
		size_t vertexElementSize = geometry.VertexSize();
		bool texCoords = geometry.HasTexCoords();

		GLsizei vertexStride = texCoords ? (vertexElementSize + 2) * sizeof (GLfloat) : 0;

		glBindBuffer(GL_ARRAY_BUFFER, 0);
		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

		SetActiveMaterial(material);

		GLint programId = material->Shader()->ProgramId();
		GLuint gPositionLoc = glGetAttribLocation ( programId, "recPosition" );
		GLuint gMatrixLoc = glGetUniformLocation ( programId, "recMVPMatrix" );
		GLuint gTexCoordLoc = 0;
		
		glUniformMatrix4fv(gMatrixLoc, 1, GL_FALSE, transform.m);

		glVertexAttribPointer ( gPositionLoc, vertexElementSize, GL_FLOAT, GL_FALSE, vertexStride, geometry.VertexData() );
		glEnableVertexAttribArray ( gPositionLoc );

		if (texCoords){
			gTexCoordLoc = glGetAttribLocation ( programId, "recTexCoord" );
			glVertexAttribPointer ( gTexCoordLoc, 2, GL_FLOAT, GL_FALSE, vertexStride, geometry.VertexData() + (vertexElementSize * sizeof (GLfloat)));
			glEnableVertexAttribArray ( gTexCoordLoc );
		}
		glDrawElements ( GLGeometryType(geometry.GeometryType()), geometry.IndexCount(), GL_UNSIGNED_SHORT, geometry.IndexData() );

		glDisableVertexAttribArray ( gPositionLoc );

		if (texCoords)
			glDisableVertexAttribArray ( gTexCoordLoc );

	}
}
コード例 #10
0
void CreateRectVerticiesWithTexCoords(const rRect& rect, rImmediateBuffer& geometry, float zValue){
	geometry.PushVertex(rect.x, rect.y, zValue, 0.0f, 1.0f);
	geometry.PushVertex(rect.x + rect.width, rect.y, zValue, 1.0f,1.0f);
	geometry.PushVertex(rect.x + rect.width, rect.y + rect.height, zValue, 1.0f, 0.0f);
	geometry.PushVertex(rect.x , rect.y + rect.height, zValue, 0.0f, 0.0f);
}