#include "depth.h"
 
 
 
#include "brender/brender.h"
 
#include "displays.h"
 
#include "errors.h"
 
#include "globvars.h"
 
#include "globvrkm.h"
 
#include "globvrpb.h"
 
#include "harness/hooks.h"
 
#include "harness/trace.h"
 
#include "pd/sys.h"
 
#include "replay.h"
 
#include "spark.h"
 
#include "trig.h"
 
#include "utility.h"
 
#include "world.h"
 
#include <math.h>
 
#include <stdlib.h>
 
 
 
tDepth_effect gDistance_depth_effects[4];
 
int gSky_on;
 
int gDepth_cueing_on;
 
tDepth_effect_type gSwap_depth_effect_type;
 
br_scalar gSky_height;
 
br_scalar gSky_x_multiplier;
 
br_scalar gSky_width;
 
br_scalar gSky_y_multiplier;
 
tU32 gLast_depth_change;
 
br_scalar gOld_yon;
 
br_pixelmap* gWater_shade_table;
 
br_material* gHorizon_material;
 
br_model* gRearview_sky_model;
 
int gFog_shade_table_power;
 
br_actor* gRearview_sky_actor;
 
int gAcid_shade_table_power;
 
int gWater_shade_table_power;
 
br_model* gForward_sky_model;
 
br_actor* gForward_sky_actor;
 
int gDepth_shade_table_power;
 
br_pixelmap* gFog_shade_table;
 
int gSwap_depth_effect_start;
 
br_pixelmap* gDepth_shade_table;
 
tSpecial_volume* gLast_camera_special_volume;
 
br_pixelmap* gAcid_shade_table;
 
int gSwap_depth_effect_end;
 
br_pixelmap* gSwap_sky_texture;
 
br_angle gOld_fov;
 
br_angle gSky_image_width;
 
br_angle gSky_image_height;
 
br_angle gSky_image_underground;
 
 
 
// IDA: int __usercall Log2@<EAX>(int pNumber@<EAX>)
 
int Log2(int pNumber) {
 
    int i;
 
    int bits[16];
 
    LOG_TRACE("(%d)", pNumber);
 
 
 
    bits[0] = 1;
 
    bits[1] = 2;
 
    bits[2] = 4;
 
    bits[3] = 8;
 
    bits[4] = 16;
 
    bits[5] = 32;
 
    bits[6] = 64;
 
    bits[7] = 128;
 
    bits[8] = 256;
 
    bits[9] = 512;
 
    bits[10] = 1024;
 
    bits[11] = 2048;
 
    bits[12] = 4096;
 
    bits[13] = 0x2000;
 
    bits[14] = 0x4000;
 
    bits[15] = 0x8000;
 
    for (i = COUNT_OF(bits) - 1; i >= 0; --i) {
 
        if ((bits[i] & pNumber) != 0) {
 
            return i;
 
        }
 
    }
 
    return 0;
 
}
 
 
 
// IDA: br_scalar __cdecl CalculateWrappingMultiplier(br_scalar pValue, br_scalar pYon)
 
br_scalar CalculateWrappingMultiplier(br_scalar pValue, br_scalar pYon) {
 
    br_scalar k;
 
    br_scalar trunc_k;
 
    int int_k;
 
    LOG_TRACE("(%f, %f)", pValue, pYon);
 
 
 
    k = pYon * 1.3f * TAU / pValue;
 
    int_k = (int)k;
 
    if (k - int_k <= .5f) {
 
        trunc_k = int_k;
 
    } else {
 
        trunc_k = int_k + 1.f;
 
    }
 
    return trunc_k / TAU * pValue;
 
}
 
 
 
// IDA: br_scalar __usercall DepthCueingShiftToDistance@<ST0>(int pShift@<EAX>)
 
br_scalar DepthCueingShiftToDistance(int pShift) {
 
    LOG_TRACE("(%d)", pShift);
 
    NOT_IMPLEMENTED();
 
}
 
 
 
// IDA: void __usercall FogAccordingToGPSCDE(br_material *pMaterial@<EAX>)
 
void FogAccordingToGPSCDE(br_material* pMaterial) {
 
    //int start; // Pierre-Marie Baty -- unused variable
 
    //int end; // Pierre-Marie Baty -- unused variable
 
    LOG_TRACE("(%p)", pMaterial);
 
    NOT_IMPLEMENTED();
 
}
 
 
 
// IDA: void __cdecl FrobFog()
 
void FrobFog(void) {
 
    //int i; // Pierre-Marie Baty -- unused variable
 
    //br_material* mat; // Pierre-Marie Baty -- unused variable
 
    LOG_TRACE("()");
 
    NOT_IMPLEMENTED();
 
}
 
 
 
// IDA: void __usercall InstantDepthChange(tDepth_effect_type pType@<EAX>, br_pixelmap *pSky_texture@<EDX>, int pStart@<EBX>, int pEnd@<ECX>)
 
void InstantDepthChange(tDepth_effect_type pType, br_pixelmap* pSky_texture, int pStart, int pEnd) {
 
    LOG_TRACE("(%d, %p, %d, %d)", pType, pSky_texture, pStart, pEnd);
 
 
 
    if (pType == -1) {
 
        pStart = 3;
 
        pEnd = 3;
 
    }
 
 
 
    gProgram_state.current_depth_effect.sky_texture = pSky_texture;
 
    gHorizon_material->colour_map = pSky_texture;
 
    BrMaterialUpdate(gHorizon_material, BR_MATU_ALL);
 
    gProgram_state.current_depth_effect.type = pType;
 
    gProgram_state.current_depth_effect.start = pStart;
 
    gProgram_state.current_depth_effect.end = pEnd;
 
    gProgram_state.default_depth_effect.type = pType;
 
    gProgram_state.default_depth_effect.start = pStart;
 
    gProgram_state.default_depth_effect.end = pEnd;
 
}
 
 
 
// IDA: br_scalar __cdecl Tan(br_scalar pAngle)
 
br_scalar Tan(br_scalar pAngle) {
 
    LOG_TRACE("(%f)", pAngle);
 
 
 
    return sinf(BrAngleToRadian(pAngle)) / cosf(BrAngleToRadian(pAngle));
 
}
 
 
 
// IDA: br_scalar __usercall EdgeU@<ST0>(br_angle pSky@<EAX>, br_angle pView@<EDX>, br_angle pPerfect@<EBX>)
 
br_scalar EdgeU(br_angle pSky, br_angle pView, br_angle pPerfect) {
 
    br_scalar a;
 
    br_scalar b;
 
    br_scalar c;
 
    LOG_TRACE("(%d, %d, %d)", pSky, pView, pPerfect);
 
 
 
    a = cosf(BrAngleToRadian(pPerfect));
 
    b = sinf(BrAngleToRadian(pView));
 
    c = cosf(BrAngleToRadian(pView));
 
    return b * a * a / (BrAngleToRadian(pSky) * (1.f + c));
 
}
 
 
 
