Module: Quake::Bsp::FaceVertices

Defined in:
lib/quake/bsp/face_vertices.rb

Class Method Summary collapse

Class Method Details

.extract(level, face) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/quake/bsp/face_vertices.rb', line 6

def self.extract(level, face)
  verts = Array.new(face.num_edges)
  face.num_edges.times do |i|
    surfedge = level.surfedges[face.first_edge + i]
    if surfedge >= 0
      edge = level.edges[surfedge]
      verts[i] = level.vertices[edge.v0]
    else
      edge = level.edges[-surfedge]
      verts[i] = level.vertices[edge.v1]
    end
  end
  verts
end

.extract_surface(level, face) ⇒ Object

Extract vertices + texture coordinates for a face Returns a Surface with vertices, texcoords, and texinfo_index



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
# File 'lib/quake/bsp/face_vertices.rb', line 23

def self.extract_surface(level, face)
  texinfo = level.texinfo[face.texinfo_index]
  texture = level.textures[texinfo.miptex_index] if texinfo

  verts = Array.new(face.num_edges)
  texcoords = Array.new(face.num_edges)

  tex_w = (texture&.width || 64).to_f
  tex_h = (texture&.height || 64).to_f

  face.num_edges.times do |i|
    surfedge = level.surfedges[face.first_edge + i]
    if surfedge >= 0
      edge = level.edges[surfedge]
      v = level.vertices[edge.v0]
    else
      edge = level.edges[-surfedge]
      v = level.vertices[edge.v1]
    end

    verts[i] = v

    if texinfo
      u = v.dot(texinfo.s_vec) + texinfo.s_offset
      u /= tex_w

      t = v.dot(texinfo.t_vec) + texinfo.t_offset
      t /= tex_h

      texcoords[i] = [u, t]
    else
      texcoords[i] = [0.0, 0.0]
    end
  end

  Surface.new(vertices: verts, texcoords: texcoords,
              texinfo_index: face.texinfo_index)
end