1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-11 07:34:33 +02:00

#370 remove depth range check for faceAdd* routines, fix box visibility test for near objects

This commit is contained in:
XProger
2021-12-22 14:42:13 +03:00
parent 702cacb5aa
commit 8a51916cd7
13 changed files with 171 additions and 147 deletions

View File

@@ -435,7 +435,7 @@ extern int32 fps;
#define FOG_SHIFT 1
#define FOG_MAX VIEW_DIST
#define FOG_MIN (FOG_MAX - (8192 >> FOG_SHIFT))
#define VIEW_MIN_F (256 << FIXED_SHIFT)
#define VIEW_MIN_F (64 << FIXED_SHIFT)
#define VIEW_MAX_F (VIEW_DIST << FIXED_SHIFT)
#define FRUSTUM_FAR_X (5 << 10)
@@ -2249,6 +2249,7 @@ void drawFree();
void drawModel(const ItemObj* item);
void drawItem(const ItemObj* item);
void drawRooms(Camera* camera);
void drawBox(const AABBi &box);
void checkTrigger(const FloorData* fd, ItemObj* lara);
void readLevel(const uint8 *data);

View File

@@ -935,4 +935,42 @@ void drawRooms(Camera* camera)
setViewport(camera->view.room->clip);
}
#define MESH_FACE(flags, i0, i1, i2, i3) { flags, (i0 | (i1 << 8) | (i2 << 16) | (i3 << 24)) }
const MeshQuad gBoxFaces[6] = {
MESH_FACE(15, 0, 4, 5, 1),
MESH_FACE(15, 1, 5, 6, 2),
MESH_FACE(15, 2, 6, 7, 3),
MESH_FACE(15, 3, 7, 4, 0),
MESH_FACE(15, 0, 1, 2, 3),
MESH_FACE(15, 7, 6, 5, 4)
};
MeshVertex boxVertices[8];
void drawBox(const AABBi &box)
{
lightAmbient = 4096;
int32 minX = box.minX << 2;
int32 minY = box.minY << 2;
int32 minZ = box.minZ << 2;
int32 maxX = box.maxX << 2;
int32 maxY = box.maxY << 2;
int32 maxZ = box.maxZ << 2;
boxVertices[0].x = minX; boxVertices[0].y = minY; boxVertices[0].z = minZ;
boxVertices[1].x = maxX; boxVertices[1].y = minY; boxVertices[1].z = minZ;
boxVertices[2].x = maxX; boxVertices[2].y = minY; boxVertices[2].z = maxZ;
boxVertices[3].x = minX; boxVertices[3].y = minY; boxVertices[3].z = maxZ;
boxVertices[4].x = minX; boxVertices[4].y = maxY; boxVertices[4].z = minZ;
boxVertices[5].x = maxX; boxVertices[5].y = maxY; boxVertices[5].z = minZ;
boxVertices[6].x = maxX; boxVertices[6].y = maxY; boxVertices[6].z = maxZ;
boxVertices[7].x = minX; boxVertices[7].y = maxY; boxVertices[7].z = maxZ;
transformMesh(boxVertices, 8, NULL, NULL);
faceAddMesh(NULL, gBoxFaces, NULL, NULL, 0, 6, 0, 0);
}
#endif

View File