// IDA: void __usercall MungeSkyModel(br_actor *pCamera@<EAX>, br_model *pModel@<EDX>)
 
void MungeSkyModel(br_actor* pCamera, br_model* pModel) {
 
    br_camera* camera_data;
 
    br_scalar horizon_half_height;
 
    br_scalar horizon_half_width;
 
    br_scalar horizon_half_diag;
 
    br_scalar tan_half_fov;
 
    br_scalar sky_distance;
 
    //br_angle half_hori_fov; // Pierre-Marie Baty -- unused variable
 
    br_angle half_diag_fov;
 
    tU8 nbands;
 
    tU8 band;
 
    tU8 vertex;
 
    tU8 stripe;
 
    br_scalar edge_u;
 
    br_scalar narrow_u;
 
    br_angle min_angle;
 
    br_angle angle_range;
 
    br_angle angle;
 
    LOG_TRACE("(%p, %p)", pCamera, pModel);
 
 
 
    camera_data = pCamera->type_data;
 
    tan_half_fov = Tan(camera_data->field_of_view / 2);
 
    sky_distance = camera_data->yon_z - 1.f;
 
    horizon_half_width = sky_distance * tan_half_fov;
 
    horizon_half_height = horizon_half_width * camera_data->aspect;
 
    horizon_half_diag = sqrtf(horizon_half_height * horizon_half_height + horizon_half_width * horizon_half_width);
 
    half_diag_fov = BrRadianToAngle(atan2f(horizon_half_diag, sky_distance));
 
    edge_u = EdgeU(gSky_image_width, 2 * half_diag_fov, BR_ANGLE_DEG(10));
 
    narrow_u = edge_u / 2.f;
 
    gSky_width = horizon_half_width * 2.f;
 
    gSky_height = horizon_half_height * 2.f;
 
    gSky_x_multiplier = CalculateWrappingMultiplier(gSky_width, camera_data->yon_z);
 
    gSky_y_multiplier = CalculateWrappingMultiplier(gSky_height, camera_data->yon_z);
 
 
 
    for (vertex = 0; vertex < 88; vertex += 4) {
 
        pModel->vertices[vertex].map.v[0] = -edge_u;
 
    }
 
    for (vertex = 1; vertex < 88; vertex += 4) {
 
        pModel->vertices[vertex].map.v[0] = -narrow_u;
 
    }
 
    for (vertex = 2; vertex < 88; vertex += 4) {
 
        pModel->vertices[vertex].map.v[0] = narrow_u;
 
    }
 
    for (vertex = 3; vertex < 88; vertex += 4) {
 
        pModel->vertices[vertex].map.v[0] = edge_u;
 
    }
 
    for (vertex = 0; vertex < 88; vertex += 4) {
 
        pModel->vertices[vertex].p.v[0] = -horizon_half_diag;
 
    }
 
    for (vertex = 1; vertex < 88; vertex += 4) {
 
        pModel->vertices[vertex].p.v[0] = -(horizon_half_diag / 2.f);
 
    }
 
    for (vertex = 2; vertex < 88; vertex += 4) {
 
        pModel->vertices[vertex].p.v[0] = horizon_half_diag / 2.f;
 
    }
 
    for (vertex = 3; vertex < 88; vertex += 4) {
 
        pModel->vertices[vertex].p.v[0] = horizon_half_diag;
 
    }
 
    PossibleService();
 
    angle_range = -gSky_image_underground - (-BR_ANGLE_DEG(90) - half_diag_fov);
 
    for (band = 0; band < 2u; band++) {
 
        vertex = 4 * band;
 
        angle = -BR_ANGLE_DEG(90) - half_diag_fov + angle_range * band / 2;
 
        pModel->vertices[vertex].p.v[1] = sinf(BrAngleToRadian(angle)) * sky_distance;
 
        pModel->vertices[vertex].p.v[2] = -cosf(BrAngleToRadian(angle)) * sky_distance;
 
    }
 
    min_angle = -gSky_image_underground;
 
    angle_range = gSky_image_height;
 
    nbands = 18;
 
    for (band = 0; band < nbands; band++) {
 
        vertex = 4 * band + 8;
 
        pModel->vertices[vertex].p.v[1] = sinf(BrAngleToRadian(min_angle + angle_range * band / nbands)) * sky_distance;
 
        pModel->vertices[vertex].p.v[2] = -cosf(BrAngleToRadian(min_angle + angle_range * band / nbands)) * sky_distance;
 
    }
 
    min_angle = gSky_image_height - gSky_image_underground;
 
    angle_range = half_diag_fov + BR_ANGLE_DEG(90) - (gSky_image_height - gSky_image_underground);
 
    for (band = 0; band <= 1u; band++) {
 
        vertex = 4 * band + 80;
 
        angle = min_angle + angle_range * band;
 
        pModel->vertices[vertex].p.v[1] = sinf(BrAngleToRadian(angle)) * sky_distance;
 
        pModel->vertices[vertex].p.v[2] = -cosf(BrAngleToRadian(angle)) * sky_distance;
 
    }
 
    PossibleService();
 
    for (band = 0; band <= 21u; ++band) {
 
        vertex = 4 * band;
 
        for (stripe = 1; stripe < 4u; ++stripe) {
 
            pModel->vertices[vertex + stripe].p.v[1] = pModel->vertices[vertex].p.v[1];
 
            pModel->vertices[vertex + stripe].p.v[2] = pModel->vertices[vertex].p.v[2];
 
        }
 
    }
 
 
 
    BrModelUpdate(pModel, BR_MODU_ALL & ~BR_MODU_VERTEX_NORMALS);
 
}
 
 
 
// IDA: br_model* __usercall CreateHorizonModel@<EAX>(br_actor *pCamera@<EAX>)
 
