| 175 | VARP(lighterror, 1, 4, 100); |
| 176 | |
| 177 | void render_flat(int wtex, int x, int y, int size, int h, sqr *l1, sqr *l4, sqr *l3, sqr *l2, bool isceil) // floor/ceil quads |
| 178 | { |
| 179 | if(showmipstats) { l3 = l1 = &sbright; l4 = l2 = &sdark; } |
| 180 | |
| 181 | Texture *t = lookupworldtexture(wtex); |
| 182 | float xf = TEXTURESCALE/t->xs; |
| 183 | float yf = TEXTURESCALE/t->ys; |
| 184 | float xs = size*xf; |
| 185 | float ys = size*yf; |
| 186 | float xo = xf*x; |
| 187 | float yo = yf*y; |
| 188 | |
| 189 | bool first = striptype!=STRIP_FLOOR || x!=ox+size || striptex!=wtex || h!=oh || y!=oy; |
| 190 | |
| 191 | if(first) // start strip here |
| 192 | { |
| 193 | stripend(verts); |
| 194 | firstindex = verts.length(); |
| 195 | striptex = wtex; |
| 196 | oh = h; |
| 197 | oy = y; |
| 198 | striptype = STRIP_FLOOR; |
| 199 | if(isceil) |
| 200 | { |
| 201 | vert(x, y, h, l1, xo, yo); |
| 202 | vert(x, y+size, h, l2, xo, yo+ys); |
| 203 | } |
| 204 | else |
| 205 | { |
| 206 | vert(x, y+size, h, l2, xo, yo+ys); |
| 207 | vert(x, y, h, l1, xo, yo); |
| 208 | } |
| 209 | ol1r = l1->r; |
| 210 | ol1g = l1->g; |
| 211 | ol1b = l1->b; |
| 212 | ol2r = l2->r; |
| 213 | ol2g = l2->g; |
| 214 | ol2b = l2->b; |
| 215 | } |
| 216 | else // continue strip |
| 217 | { |
| 218 | int lighterr = lighterror*2; |
| 219 | if((iabs(ol1r-l3->r)<lighterr && iabs(ol2r-l4->r)<lighterr // skip vertices if light values are close enough |
| 220 | && iabs(ol1g-l3->g)<lighterr && iabs(ol2g-l4->g)<lighterr |
| 221 | && iabs(ol1b-l3->b)<lighterr && iabs(ol2b-l4->b)<lighterr) || !wtex) |
| 222 | { |
| 223 | verts.setsize(verts.length()-2); |
| 224 | nquads--; |
| 225 | } |
| 226 | else |
| 227 | { |
| 228 | uchar *p1 = (uchar *)(&verts[verts.length()-1].r); |
| 229 | ol1r = p1[0]; |
| 230 | ol1g = p1[1]; |
| 231 | ol1b = p1[2]; |
| 232 | uchar *p2 = (uchar *)(&verts[verts.length()-2].r); |
| 233 | ol2r = p2[0]; |
| 234 | ol2g = p2[1]; |
no test coverage detected