@@ -92,8 +92,8 @@ boxIsVisible_asm
ldr m, =matrixPtr
ldr m, [m]
ldr bz, [m, #(11 * 4)]
sub bz, bz, #VIEW_MIN_F
cmp bz, #(VIEW_MAX_F - VIEW_MIN_F)
add bz, bz, #VIEW_OFF_F
cmp bz, #(VIEW_OFF_F + VIEW_MAX_F)
movhi r0, #0
movhi pc, lr

View File

@@ -52,8 +52,9 @@ VIEW_DIST EQU (1024 * 10) ; max = DIV_TABLE_END << PROJ_SHIFT
FOG_SHIFT EQU 1
FOG_MAX EQU VIEW_DIST
FOG_MIN EQU (FOG_MAX - (8192 >> FOG_SHIFT))
VIEW_MIN_F EQU (256 << FIXED_SHIFT)
VIEW_MIN_F EQU (64 << FIXED_SHIFT)
VIEW_MAX_F EQU (VIEW_DIST << FIXED_SHIFT)
VIEW_OFF_F EQU (1024 << FIXED_SHIFT)
OT_SHIFT EQU 4
OT_SIZE EQU ((VIEW_MAX_F >> (FIXED_SHIFT + OT_SHIFT)) + 1)
@@ -64,4 +65,68 @@ VIEW_MAX EQU (VIEW_DIST << CLIP_SHIFT)
MIN_INT32 EQU 0x80000000
MAX_INT32 EQU 0x7FFFFFFF
MulManyVec3Mat33_F16 EQU (0x50000 + 2)
MulManyVec3Mat33_F16 EQU (0x50000 + 2)
; max depth = max(z0, z1, z2, z3) >> (CLIP_SHIFT + OT_SHIFT)
MACRO
MAX_Z4 $depth, $z0, $z1, $z2, $z3
mov $depth, $z0, asr #(CLIP_SHIFT + OT_SHIFT)
cmp $depth, $z1, asr #(CLIP_SHIFT + OT_SHIFT)
movlt $depth, $z1, asr #(CLIP_SHIFT + OT_SHIFT)
cmp $depth, $z2, asr #(CLIP_SHIFT + OT_SHIFT)
movlt $depth, $z2, asr #(CLIP_SHIFT + OT_SHIFT)
cmp $depth, $z3, asr #(CLIP_SHIFT + OT_SHIFT)
movlt $depth, $z3, asr #(CLIP_SHIFT + OT_SHIFT)
MEND
; max depth = max(z0, z1, z2) >> (CLIP_SHIFT + OT_SHIFT)
MACRO
MAX_Z3 $depth, $z0, $z1, $z2, $z3
mov $depth, $z0, asr #(CLIP_SHIFT + OT_SHIFT)
cmp $depth, $z1, asr #(CLIP_SHIFT + OT_SHIFT)
movlt $depth, $z1, asr #(CLIP_SHIFT + OT_SHIFT)
cmp $depth, $z2, asr #(CLIP_SHIFT + OT_SHIFT)
movlt $depth, $z2, asr #(CLIP_SHIFT + OT_SHIFT)
MEND
; average depth = (z0 + z1 + z2 + z2) / 4 >> (CLIP_SHIFT + OT_SHIFT)
MACRO
AVG_Z4 $depth, $z0, $z1, $z2, $z3
add $depth, $z0, $z1
add $depth, $depth, $z2
add $depth, $depth, $z3
mov $depth, $depth, asr #(2 + CLIP_SHIFT + OT_SHIFT)
MEND
; average depth = (z0 + z1 + z2 + z2) / 4 >> (CLIP_SHIFT + OT_SHIFT)
MACRO
AVG_Z3 $depth, $z0, $z1, $z2
add $depth, $z0, $z1
add $depth, $depth, $z2, lsl #1
mov $depth, $depth, asr #(2 + CLIP_SHIFT + OT_SHIFT)
MEND
; back facing check
MACRO
CCW $cross, $dx0, $dy0, $dx1, $dy1, $skip
mul $cross, $dy0, $dx1
rsb $cross, cross, #0
mlas $cross, $dx0, $dy1, $cross
ble skip
MEND
; back/front facing check depending on sign
MACRO
CCW_SIGN $cross, $sign, $dx0, $dy0, $dx1, $dy1, $skip
mul $cross, $dy0, $dx1
rsb $cross, cross, #0
mla $cross, $dx0, $dy1, $cross
teq $cross, $sign
bmi skip
MEND

View File

@@ -119,12 +119,11 @@ skip cmp fPolys, fLast
ldmia fPolys!, {flags, indices}
; get vertex pointers
and vp0, indices, #0xFF
mov vp1, indices, lsr #8
and vp1, vp1, #0xFF
mov vp2, indices, lsr #16
and vp2, vp2, #0xFF
mov vp3, indices, lsr #24
mov mask, #0xFF
and vp0, mask, indices
and vp1, mask, indices, lsr #8
and vp2, mask, indices, lsr #16
and vp3, mask, indices, lsr #24
add vp0, vp0, vp0, lsl #1
add vp1, vp1, vp1, lsl #1
@@ -149,10 +148,7 @@ skip cmp fPolys, fLast
tst mask, #CLIP_MASK
bne skip
; depth = (vz0 + vz1 + vz2 + vz3) (DEPTH_Q_AVG)
add depth, vz0, vz1
add depth, depth, vz2
add depth, depth, vz3
AVG_Z4 depth, vz0, vz1, vz2, vz3
; (vx1 - vx0) * (vy3 - vy0) <= (vy1 - vy0) * (vx3 - vx0)
ldmia vp0, {vx0, vy0}
@@ -162,25 +158,16 @@ skip cmp fPolys, fLast
sub hdy0, vy1, vy0
sub vdx0, vx3, vx0
sub vdy0, vy3, vy0
mul cross, hdy0, vdx0
rsb cross, cross, #0
mla cross, hdx0, vdy0, cross
teq cross, flags
bmi skip
CCW_SIGN cross, flags, hdx0, hdy0, vdx0, vdy0, skip
; poly is visible, store fPolys on the stack to reuse the reg
str fPolys, [sp, #SP_POLYS]
; depth = max(0, (depth / 4) >> (CLIP_SHIFT + OT_SHIFT))
movs depth, depth, lsr #(2 + CLIP_SHIFT + OT_SHIFT)
movmi depth, #0
add tmp, sp, #SP_OT
ldmia tmp, {ot, faceBase, tex}
; faceAdd
cmp depth, #(OT_SIZE - 1)
movgt depth, #(OT_SIZE - 1)
add ot, ot, depth, lsl #3 ; mul by size of OT element
ldr face, [faceBase]

View File

@@ -116,12 +116,11 @@ skip cmp fPolys, fLast
ldmia fPolys!, {flags, indices}
; get vertex pointers
and vp0, indices, #0xFF
mov vp1, indices, lsr #8
and vp1, vp1, #0xFF
mov vp2, indices, lsr #16
and vp2, vp2, #0xFF
mov vp3, indices, lsr #24
mov mask, #0xFF
and vp0, mask, indices
and vp1, mask, indices, lsr #8
and vp2, mask, indices, lsr #16
and vp3, mask, indices, lsr #24
add vp0, vp0, vp0, lsl #1
add vp1, vp1, vp1, lsl #1
@@ -146,10 +145,7 @@ skip cmp fPolys, fLast
tst mask, #CLIP_MASK
bne skip
; depth = (vz0 + vz1 + vz2 + vz3) (DEPTH_Q_AVG)
add depth, vz0, vz1
add depth, depth, vz2
add depth, depth, vz3
AVG_Z4 depth, vz0, vz1, vz2, vz3
; (vx1 - vx0) * (vy3 - vy0) <= (vy1 - vy0) * (vx3 - vx0)
ldmia vp0, {vx0, vy0}
@@ -159,18 +155,12 @@ skip cmp fPolys, fLast
sub hdy0, vy1, vy0
sub vdx0, vx3, vx0
sub vdy0, vy3, vy0
mul cross, hdy0, vdx0
rsb cross, cross, #0
mlas cross, hdx0, vdy0, cross
ble skip
CCW cross, hdx0, hdy0, vdx0, vdy0, skip
; poly is visible, store fPolys on the stack to reuse the reg
str fPolys, [sp, #SP_POLYS]
; depth = max(0, (depth / 4) >> (CLIP_SHIFT + OT_SHIFT))
movs depth, depth, lsr #(2 + CLIP_SHIFT + OT_SHIFT)
movmi depth, #0
; get color index from flags
and colorIndex, flags, #0xFF
@@ -181,8 +171,6 @@ skip cmp fPolys, fLast
add dataPtr, plutOffset, colorIndex, lsl #1
; faceAdd
cmp depth, #(OT_SIZE - 1)
movgt depth, #(OT_SIZE - 1)
add ot, ot, depth, lsl #3 ; mul by size of OT element
ldr face, [faceBase]

View File

@@ -115,10 +115,10 @@ skip cmp fPolys, fLast
ldmia fPolys!, {flags, indices}
; get vertex pointers
and vp0, indices, #0xFF
mov vp1, indices, lsr #8
and vp1, vp1, #0xFF
mov vp2, indices, lsr #16
mov mask, #0xFF
and vp0, mask, indices
and vp1, mask, indices, lsr #8
and vp2, mask, indices, lsr #16
add vp0, vp0, vp0, lsl #1
add vp1, vp1, vp1, lsl #1
@@ -139,9 +139,7 @@ skip cmp fPolys, fLast
tst mask, #CLIP_MASK
bne skip
; depth = (vz0 + vz1 + vz2 + vz2) (DEPTH_T_AVG)
add depth, vz0, vz1
add depth, depth, vz2, lsl #1
AVG_Z3 depth, vz0, vz1, vz2
; (vx1 - vx0) * (vy2 - vy0) - (vy1 - vy0) * (vx2 - vx0) <= 0
ldmia vp0, {vx0, vy0}
@@ -151,24 +149,16 @@ skip cmp fPolys, fLast
sub hdy0, vy1, vy0
sub vdx0, vx2, vx0
sub vdy0, vy2, vy0
mul cross, hdy0, vdx0
rsb cross, cross, #0
mlas cross, hdx0, vdy0, cross
ble skip
CCW cross, hdx0, hdy0, vdx0, vdy0, skip
; poly is visible, store fPolys on the stack to reuse the reg
str fPolys, [sp, #SP_POLYS]
; depth = max(0, (depth / 4) >> (CLIP_SHIFT + OT_SHIFT))
movs depth, depth, lsr #(2 + CLIP_SHIFT + OT_SHIFT)
movmi depth, #0
add tmp, sp, #SP_OT
ldmia tmp, {ot, plutOffset, faceBase, tex}
; faceAdd
cmp depth, #(OT_SIZE - 1)
movgt depth, #(OT_SIZE - 1)
add ot, ot, depth, lsl #3 ; mul by size of OT element
ldr face, [faceBase]

View File

@@ -112,10 +112,10 @@ skip cmp fPolys, fLast
ldmia fPolys!, {flags, indices}
; get vertex pointers
and vp0, indices, #0xFF
mov vp1, indices, lsr #8
and vp1, vp1, #0xFF
mov vp2, indices, lsr #16
mov mask, #0xFF
and vp0, mask, indices
and vp1, mask, indices, lsr #8
and vp2, mask, indices, lsr #16
add vp0, vp0, vp0, lsl #1
add vp1, vp1, vp1, lsl #1
@@ -136,9 +136,7 @@ skip cmp fPolys, fLast
tst mask, #CLIP_MASK
bne skip
; depth = (vz0 + vz1 + vz2 + vz3) (DEPTH_T_AVG)
add depth, vz0, vz1
add depth, depth, vz2, lsl #1
AVG_Z3 depth, vz0, vz1, vz2
; (vx1 - vx0) * (vy2 - vy0) - (vy1 - vy0) * (vx2 - vx0) <= 0
ldmia vp0, {vx0, vy0}
@@ -148,18 +146,12 @@ skip cmp fPolys, fLast
sub hdy0, vy1, vy0
sub vdx0, vx2, vx0
sub vdy0, vy2, vy0
mul cross, hdy0, vdx0
rsb cross, cross, #0
mlas cross, hdx0, vdy0, cross
ble skip
CCW cross, hdx0, hdy0, vdx0, vdy0, skip
; poly is visible, store fPolys on the stack to reuse the reg
str fPolys, [sp, #SP_POLYS]
; depth = max(0, (depth / 4) >> (CLIP_SHIFT + OT_SHIFT))
movs depth, depth, lsr #(2 + CLIP_SHIFT + OT_SHIFT)
movmi depth, #0
; get color index from flags
and colorIndex, flags, #0xFF
@@ -170,8 +162,6 @@ skip cmp fPolys, fLast
add dataPtr, plutOffset, colorIndex, lsl #1
; faceAdd
cmp depth, #(OT_SIZE - 1)
movgt depth, #(OT_SIZE - 1)
add ot, ot, depth, lsl #3 ; mul by size of OT element
ldr face, [faceBase]

View File

@@ -122,7 +122,7 @@ skip cmp fPolys, fLast
ldmia fPolys!, {flags, i0, i1}
; get vertex pointers
; get vertex pointers (indices are pre-multiplied by 12)
add vp0, fVertices, i0, lsr #16
mov i0, i0, lsl #16
add vp1, fVertices, i0, lsr #16
@@ -144,14 +144,7 @@ skip cmp fPolys, fLast
tst mask, #CLIP_MASK
bne skip
; depth = max(vz0, vz1, vz2, vz3) (DEPTH_Q_MAX)
mov depth, vz0
cmp depth, vz1
movlt depth, vz1
cmp depth, vz2
movlt depth, vz2
cmp depth, vz3
movlt depth, vz3
MAX_Z4 depth, vz0, vz1, vz2, vz3
; (vx1 - vx0) * (vy3 - vy0) <= (vy1 - vy0) * (vx3 - vx0)
ldmia vp0, {vx0, vy0}
@@ -161,18 +154,12 @@ skip cmp fPolys, fLast
sub hdy0, vy1, vy0
sub vdx0, vx3, vx0
sub vdy0, vy3, vy0
mul cross, hdy0, vdx0
rsb cross, cross, #0
mlas cross, hdx0, vdy0, cross
ble skip
CCW cross, hdx0, hdy0, vdx0, vdy0, skip
; poly is visible, store fPolys on the stack to reuse the reg
str fPolys, [sp, #SP_POLYS]
; depth = max(0, depth >> (CLIP_SHIFT + OT_SHIFT))
movs depth, depth, lsr #(CLIP_SHIFT + OT_SHIFT)
movmi depth, #0
; fog = max(0, (depth - (FOG_MIN >> OT_SHIFT)) >> 1)
sub fog, depth, #(FOG_MIN >> OT_SHIFT)
movs fog, fog, asr #1
@@ -199,8 +186,6 @@ skip cmp fPolys, fLast
add tex, tex, texIndex, lsr #(32 - FACE_MIP_SHIFT - 3) ; sizeof(Texture) = 2^3
; faceAdd
cmp depth, #(OT_SIZE - 1)
movgt depth, #(OT_SIZE - 1)
add ot, ot, depth, lsl #3 ; mul by size of OT element
mov depth, faceBase ; use depth reg due face vs faceBase reg collision

View File

@@ -118,7 +118,7 @@ skip cmp fPolys, fLast
ldmia fPolys!, {flags, i0, i1}
; get vertex pointers
; get vertex pointers (indices are pre-multiplied by 12)
add vp0, fVertices, i0, lsr #16
mov i0, i0, lsl #16
add vp1, fVertices, i0, lsr #16
@@ -136,12 +136,7 @@ skip cmp fPolys, fLast
tst mask, #CLIP_MASK
bne skip
; depth = max(vz0, vz1, vz2) (DEPTH_T_MAX)
mov depth, vz0
cmp depth, vz1
movlt depth, vz1
cmp depth, vz2
movlt depth, vz2
MAX_Z3 depth, vz0, vz1, vz2
; (vx1 - vx0) * (vy2 - vy0) <= (vy1 - vy0) * (vx2 - vx0)
ldmia vp0, {vx0, vy0}
@@ -151,18 +146,12 @@ skip cmp fPolys, fLast
sub hdy0, vy1, vy0
sub vdx0, vx2, vx0
sub vdy0, vy2, vy0
mul cross, hdy0, vdx0
rsb cross, cross, #0
mlas cross, hdx0, vdy0, cross
ble skip
CCW cross, hdx0, hdy0, vdx0, vdy0, skip
; poly is visible, store fPolys on the stack to reuse the reg
str fPolys, [sp, #SP_POLYS]
; depth = max(0, depth >> (CLIP_SHIFT + OT_SHIFT))
movs depth, depth, lsr #(CLIP_SHIFT + OT_SHIFT)
movmi depth, #0
; fog = max(0, (depth - (FOG_MIN >> OT_SHIFT)) >> 1)
sub fog, depth, #(FOG_MIN >> OT_SHIFT)
movs fog, fog, asr #1
@@ -189,8 +178,6 @@ skip cmp fPolys, fLast
add tex, tex, texIndex, lsr #(32 - FACE_MIP_SHIFT - 3) ; sizeof(Texture) = 2^3
; faceAdd
cmp depth, #(OT_SIZE - 1)
movgt depth, #(OT_SIZE - 1)
add ot, ot, depth, lsl #3 ; mul by size of OT element
mov depth, faceBase ; use depth reg due face vs faceBase reg collision

View File

@@ -10,13 +10,10 @@
x RN r0
y RN r1
z RN r2
m RN r3
e0 RN r4
e1 RN r5
e2 RN r6
dx RN r7
dy RN r12
dz RN lr
@@ -26,28 +23,27 @@ matrixTranslateRel_asm
ldr m, =matrixPtr
ldr m, [m]
add m, m, #(12 * 4)
ldmia m!, {e0, e1, e2}
mul dx, e0, x
mul dy, e1, x
mul dz, e2, x
ldmdb m!, {dx, dy, dz}
ldmia m!, {e0, e1, e2}
mla dx, e0, y, dx
mla dy, e1, y, dy
mla dz, e2, y, dz
ldmia m!, {e0, e1, e2}
ldmdb m!, {e0, e1, e2}
mla dx, e0, z, dx
mla dy, e1, z, dy
mla dz, e2, z, dz
ldmia m, {e0, e1, e2}
add e0, e0, dx
add e1, e1, dy
add e2, e2, dz
ldmdb m!, {e0, e1, e2}
mla dx, e0, y, dx
mla dy, e1, y, dy
mla dz, e2, y, dz
stmia m!, {e0, e1, e2}
ldmdb m!, {e0, e1, e2}
mla dx, e0, x, dx
mla dy, e1, x, dy
mla dz, e2, x, dz
add m, m, #(9 * 4)
stmia m!, {dx, dy, dz}
ldmfd sp!, {r4-r7, pc}

View File

@@ -61,9 +61,9 @@ loop ldmia vertex, {x, y, z} ; read transformed vertex
; check z clipping
cmp z, minZ
orrlt z, minZ, #CLIP_NEAR
orrle z, minZ, #CLIP_NEAR
cmp z, maxZ
orrgt z, maxZ, #CLIP_FAR
orrge z, maxZ, #CLIP_FAR
; projection
mov dz, z, lsr #(PROJ_SHIFT + CLIP_SHIFT) ; z is positive

View File

@@ -177,9 +177,6 @@ enum ClipFlags {
X_INLINE Face* faceAdd(int32 depth)
{
if (depth < 0) depth = 0;
if (depth > OT_SIZE - 1) depth = OT_SIZE - 1;
Face* face = gFacesBase++;
if (gOT[depth].head) {
@@ -343,10 +340,10 @@ void projectVertices_c(int32 vCount)
int32 clip = 0;
if (z < (VIEW_MIN_F >> FIXED_SHIFT)) {
if (z <= (VIEW_MIN_F >> FIXED_SHIFT)) {
z = (VIEW_MIN_F >> FIXED_SHIFT);
clip = CLIP_NEAR;
} else if (z > (VIEW_MAX_F >> FIXED_SHIFT)) {
} else if (z >= (VIEW_MAX_F >> FIXED_SHIFT)) {
z = (VIEW_MAX_F >> FIXED_SHIFT);
clip = CLIP_FAR;
}
@@ -608,11 +605,11 @@ void faceAddMeshTriangles_c(const MeshTriangle* polys, int32 count, uint32 shade
if ((c0 & c1 & c2) & CLIP_MASK)
continue;
int32 depth = DEPTH_T_AVG(v0->z, v1->z, v2->z);
if (cross(v0, v1, v2) <= 0)
continue;
int32 depth = DEPTH_T_AVG(v0->z, v1->z, v2->z);
Face* f = faceAdd(depth);
f->ccb_PIXC = shade;
@@ -648,11 +645,11 @@ void faceAddMeshQuadsFlat_c(const MeshQuad* polys, int32 count, uint32 shade)
if ((c0 & c1 & c2 & c3) & CLIP_MASK)
continue;
int32 depth = DEPTH_Q_AVG(v0->z, v1->z, v2->z, v3->z);
if (cross(v0, v1, v3) <= 0)
continue;
int32 depth = DEPTH_Q_AVG(v0->z, v1->z, v2->z, v3->z);
Face* f = faceAdd(depth);
f->ccb_PIXC = shade;
@@ -684,11 +681,11 @@ void faceAddMeshTrianglesFlat_c(const MeshTriangle* polys, int32 count, uint32 s
if ((c0 & c1 & c2) & CLIP_MASK)
continue;
int32 depth = DEPTH_T_AVG(v0->z, v1->z, v2->z);
if (cross(v0, v1, v2) <= 0)
continue;
int32 depth = DEPTH_T_AVG(v0->z, v1->z, v2->z);
Face* f = faceAdd(depth);
f->ccb_PIXC = shade;