br_model* CreateHorizonModel(br_actor* pCamera) {
 
    //tU8 nbands; // Pierre-Marie Baty -- unused variable
 
    tU8 band;
 
    tU8 vertex;
 
    tU8 stripe;
 
    br_model* model;
 
    LOG_TRACE("(%p)", pCamera);
 
 
 
    model = BrModelAllocate(NULL, 88, 126);
 
    model->flags |= BR_MODF_KEEP_ORIGINAL;
 
    for (band = 0; band < 21; band++) {
 
        for (stripe = 0; stripe < 3; stripe++) {
 
            model->faces[6 * band + 2 * stripe].vertices[0] = stripe + 4 * band + 0;
 
            model->faces[6 * band + 2 * stripe].vertices[1] = stripe + 4 * band + 1;
 
            model->faces[6 * band + 2 * stripe].vertices[2] = stripe + 4 * band + 5;
 
            model->faces[6 * band + 2 * stripe + 1].vertices[0] = stripe + 4 * band + 0;
 
            model->faces[6 * band + 2 * stripe + 1].vertices[1] = stripe + 4 * band + 5;
 
            model->faces[6 * band + 2 * stripe + 1].vertices[2] = stripe + 4 * band + 4;
 
            model->faces[6 * band + 2 * stripe + 0].smoothing = 1;
 
            model->faces[6 * band + 2 * stripe + 1].smoothing = 1;
 
            model->faces[6 * band + 2 * stripe + 0].material = NULL;
 
            model->faces[6 * band + 2 * stripe + 1].material = NULL;
 
        }
 
    }
 
    for (vertex = 0; vertex < 12; vertex++) {
 
        model->vertices[vertex].map.v[1] = 0.9999999f;
 
    }
 
    for (vertex = 80; vertex < 88; vertex++) {
 
        model->vertices[vertex].map.v[1] = 0.f;
 
    }
 
    for (band = 1; band < 18; band++) {
 
        model->vertices[4 * band + 8].map.v[1] = (float)(18 - band) / 18.f;
 
        for (stripe = 1; stripe < 4; stripe++) {
 
            model->vertices[4 * band + 8 + stripe].map.v[1] = model->vertices[4 * band + 8].map.v[1];
 
        }
 
    }
 
    return model;
 
}
 
 
 
// IDA: void __usercall LoadDepthTable(char *pName@<EAX>, br_pixelmap **pTable@<EDX>, int *pPower@<EBX>)
 
void LoadDepthTable(char* pName, br_pixelmap** pTable, int* pPower) {
 
    tPath_name the_path;
 
    int i;
 
    int j;
 
    tU8 temp;
 
    LOG_TRACE("(\"%s\", %p, %p)", pName, pTable, pPower);
 
 
 
#define PTABLE_PIXEL_AT(X, Y) ((tU8*)((*pTable)->pixels))[(X) + (Y) * (*pTable)->row_bytes]
 
 
 
    PathCat(the_path, gApplication_path, "SHADETAB");
 
    PathCat(the_path, the_path, pName);
 
    *pTable = DRPixelmapLoad(the_path);
 
    if (*pTable == NULL) {
 
        FatalError(kFatalError_LoadDepthCueShadeTable);
 
    }
 
    *pPower = Log2((*pTable)->height);
 
    for (i = 0; i < (*pTable)->width; i++) {
 
        for (j = 0; j < (*pTable)->height / 2; j++) {
 
            temp = PTABLE_PIXEL_AT(i, j);
 
            PTABLE_PIXEL_AT(i, j) = PTABLE_PIXEL_AT(i, ((*pTable)->height - j - 1));
 
            PTABLE_PIXEL_AT(i, ((*pTable)->height - j - 1)) = temp;
 
        }
 
    }
 
 
 
#undef PTABLE_PIXEL_AT
 
}
 
 
 
// IDA: void __cdecl InitDepthEffects()
 
void InitDepthEffects(void) {
 
    tPath_name the_path;
 
    int i;
 
    int j;
 
 
 
    LoadDepthTable("DEPTHCUE.TAB", &gDepth_shade_table, &gDepth_shade_table_power);
 
    LoadDepthTable("FOG.TAB", &gFog_shade_table, &gFog_shade_table_power);
 
    LoadDepthTable("ACIDFOG.TAB", &gAcid_shade_table, &gAcid_shade_table_power);
 
    LoadDepthTable("BLUEGIT.TAB", &gWater_shade_table, &gWater_shade_table_power);
 
    GenerateSmokeShades();
 
    PathCat(the_path, gApplication_path, "MATERIAL");
 
    PathCat(the_path, the_path, "HORIZON.MAT");
 
    gHorizon_material = BrMaterialLoad(the_path);
 
    if (gHorizon_material == NULL) {
 
        FatalError(kFatalError_FindSkyMaterial_S, "HORIZON.MAT"); // 2nd argument added
 
    }
 
    gHorizon_material->index_blend = BrPixelmapAllocate(BR_PMT_INDEX_8, 256, 256, NULL, 0);
 
 
 
    // HACK: moved below loop
 
    // BrTableAdd(gHorizon_material->index_blend);
 
    for (i = 0; i < 256; i++) {
 
        for (j = 0; j < 256; j++) {
 
            *((tU8*)gHorizon_material->index_blend->pixels + 256 * i + j) = j;
 
        }
 
    }
 
    // HACK: this should be above the for loop. Haven't been able to figure out how this is working in OG, as changes made to the pixelmap
 
    // don't update the stored copy without calling `BrTableUpdate`.
 
    BrTableAdd(gHorizon_material->index_blend);
 
 
 
    gHorizon_material->flags |= BR_MATF_PERSPECTIVE;
 
    BrMaterialAdd(gHorizon_material);
 
    gForward_sky_model = CreateHorizonModel(gCamera);
 
    gRearview_sky_model = CreateHorizonModel(gRearview_camera);
 
    BrModelAdd(gForward_sky_model);
 
    BrModelAdd(gRearview_sky_model);
 
    gForward_sky_actor = BrActorAllocate(BR_ACTOR_MODEL, NULL);
 
    gForward_sky_actor->model = gForward_sky_model;
 
    gForward_sky_actor->material = gHorizon_material;
 
    gForward_sky_actor->render_style = BR_RSTYLE_NONE;
 
    BrActorAdd(gUniverse_actor, gForward_sky_actor);
 
    gRearview_sky_actor = BrActorAllocate(BR_ACTOR_MODEL, NULL);
 
    gRearview_sky_actor->model = gRearview_sky_model;
 
    gRearview_sky_actor->material = gHorizon_material;
 
    gRearview_sky_actor->render_style = BR_RSTYLE_NONE;
 
    BrActorAdd(gUniverse_actor, gRearview_sky_actor);
 
    gLast_camera_special_volume = 0;
 
}
 
 
 
// IDA: void __usercall DoDepthByShadeTable(br_pixelmap *pRender_buffer@<EAX>, br_pixelmap *pDepth_buffer@<EDX>, br_pixelmap *pShade_table@<EBX>, int pShade_table_power@<ECX>, int pStart, int pEnd)
 
