double AirDensity(double altitude) { if (altitude>44330) { altitude=44330; } if (altitude<-200) { // min altitude TESTBENCH_DO_ONLY(10,StartupStore(_T(".... INVALID ALTITUDE in AirDensity: %f%s"),altitude,NEWLINE)); altitude=-200; } double rho = pow((44330.8-altitude)/42266.5,1.0/0.234969); BUGSTOP_LKASSERT(rho>0); if (rho<=0) rho=1; // we always give some pressure for the boys return rho; }
TerrainRenderer(const RECT& rc) : _dirty(true), _ready(), sbuf(), hBuf(), colorBuf() { #if (WINDOWSPC>0) && TESTBENCH StartupStore(_T(".... Init TerrainRenderer area (%ld,%ld) (%ld,%ld)\n"), rc.left, rc.top, rc.right, rc.bottom); #endif static bool error = false; // This will not disable terrain! So we shall get calling here again, but no problem. if (rc.right < 1 || rc.bottom < 1) { if(!error) { // log error only once StartupStore(_T(". CRITICAL PROBLEM, cannot render terrain. rcright=%d rcbottom=%d%s"),rc.right,rc.bottom,NEWLINE); } error = true; LKASSERT(0); // THIS WILL NOT POP UP A DIALOG ERROR! return; } error = false; extern unsigned int TerrainQuantization(); dtquant = TerrainQuantization(); LKASSERT(dtquant>=1); #ifdef USE_TERRAIN_BLUR blursize = max((unsigned int) 0, (dtquant - 1) / 2); // always 0 oversampling = max(1, (blursize + 1) / 2 + 1); // always 1 if (blursize == 0) { oversampling = 1; // no point in oversampling, just let stretchblt do the scaling } #endif /* dtq ovs blur res_x res_y sx sy terrain_loads pixels 1 1 0 320 240 320 240 76800 76800 2 1 0 160 120 160 120 19200 19200 3 2 1 213 160 107 80 8560 34080 4 2 1 160 120 80 60 4800 19200 5 3 2 192 144 64 48 3072 27648 */ const int res_x = iround((rc.right - rc.left) * oversampling / dtquant); const int res_y = iround((rc.bottom - rc.top) * oversampling / dtquant); sbuf = new (std::nothrow) CSTScreenBuffer(res_x, res_y); if(!sbuf) { OutOfMemory(_T(__FILE__), __LINE__); ToggleMultimapTerrain(); return; } ixs = sbuf->GetCorrectedWidth() / oversampling; iys = sbuf->GetHeight() / oversampling; TESTBENCH_DO_ONLY(5,StartupStore(_T("... Terrain quant=%d ixs=%d iys=%d TOTAL=%d\n"),dtquant,ixs,iys,ixs*iys)); hBuf = (unsigned short*) malloc(sizeof (unsigned short)*ixs * iys); if (!hBuf) { StartupStore(_T("------ TerrainRenderer: malloc(%u) failed!%s"), (unsigned)(sizeof(unsigned short)*ixs*iys), NEWLINE); OutOfMemory(_T(__FILE__), __LINE__); // // We *must* disable terrain at this point. // ToggleMultimapTerrain(); return; } #if TESTBENCH else { StartupStore(_T(". TerrainRenderer: malloc(%u) ok"), (unsigned)(sizeof(unsigned short)*ixs*iys)); } #endif colorBuf = (BGRColor*) malloc(256 * 128 * sizeof (BGRColor)); if (colorBuf == NULL) { OutOfMemory(_T(__FILE__), __LINE__); ToggleMultimapTerrain(); return; } // Reset this, so ColorTable will reload colors lastColorRamp = NULL; // this is validating terrain construction _ready = true; }