summaryrefslogtreecommitdiff
path: root/prge_draw.c
blob: 4228d68ef5cfb64d5821bef8df746a57f0e11bf0 (plain)
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
void clear_window(PRGEWindow wnd, V3 clear_color)
{
	glClearColor(clear_color.x, clear_color.y, clear_color.z, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
}

void begin3d(PRGEWindow wnd, Shader shader, Camera camera)
{
	F32	ar;
	MAT4	proj, view;

	ar = (F32)wnd.w/(F32)wnd.h;
	proj = camera_persp(camera, ar);
	view = getfpviewmat(&camera);

	glUseProgram(shader.id);

	setmat4fv(shader.id, PRGE_SHADER_PROJ_MAT, proj);
	setmat4fv(shader.id, PRGE_SHADER_VIEW_MAT, view);
}

void end3d(void)
{
	glUseProgram(0);
}

void begin3d_alpha(PRGEWindow wnd, Shader shader, Camera camera)
{
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	begin3d(wnd, shader, camera);
}

void end3d_alpha(void)
{
	end3d();
	glDisable(GL_BLEND);
}

void draw_mesh(Mesh mesh)
{
	S32	i;

	ASSERT(mesh.vao);

	glBindVertexArray(mesh.vao);

	for (i = 0; i < mesh.ntextures; i++) {
		glActiveTexture(GL_TEXTURE0+i);
		glBindTexture(GL_TEXTURE_2D, mesh.textures[i].id);
	}

	if (mesh.ebo)
		glDrawElements(GL_TRIANGLES, mesh.nindices, GL_UNSIGNED_INT, 0);
	else
		glDrawArrays(GL_TRIANGLES, 0, mesh.nverts);

	glBindVertexArray(0);
} 

void draw_model(Shader shader, Model model)
{
	MAT4	modelm,
		meshm,
		resm;
	S32	i;

	modelm = rotatemat4(MAT4_IDENTITY, model.rotate);
	modelm = translmat4(modelm, model.origin);
	for (i = 0; i < model.nmeshes; i++) {
		meshm = rotatemat4(MAT4_IDENTITY, model.meshes[i].rotate);
		meshm = translmat4(meshm, model.meshes[i].origin);
		resm = mulmat4(modelm, meshm);

		setmat4fv(shader.id, PRGE_SHADER_MODEL_MAT, resm);
		draw_mesh(model.meshes[i]);
	}
}