void DoDepthByShadeTable(br_pixelmap* pRender_buffer, br_pixelmap* pDepth_buffer, br_pixelmap* pShade_table, int pShade_table_power, int pStart, int pEnd) {
 
    tU8* render_ptr;
 
    tU8* shade_table_pixels;
 
    tU16* depth_ptr;
 
    tU16 depth_value;
 
    tU16 too_near;
 
    int depth_shift_amount;
 
    //int depth_start; // Pierre-Marie Baty -- unused variable
 
    int y;
 
    int x;
 
    int depth_line_skip;
 
    int render_line_skip;
 
    LOG_TRACE("(%p, %p, %p, %d, %d, %d)", pRender_buffer, pDepth_buffer, pShade_table, pShade_table_power, pStart, pEnd);
 
 
 
    too_near = 0xffff - (1 << pStart);
 
    shade_table_pixels = pShade_table->pixels;
 
    depth_shift_amount = pShade_table_power + 8 - pStart - pEnd;
 
    render_ptr = (tU8*)pRender_buffer->pixels + pRender_buffer->base_x + pRender_buffer->base_y * pRender_buffer->row_bytes;
 
    depth_ptr = pDepth_buffer->pixels;
 
    render_line_skip = pRender_buffer->row_bytes - pRender_buffer->width;
 
    depth_line_skip = pDepth_buffer->row_bytes / 2 - pRender_buffer->width;
 
 
 
    if (depth_shift_amount <= 0) {
 
        if (depth_shift_amount >= 0) {
 
            for (y = 0; y < pRender_buffer->height; ++y) {
 
                for (x = 0; x < pRender_buffer->width; ++x) {
 
                    if (*depth_ptr != 0xFFFF) {
 
                        depth_value = *depth_ptr - too_near;
 
                        if (depth_value < -(int16_t)too_near) {
 
                            *render_ptr = shade_table_pixels[(depth_value & 0xFF00) + *render_ptr];
 
                        }
 
                    }
 
                    ++render_ptr;
 
                    ++depth_ptr;
 
                }
 
                render_ptr += render_line_skip;
 
                depth_ptr += depth_line_skip;
 
            }
 
        } else {
 
            for (y = 0; pRender_buffer->height > y; ++y) {
 
                for (x = 0; pRender_buffer->width > x; ++x) {
 
                    if (*depth_ptr != 0xFFFF) {
 
                        depth_value = *depth_ptr - too_near;
 
                        if (depth_value < -(int16_t)too_near) {
 
                            *render_ptr = shade_table_pixels[*render_ptr + ((depth_value >> (pEnd - (pShade_table_power + 8 - pStart))) & 0xFF00)];
 
                        }
 
                    }
 
                    ++render_ptr;
 
                    ++depth_ptr;
 
                }
 
                render_ptr += render_line_skip;
 
                depth_ptr += depth_line_skip;
 
            }
 
        }
 
    } else {
 
        for (y = 0; pRender_buffer->height > y; ++y) {
 
            for (x = 0; pRender_buffer->width > x; ++x) {
 
                if (*depth_ptr != 0xFFFF) {
 
                    depth_value = *depth_ptr - too_near;
 
                    if (depth_value < -(int16_t)too_near) {
 
                        *render_ptr = shade_table_pixels[*render_ptr + ((depth_value << depth_shift_amount) & 0xFF00)];
 
                    }
 
                }
 
                ++render_ptr;
 
                ++depth_ptr;
 
            }
 
            render_ptr += render_line_skip;
 
            depth_ptr += depth_line_skip;
 
        }
 
    }
 
}
 
 
 
// IDA: void __usercall ExternalSky(br_pixelmap *pRender_buffer@<EAX>, br_pixelmap *pDepth_buffer@<EDX>, br_actor *pCamera@<EBX>, br_matrix34 *pCamera_to_world@<ECX>)
 
void ExternalSky(br_pixelmap* pRender_buffer, br_pixelmap* pDepth_buffer, br_actor* pCamera, br_matrix34* pCamera_to_world) {
 
    int dst_x;
 
    int src_x;
 
    int dx;
 
    int hori_y;
 
    int top_y;
 
    int hori_pixels;
 
    //br_angle yaw; // Pierre-Marie Baty -- unused variable
 
    br_angle hori_sky;
 
    //br_angle pitch; // Pierre-Marie Baty -- unused variable
 
    br_angle vert_sky;
 
    br_camera* camera;
 
    br_scalar tan_half_fov;
 
    br_scalar tan_half_hori_fov;
 
    br_scalar tan_half_hori_sky;
 
    br_scalar hshift;
 
    br_scalar tan_pitch;
 
    tU8 top_col;
 
    tU8 bot_col;
 
    int bot_height;
 
    //int repetitions; // Pierre-Marie Baty -- unused variable
 
    br_pixelmap* col_map;
 
    LOG_TRACE("(%p, %p, %p, %p)", pRender_buffer, pDepth_buffer, pCamera, pCamera_to_world);
 
 
 
    dst_x = 0;
 
    col_map = gHorizon_material->colour_map;
 
    camera = (br_camera*)pCamera->type_data;
 
    tan_half_fov = Tan(camera->field_of_view / 2);
 
    tan_half_hori_fov = tan_half_fov * camera->aspect;
 
 
 
    vert_sky 
= BrRadianToAngle
(atan2(pCamera_to_world
->m
[2][0], pCamera_to_world
->m
[2][2])); 
    hori_sky 
= BrRadianToAngle
(atan2(col_map
->width 
* tan_half_hori_fov 
/ (double)pRender_buffer
->width
, 1)); 
 
 
    tan_half_hori_sky = -BrFixedToFloat(vert_sky) / BrFixedToFloat(BR_ANGLE_DEG(360) / (int)(1.0f / BrFixedToFloat(2 * hori_sky) + 0.5f));
 
 
 
    dx = col_map->width * tan_half_hori_sky;
 
    while (dx < 0) {
 
        dx += col_map->width;
 
    }
 
    while (dx > col_map->width) {
 
        dx -= col_map->width;
 
    }
 
 
 
    hshift = col_map->height - gSky_image_underground * col_map->height / gSky_image_height;
 
    tan_pitch = sqrtf(pCamera_to_world->m[2][0] * pCamera_to_world->m[2][0] + pCamera_to_world->m[2][2] * pCamera_to_world->m[2][2]);
 
    hori_y = -(pCamera_to_world->m[2][1]
 
                 / tan_pitch
 
                 / tan_half_fov * pRender_buffer->height / 2.0f)
 
        - hshift;
 
 
 
    while (dst_x < pRender_buffer->width) {
 
        hori_pixels = col_map->width - dx;
 
        if (hori_pixels > pRender_buffer->width - dst_x) {
 
            hori_pixels = pRender_buffer->width - dst_x;
 
        }
 
        src_x = dx - col_map->origin_x;
 
        DRPixelmapRectangleCopy(pRender_buffer, dst_x - pRender_buffer->origin_x, hori_y, col_map, src_x, -col_map->origin_y, hori_pixels, col_map->height);
 
        dx = 0;
 
        dst_x += hori_pixels;
 
    }
 
 
 
    top_y = hori_y + pRender_buffer->origin_y;
 
    if (top_y > 0) {
 
        top_col = ((tU8*)col_map->pixels)[0];
 
        DRPixelmapRectangleFill(pRender_buffer, -pRender_buffer->origin_x, -pRender_buffer->origin_y, pRender_buffer->width, top_y, top_col);
 
    }
 
    bot_height = pRender_buffer->height - pRender_buffer->origin_y - hori_y - col_map->height;
 
    if (bot_height > 0) {
 
        bot_col = ((tU8*)col_map->pixels)[col_map->row_bytes * (col_map->height - 1)];
 
        DRPixelmapRectangleFill(pRender_buffer, -pRender_buffer->origin_x, hori_y + col_map->height, pRender_buffer->width, bot_height, bot_col);
 
    }
 
}
 
 
 
