-
Notifications
You must be signed in to change notification settings - Fork 0
/
renderer.lua
157 lines (106 loc) · 4 KB
/
renderer.lua
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package.path = package.path..";/home/pingu/tic80-folder/tictron-80x/renderer_functions/?.lua"
require "libraries"
Renderer={
defaultSettings={
-- Whether to display the back face of triangles ("false") or not ("true").
-- Improves performance if set to "true".
BackfaceCulling=true,
-- If disabled, gives more accurate results, at cost of performance.
SimpleSort=true,
-- Option to use tri for untextured triangles (if set to "false").
-- Not recommended to disable, although performance is better this way.
UseTTriOnly=true,
-- Draws a wireframe for triangles.
Wireframe=false,
EnableLabels=true,
ClipObjects=true,
Sort=true,
},
-- the Renderer's data, which is (usually) used during processing.
data={
scene={
-- contains vertices for transformation and other uses
vertexdump={},
-- contains draw elements (triangles, lines, etc.) for drawing, sorting, etc.
drawdump={},
camera={
position= {x=0,y=0,z=0},
rotation= {x=0,y=0,z=0},
originoffset={x=0,y=0,z=0},
FOV=120,
CPlane=nil
},
},
-- if the UseTTriOnly setting is enabled, this map is used for proper coloring
colorToUVMap={},
},
-- Debug variables.
debug={
},
-- The default cutting planes for clipping the scene.
CuttingPlanes={
NearOnly={}, --for clipping directly in front of the camera (usually the fastest)
NearFar={}, --for clipping in the front, both close and at a distance (recommended)
Full={} --for full clipping, both near, far, and at all the sides (usually the slowest)
},
}
Renderer.data.scene.camera.CPlane=Renderer.CuttingPlanes.NearFar
Rscene=Renderer.data.scene
-- Resets the default scene and setups some other variables for the Renderer, if need be.
-- Should be reset at least 1 time during program execution befofe doing anything else!
function Renderer.resetScene(customscene,newcamera)
local scene=customscene or Renderer.data.scene
local camera=newcamera or scene.camera
-- we clear our working tables and out vertex count
scene.vertexdump={}
scene.drawdump= {}
scene.objectorigins=nil
scene.camera=camera
-- we create our plane and map data if they were not created yet, so you have less work to do
if #Renderer.CuttingPlanes==0 then Renderer.recalculateCPlanes(camera) end
if #Renderer.data.colorToUVMap==0 then Renderer.buildColorMap(255) end
end
-- Builds a color map based on a special sprite where each color corresponds to
-- UV coordinates of the color on the sprite.
function Renderer.buildColorMap(sprite)
local colorToUVMap={} --prepare a table
for color=0,15 do --do for each color:
--transform a sprite's ID to its starting coordinates and add an offset based on the color
local u,v=
(sprite%16)*8+(color%4)*2+1,
(sprite//16)*8+(color//4)*2+1
colorToUVMap[color]={u,v,u,v,u,v} --add that to the table
end
Renderer.data.colorToUVMap=colorToUVMap --apply to global table
end
function Renderer.recalculateCPlanes(camera)
local camFOV=camera.FOV or 120
local NearPlane={position={x=0,y=0,z=camera.NearDistance or .1},normal={x=0,y=0,z=1}}
local FarPlane={position={x=0,y=0,z=camera.FarDistance or 64},normal={x=0,y=0,z=-1}}
local UpPlane={position={x=0,y=0,z=0},normal={x=0,y=1,z=68/camFOV}}
local DownPlane={position={x=0,y=0,z=0},normal={x=0,y=-1,z=68/camFOV}}
local LeftPlane={position={x=0,y=0,z=0},normal={x=-1,y=0,z=120/camFOV}}
local RightPlane={position={x=0,y=0,z=0},normal={x=1,y=0,z=120/camFOV}}
Renderer.CuttingPlanes.NearOnly[1]=NearPlane
Renderer.CuttingPlanes.NearFar[1]=NearPlane
Renderer.CuttingPlanes.NearFar[2]=FarPlane
Renderer.CuttingPlanes.Full[1]=NearPlane
Renderer.CuttingPlanes.Full[2]=FarPlane
Renderer.CuttingPlanes.Full[3]=UpPlane
Renderer.CuttingPlanes.Full[4]=DownPlane
Renderer.CuttingPlanes.Full[5]=LeftPlane
Renderer.CuttingPlanes.Full[6]=RightPlane
end
require "add_single_object"
require "add_objects_to_scene"
require "transform_verts"
require "clip_objects"
require "add_draw_elements"
require "replace_labels"
require "sort_scene"
require "simple_clip_scene"
require "clip_scene"
require "project_verts"
require "draw_scene"
require "full_draw"
return Renderer