#define ACTOR_CAMERA(ACTOR) ((br_camera*)((ACTOR)->type_data))
 
 
 
// IDA: void __usercall DoHorizon(br_pixelmap *pRender_buffer@<EAX>, br_pixelmap *pDepth_buffer@<EDX>, br_actor *pCamera@<EBX>, br_matrix34 *pCamera_to_world@<ECX>)
 
void DoHorizon(br_pixelmap* pRender_buffer, br_pixelmap* pDepth_buffer, br_actor* pCamera, br_matrix34* pCamera_to_world) {
 
    br_angle yaw;
 
    br_actor* actor;
 
    LOG_TRACE("(%p, %p, %p, %p)", pRender_buffer, pDepth_buffer, pCamera, pCamera_to_world);
 
 
 
    yaw = BrRadianToAngle(atan2f(pCamera_to_world->m[2][0], pCamera_to_world->m[2][2]));
 
    if (!gProgram_state.cockpit_on && !(gAction_replay_mode && gAction_replay_camera_mode)) {
 
        return;
 
    }
 
    if (gRendering_mirror) {
 
        actor = gRearview_sky_actor;
 
    } else {
 
        actor = gForward_sky_actor;
 
        if (ACTOR_CAMERA(gCamera)->field_of_view != gOld_fov || ACTOR_CAMERA(gCamera)->yon_z != gOld_yon) {
 
            gOld_fov = ACTOR_CAMERA(gCamera)->field_of_view;
 
            gOld_yon = ACTOR_CAMERA(gCamera)->yon_z;
 
            MungeSkyModel(gCamera, gForward_sky_model);
 
        }
 
    }
 
    BrMatrix34RotateY(&actor->t.t.mat, yaw);
 
    BrVector3Copy(&actor->t.t.translate.t, (br_vector3*)pCamera_to_world->m[3]);
 
    gHorizon_material->map_transform.m[0][0] = 1.f;
 
    gHorizon_material->map_transform.m[0][1] = 0.f;
 
    gHorizon_material->map_transform.m[1][0] = 0.f;
 
    gHorizon_material->map_transform.m[1][1] = 1.f;
 
    gHorizon_material->map_transform.m[2][0] = -BrFixedToFloat(yaw) / BrFixedToFloat(gSky_image_width);
 
    gHorizon_material->map_transform.m[2][1] = 0.f;
 
    BrMaterialUpdate(gHorizon_material, BR_MATU_ALL);
 
    actor->render_style = BR_RSTYLE_FACES;
 
    BrZbSceneRenderAdd(actor);
 
    actor->render_style = BR_RSTYLE_NONE;
 
}
 
 
 
// IDA: void __usercall DoDepthCue(br_pixelmap *pRender_buffer@<EAX>, br_pixelmap *pDepth_buffer@<EDX>)
 
void DoDepthCue(br_pixelmap* pRender_buffer, br_pixelmap* pDepth_buffer) {
 
    LOG_TRACE("(%p, %p)", pRender_buffer, pDepth_buffer);
 
 
 
    DoDepthByShadeTable(
 
        pRender_buffer,
 
        pDepth_buffer,
 
        gDepth_shade_table,
 
        gDepth_shade_table_power,
 
        gProgram_state.current_depth_effect.start,
 
        gProgram_state.current_depth_effect.end);
 
}
 
 
 
// IDA: void __usercall DoFog(br_pixelmap *pRender_buffer@<EAX>, br_pixelmap *pDepth_buffer@<EDX>)
 
void DoFog(br_pixelmap* pRender_buffer, br_pixelmap* pDepth_buffer) {
 
    LOG_TRACE("(%p, %p)", pRender_buffer, pDepth_buffer);
 
 
 
    DoDepthByShadeTable(
 
        pRender_buffer,
 
        pDepth_buffer,
 
        gFog_shade_table,
 
        gFog_shade_table_power,
 
        gProgram_state.current_depth_effect.start,
 
        gProgram_state.current_depth_effect.end);
 
}
 
 
 
// IDA: void __usercall DepthEffect(br_pixelmap *pRender_buffer@<EAX>, br_pixelmap *pDepth_buffer@<EDX>, br_actor *pCamera@<EBX>, br_matrix34 *pCamera_to_world@<ECX>)
 
void DepthEffect(br_pixelmap* pRender_buffer, br_pixelmap* pDepth_buffer, br_actor* pCamera, br_matrix34* pCamera_to_world) {
 
    LOG_TRACE("(%p, %p, %p, %p)", pRender_buffer, pDepth_buffer, pCamera, pCamera_to_world);
 
 
 
    if (gProgram_state.current_depth_effect.type == eDepth_effect_darkness) {
 
        DoDepthCue(pRender_buffer, pDepth_buffer);
 
    }
 
    if (gProgram_state.current_depth_effect.type == eDepth_effect_fog) {
 
        DoFog(pRender_buffer, pDepth_buffer);
 
    }
 
}
 
 
 
// IDA: void __usercall DepthEffectSky(br_pixelmap *pRender_buffer@<EAX>, br_pixelmap *pDepth_buffer@<EDX>, br_actor *pCamera@<EBX>, br_matrix34 *pCamera_to_world@<ECX>)
 
void DepthEffectSky(br_pixelmap* pRender_buffer, br_pixelmap* pDepth_buffer, br_actor* pCamera, br_matrix34* pCamera_to_world) {
 
    LOG_TRACE("(%p, %p, %p, %p)", pRender_buffer, pDepth_buffer, pCamera, pCamera_to_world);
 
 
 
    if (gProgram_state.current_depth_effect.sky_texture != NULL
 
        && (gLast_camera_special_volume == NULL || gLast_camera_special_volume->sky_col < 0)) {
 
        DoHorizon(pRender_buffer, pDepth_buffer, pCamera, pCamera_to_world);
 
    }
 
}
 
 
 
// IDA: void __usercall DoWobbleCamera(br_actor *pCamera@<EAX>)
 
void DoWobbleCamera(br_actor* pCamera) {
 
    float f_time;
 
    static br_scalar mag00 = 0.02f;
 
    static br_scalar mag01 = 0.02f;
 
    static br_scalar mag02 = 0.02f;
 
    static br_scalar mag10 = 0.15f;
 
    static br_scalar mag11 = 0.05f;
 
    static br_scalar mag12 = 0.02f;
 
    static br_scalar mag20 = 0.f;
 
    static br_scalar mag21 = 0.f;
 
    static br_scalar mag22 = 0.f;
 
    static float period00 = 3000.f;
 
    static float period01 = 3000.f;
 
    static float period02 = 4000.f;
 
    static float period10 = 2200.f;
 
    static float period11 = 3300.f;
 
    static float period12 = 3100.f;
 
    static float period20 = 2800.f;
 
    static float period21 = 2500.f;
 
    static float period22 = 3900.f;
 
    LOG_TRACE("(%p)", pCamera);
 
 
 
    f_time = (float)PDGetTotalTime();
 
    pCamera->t.t.mat.m[0][0] += FastScalarSin(fmod(f_time / period00 * 360.f, 360.f)) * mag00;
 
    pCamera->t.t.mat.m[0][1] += FastScalarSin(fmod(f_time / period01 * 360.f, 360.f)) * mag01;
 
    pCamera->t.t.mat.m[0][2] += FastScalarSin(fmod(f_time / period02 * 360.f, 360.f)) * mag02;
 
    pCamera->t.t.mat.m[1][0] += FastScalarSin(fmod(f_time / period10 * 360.f, 360.f)) * mag10;
 
    pCamera->t.t.mat.m[1][1] += FastScalarSin(fmod(f_time / period11 * 360.f, 360.f)) * mag11;
 
    pCamera->t.t.mat.m[1][2] += FastScalarSin(fmod(f_time / period12 * 360.f, 360.f)) * mag12;
 
    pCamera->t.t.mat.m[2][0] += FastScalarSin(fmod(f_time / period20 * 360.f, 360.f)) * mag20;
 
    pCamera->t.t.mat.m[2][1] += FastScalarSin(fmod(f_time / period21 * 360.f, 360.f)) * mag21;
 
    pCamera->t.t.mat.m[2][2] += FastScalarSin(fmod(f_time / period22 * 360.f, 360.f)) * mag22;
 
}
 
 
 
// IDA: void __usercall DoDrugWobbleCamera(br_actor *pCamera@<EAX>)
 
void DoDrugWobbleCamera(br_actor* pCamera) {
 
    float f_time;
 
    static br_scalar mag00 = 0.03f;
 
    static br_scalar mag01 = 0.03f;
 
    static br_scalar mag02 = 0.03f;
 
    static br_scalar mag10 = 0.2f;
 
    static br_scalar mag11 = 0.07f; // Pierre-Marie Baty -- missing float suffix
 
    static br_scalar mag12 = 0.03f;
 
    static br_scalar mag20 = 0.02f;
 
    static br_scalar mag21 = 0.03f;
 
    static br_scalar mag22 = 0.01f;
 
    static float period00 = 550.f;
 
    static float period01 = 700.f;
 
    static float period02 = 200.f;
 
    static float period10 = 100.f;
 
    static float period11 = 1300.f;
 
    static float period12 = 500.f;
 
    static float period20 = 800.f;
 
    static float period21 = 1500.f;
 
    static float period22 = 300.f;
 
    LOG_TRACE("(%p)", pCamera);
 
 
 
    f_time = (float)PDGetTotalTime();
 
    pCamera->t.t.mat.m[0][0] += FastScalarSin(fmod(f_time / period00 * 360.f, 360.f)) * mag00;
 
    pCamera->t.t.mat.m[0][1] += FastScalarSin(fmod(f_time / period01 * 360.f, 360.f)) * mag01;
 
    pCamera->t.t.mat.m[0][2] += FastScalarSin(fmod(f_time / period02 * 360.f, 360.f)) * mag02;
 
    pCamera->t.t.mat.m[1][0] += FastScalarSin(fmod(f_time / period10 * 360.f, 360.f)) * mag10;
 
    pCamera->t.t.mat.m[1][1] += FastScalarSin(fmod(f_time / period11 * 360.f, 360.f)) * mag11;
 
    pCamera->t.t.mat.m[1][2] += FastScalarSin(fmod(f_time / period12 * 360.f, 360.f)) * mag12;
 
    pCamera->t.t.mat.m[2][0] += FastScalarSin(fmod(f_time / period20 * 360.f, 360.f)) * mag20;
 
    pCamera->t.t.mat.m[2][1] += FastScalarSin(fmod(f_time / period21 * 360.f, 360.f)) * mag21;
 
    pCamera->t.t.mat.m[2][2] += FastScalarSin(fmod(f_time / period22 * 360.f, 360.f)) * mag22;
 
}
 
 
 
// IDA: void __usercall DoSpecialCameraEffect(br_actor *pCamera@<EAX>, br_matrix34 *pCamera_to_world@<EDX>)
 
void DoSpecialCameraEffect(br_actor* pCamera, br_matrix34* pCamera_to_world) {
 
    LOG_TRACE("(%p, %p)", pCamera, pCamera_to_world);
 
 
 
    if (gOn_drugs) {
 
        DoDrugWobbleCamera(pCamera);
 
    } else {
 
        gLast_camera_special_volume = FindSpecialVolume((br_vector3*)pCamera_to_world->m[3], gLast_camera_special_volume);
 
        if (gLast_camera_special_volume != NULL) {
 
            if (gLast_camera_special_volume->camera_special_effect_index == 0) {
 
                DoWobbleCamera(pCamera);
 
            }
 
        }
 
    }
 
}
 
 
 
// IDA: void __cdecl LessDepthFactor()
 
void LessDepthFactor(void) {
 
    char s[256];
 
    LOG_TRACE("()");
 
 
 
    if (gProgram_state.current_depth_effect.start > 3) {
 
        gProgram_state.current_depth_effect.start--;
 
    }
 
    sprintf(s
, "Depth start reduced to %d", gProgram_state.
current_depth_effect.
start);  
    NewTextHeadupSlot(4, 0, 500, -1, s);
 
    gProgram_state.default_depth_effect.start = gProgram_state.current_depth_effect.start;
 
}
 
 
 
// IDA: void __cdecl MoreDepthFactor()
 
void MoreDepthFactor(void) {
 
    char s[256];
 
    LOG_TRACE("()");
 
 
 
    if (gProgram_state.current_depth_effect.start < 14) {
 
        gProgram_state.current_depth_effect.start++;
 
    }
 
    sprintf(s
, "Depth start increased to %d", gProgram_state.
current_depth_effect.
start);  
    NewTextHeadupSlot(4, 0, 500, -1, s);
 
    gProgram_state.default_depth_effect.start = gProgram_state.current_depth_effect.start;
 
}
 
 
 
// IDA: void __cdecl LessDepthFactor2()
 
void LessDepthFactor2(void) {
 
    char s[256];
 
    LOG_TRACE("()");
 
 
 
    if (gProgram_state.current_depth_effect.end < 14) {
 
        gProgram_state.current_depth_effect.end++;
 
    }
 
    sprintf(s
, "Depth end reduced to %d", gProgram_state.
current_depth_effect.
end);  
    NewTextHeadupSlot(4, 0, 500, -1, s);
 
    gProgram_state.default_depth_effect.end = gProgram_state.current_depth_effect.end;
 
}
 
 
 
// IDA: void __cdecl MoreDepthFactor2()
 
void MoreDepthFactor2(void) {
 
    char s[256];
 
    LOG_TRACE("()");
 
 
 
    if (gProgram_state.current_depth_effect.end > 0) {
 
        gProgram_state.current_depth_effect.end--;
 
    }
 
    sprintf(s
, "Depth end increased to %d", gProgram_state.
current_depth_effect.
end);  
    NewTextHeadupSlot(4, 0, 500, -1, s);
 
    gProgram_state.default_depth_effect.end = gProgram_state.current_depth_effect.end;
 
}
 
 
 
// IDA: void __cdecl AssertYons()
 
void AssertYons(void) {
 
    br_camera* camera_ptr;
 
    int i;
 
    LOG_TRACE("()");
 
 
 
    for (i = 0; i < COUNT_OF(gCamera_list); ++i) {
 
        camera_ptr = gCamera_list[i]->type_data;
 
        camera_ptr->yon_z = gYon_multiplier * gCamera_yon;
 
    }
 
}
 
 
 
// IDA: void __cdecl IncreaseYon()
 
void IncreaseYon(void) {
 
    br_camera* camera_ptr;
 
    int i;
 
    char s[256];
 
    LOG_TRACE("()");
 
 
 
    gCamera_yon = gCamera_yon + 5.f;
 
    AssertYons();
 
    camera_ptr = gCamera_list[1]->type_data;
 
    i = (int)camera_ptr->yon_z;
 
    sprintf(s
, GetMiscString
(kMiscString_YonIncreasedTo_D
), i
);  
    NewTextHeadupSlot(4, 0, 2000, -4, s);
 
}
 
 
 
// IDA: void __cdecl DecreaseYon()
 
void DecreaseYon(void) {
 
    br_camera* camera_ptr;
 
    int i;
 
    char s[256];
 
    LOG_TRACE("()");
 
 
 
    gCamera_yon = gCamera_yon - 5.f;
 
    if (gCamera_yon < 5.f) {
 
        gCamera_yon = 5.f;
 
    }
 
    AssertYons();
 
    camera_ptr = gCamera_list[1]->type_data;
 
    i = (int)camera_ptr->yon_z;
 
    sprintf(s
, GetMiscString
(kMiscString_YonDecreasedTo_D
), i
);  
    NewTextHeadupSlot(4, 0, 2000, -4, s);
 
}
 
 
 
// IDA: void __cdecl SetYon(br_scalar pYon)
 
void SetYon(br_scalar pYon) {
 
    int i;
 
    br_camera* camera_ptr;
 
    LOG_TRACE("(%d)", pYon);
 
 
 
    if (pYon < 5.0f) {
 
        pYon = 5.0f;
 
    }
 
 
 
    for (i = 0; i < COUNT_OF(gCamera_list); i++) {
 
        if (gCamera_list[i]) {
 
            camera_ptr = gCamera_list[i]->type_data;
 
            camera_ptr->yon_z = pYon;
 
        }
 
    }
 
    gCamera_yon = pYon;
 
}
 
 
 
// IDA: br_scalar __cdecl GetYon()
 
br_scalar GetYon(void) {
 
    LOG_TRACE("()");
 
 
 
    return gCamera_yon;
 
}
 
 
 
// IDA: void __cdecl IncreaseAngle()
 
void IncreaseAngle(void) {
 
    br_camera* camera_ptr;
 
    int i;
 
    char s[256];
 
    LOG_TRACE("()");
 
 
 
    for (i = 0; i < COUNT_OF(gCamera_list); i++) {
 
        camera_ptr = gCamera_list[i]->type_data;
 
        camera_ptr->field_of_view += 0x1c7;       // 2.4993896484375 degrees
 
        if (camera_ptr->field_of_view > 0x78e3) { // 169.9969482421875 degrees
 
            camera_ptr->field_of_view = 0x78e3;
 
        }
 
#ifdef DETHRACE_FIX_BUGS
 
        sprintf(s
, "Camera angle increased to %f", (float)BrAngleToDegrees
(camera_ptr
->field_of_view
));  
#else
 
        sprintf(s
, "Camera angle increased to %d", gProgram_state.
current_depth_effect.
end);  
#endif
 
        NewTextHeadupSlot(4, 0, 500, -1, s);
 
    }
 
}
 
 
 
// IDA: void __cdecl DecreaseAngle()
 
void DecreaseAngle(void) {
 
    br_camera* camera_ptr;
 
    int i;
 
    char s[256];
 
    LOG_TRACE("()");
 
 
 
    for (i = 0; i < COUNT_OF(gCamera_list); i++) {
 
        camera_ptr = gCamera_list[i]->type_data;
 
        camera_ptr->field_of_view -= 0x1c7;      // 2.4993896484375 degrees
 
        if (camera_ptr->field_of_view < 0x71c) { // 9.99755859375 degrees
 
            camera_ptr->field_of_view = 0x71c;
 
        }
 
#ifdef DETHRACE_FIX_BUGS
 
        sprintf(s
, "Camera angle decreased to %f", (float)BrAngleToDegrees
(camera_ptr
->field_of_view
));  
#else
 
        sprintf(s
, "Camera angle decreased to %d", gProgram_state.
current_depth_effect.
end);  
#endif
 
        NewTextHeadupSlot(4, 0, 500, -1, s);
 
    }
 
}
 
 
 
// IDA: void __cdecl ToggleDepthMode()
 
void ToggleDepthMode(void) {
 
    LOG_TRACE("()");
 
 
 
    switch (gProgram_state.current_depth_effect.type) {
 
    case eDepth_effect_none:
 
        InstantDepthChange(eDepth_effect_darkness, gProgram_state.current_depth_effect.sky_texture, 8, 0);
 
        NewTextHeadupSlot(4, 0, 500, -1, "Darkness mode");
 
        break;
 
    case eDepth_effect_darkness:
 
        InstantDepthChange(eDepth_effect_none, gProgram_state.current_depth_effect.sky_texture, 0, 0);
 
        InstantDepthChange(eDepth_effect_fog, gProgram_state.current_depth_effect.sky_texture, 10, 0);
 
        NewTextHeadupSlot(4, 0, 500, -1, "Fog mode");
 
        break;
 
    case eDepth_effect_fog:
 
        InstantDepthChange(eDepth_effect_none, gProgram_state.current_depth_effect.sky_texture, 0, 0);
 
        NewTextHeadupSlot(4, 0, 500, -1, "Depth effects disabled");
 
        break;
 
    }
 
    gProgram_state.default_depth_effect.type = gProgram_state.current_depth_effect.type;
 
}
 
 
 
// IDA: int __cdecl GetSkyTextureOn()
 
int GetSkyTextureOn(void) {
 
    LOG_TRACE("()");
 
 
 
    return gSky_on;
 
}
 
 
 
// IDA: void __usercall SetSkyTextureOn(int pOn@<EAX>)
 
void SetSkyTextureOn(int pOn) {
 
    br_pixelmap* tmp;
 
    LOG_TRACE("(%d)", pOn);
 
 
 
    if (pOn != gSky_on) {
 
        tmp = gProgram_state.current_depth_effect.sky_texture;
 
        gProgram_state.current_depth_effect.sky_texture = gSwap_sky_texture;
 
        gProgram_state.default_depth_effect.sky_texture = gSwap_sky_texture;
 
        gSwap_sky_texture = tmp;
 
 
 
        if (gHorizon_material) {
 
            if (gSwap_sky_texture) {
 
                gHorizon_material->colour_map = gSwap_sky_texture;
 
                BrMaterialUpdate(gHorizon_material, -1);
 
            }
 
        }
 
    }
 
    gSky_on = pOn;
 
}
 
 
 
// IDA: void __cdecl ToggleSkyQuietly()
 
void ToggleSkyQuietly(void) {
 
    br_pixelmap* temp;
 
    LOG_TRACE("()");
 
 
 
    temp = gProgram_state.current_depth_effect.sky_texture;
 
    gProgram_state.current_depth_effect.sky_texture = gSwap_sky_texture;
 
    gSwap_sky_texture = temp;
 
    gProgram_state.default_depth_effect.sky_texture = gProgram_state.current_depth_effect.sky_texture;
 
    if (gHorizon_material) {
 
        if (gProgram_state.current_depth_effect.sky_texture) {
 
            gHorizon_material->colour_map = gProgram_state.current_depth_effect.sky_texture;
 
            BrMaterialUpdate(gHorizon_material, 0x7FFFu);
 
        }
 
    }
 
}
 
 
 
// IDA: void __cdecl ToggleSky()
 
void ToggleSky(void) {
 
    LOG_TRACE("()");
 
    NOT_IMPLEMENTED();
 
}
 
 
 
// IDA: int __cdecl GetDepthCueingOn()
 
int GetDepthCueingOn(void) {
 
    LOG_TRACE("()");
 
    return gDepth_cueing_on;
 
}
 
 
 
// IDA: void __usercall SetDepthCueingOn(int pOn@<EAX>)
 
void SetDepthCueingOn(int pOn) {
 
    LOG_TRACE("(%d)", pOn);
 
    if (pOn != gDepth_cueing_on && gHorizon_material) {
 
        InstantDepthChange(gSwap_depth_effect_type, gProgram_state.current_depth_effect.sky_texture, gSwap_depth_effect_start, gSwap_depth_effect_end);
 
        gSwap_depth_effect_type = gProgram_state.current_depth_effect.type;
 
        gSwap_depth_effect_start = gProgram_state.current_depth_effect.start;
 
        gSwap_depth_effect_end = gProgram_state.current_depth_effect.end;
 
    }
 
    gDepth_cueing_on = pOn;
 
}
 
 
 
// IDA: void __cdecl ToggleDepthCueingQuietly()
 
void ToggleDepthCueingQuietly(void) {
 
    tDepth_effect_type temp_type;
 
    int temp_start;
 
    int temp_end;
 
    LOG_TRACE("()");
 
 
 
    temp_type = gProgram_state.current_depth_effect.type;
 
    temp_start = gProgram_state.current_depth_effect.start;
 
    temp_end = gProgram_state.current_depth_effect.end;
 
    InstantDepthChange(
 
        gSwap_depth_effect_type,
 
        gProgram_state.current_depth_effect.sky_texture,
 
        gSwap_depth_effect_start,
 
        gSwap_depth_effect_end);
 
    gSwap_depth_effect_type = temp_type;
 
    gSwap_depth_effect_start = temp_start;
 
    gSwap_depth_effect_end = temp_end;
 
}
 
 
 
// IDA: void __cdecl ToggleDepthCueing()
 
void ToggleDepthCueing(void) {
 
    LOG_TRACE("()");
 
    NOT_IMPLEMENTED();
 
}
 
 
 
// IDA: void __cdecl ChangeDepthEffect()
 
void ChangeDepthEffect(void) {
 
    //br_scalar x1; // Pierre-Marie Baty -- unused variable
 
    //br_scalar x2; // Pierre-Marie Baty -- unused variable
 
    //br_scalar y1; // Pierre-Marie Baty -- unused variable
 
    //br_scalar y2; // Pierre-Marie Baty -- unused variable
 
    //br_scalar z1; // Pierre-Marie Baty -- unused variable
 
    //br_scalar z2; // Pierre-Marie Baty -- unused variable
 
    //br_scalar distance; // Pierre-Marie Baty -- unused variable
 
    //tSpecial_volume* special_volume; // Pierre-Marie Baty -- unused variable
 
    LOG_TRACE("()");
 
    STUB_ONCE();
 
}
 
 
 
// IDA: void __cdecl MungeForwardSky()
 
void MungeForwardSky(void) {
 
    LOG_TRACE("()");
 
}
 
 
 
// IDA: void __cdecl MungeRearviewSky()
 
void MungeRearviewSky(void) {
 
    LOG_TRACE("()");
 
 
 
    if (gSky_image_width != 0) {
 
        MungeSkyModel(gRearview_camera, gRearview_sky_model);
 
    }
 
}