result CMuli3DPresentTargetLinuxX11::Present( const float32 *i_pSource, uint32 i_iFloats ) { m3ddeviceparameters DeviceParameters = m_pParent->GetDeviceParameters(); // Copy pixels to the ximage-buffer --------------------------------------- fpuTruncate(); if( m_iPixelBytes == 2 ) { // 16-bit uint16 *pDestination = (uint16 *)m_pXImage->data; uint32 iPixels = DeviceParameters.iBackbufferWidth * DeviceParameters.iBackbufferHeight; while( iPixels-- ) { const int32 iR = iClamp( ftol( i_pSource[0] * m_i16bitMaxVal[0] ), 0, m_i16bitMaxVal[0] ); const int32 iG = iClamp( ftol( i_pSource[1] * m_i16bitMaxVal[1] ), 0, m_i16bitMaxVal[1] ); const int32 iB = iClamp( ftol( i_pSource[2] * m_i16bitMaxVal[2] ), 0, m_i16bitMaxVal[2] ); i_pSource += i_iFloats; *pDestination++ = ( iR << m_i16bitShift[0] ) | ( iG << m_i16bitShift[1] ) | ( iB << m_i16bitShift[2] ); } } else { // 24- or 32-bit uint8 *pDestination = (uint8 *)m_pXImage->data; uint32 iPixels = DeviceParameters.iBackbufferWidth * DeviceParameters.iBackbufferHeight; while( iPixels-- ) { pDestination[0] = iClamp( ftol( i_pSource[2] * 255.0f ), 0, 255 ); // b pDestination[1] = iClamp( ftol( i_pSource[1] * 255.0f ), 0, 255 ); // g pDestination[2] = iClamp( ftol( i_pSource[0] * 255.0f ), 0, 255 ); // r i_pSource += i_iFloats; pDestination += m_iPixelBytes; } } fpuReset(); // Present to window/screen XPutImage( m_pDisplay, DeviceParameters.hDeviceWindow, m_WindowGC, m_pXImage, 0, 0, 0, 0, DeviceParameters.iBackbufferWidth, DeviceParameters.iBackbufferHeight ); return s_ok; }
long cast_ray(MapData * map, float x0, float y0, float z0, float x1, float y1, float z1, float length, long* x, long* y, long* z) { x1 = x0 + x1 * length; y1 = y0 + y1 * length; z1 = z0 + z1 * length; Vector f, g; LongVector a, c, d, p, i; long cnt = 0; ftol(x0-.5f,&a.x); ftol(y0-.5f,&a.y); ftol(z0-.5f,&a.z); ftol(x1-.5f,&c.x); ftol(y1-.5f,&c.y); ftol(z1-.5f,&c.z); if (c.x < a.x) { d.x = -1; f.x = x0-a.x; g.x = (x0-x1)*1024; cnt += a.x-c.x; } else if (c.x != a.x) { d.x = 1; f.x = a.x+1-x0; g.x = (x1-x0)*1024; cnt += c.x-a.x; } else f.x = g.x = 0; if (c.y < a.y) { d.y = -1; f.y = y0-a.y; g.y = (y0-y1)*1024; cnt += a.y-c.y; } else if (c.y != a.y) { d.y = 1; f.y = a.y+1-y0; g.y = (y1-y0)*1024; cnt += c.y-a.y; } else f.y = g.y = 0; if (c.z < a.z) { d.z = -1; f.z = z0-a.z; g.z = (z0-z1)*1024; cnt += a.z-c.z; } else if (c.z != a.z) { d.z = 1; f.z = a.z+1-z0; g.z = (z1-z0)*1024; cnt += c.z-a.z; } else f.z = g.z = 0; ftol(f.x*g.z - f.z*g.x,&p.x); ftol(g.x,&i.x); ftol(f.y*g.z - f.z*g.y,&p.y); ftol(g.y,&i.y); ftol(f.y*g.x - f.x*g.y,&p.z); ftol(g.z,&i.z); if (cnt > length) cnt = (long)length; while (cnt) { if (((p.x|p.y) >= 0) && (a.z != c.z)) { a.z += d.z; p.x -= i.x; p.y -= i.y; } else if ((p.z >= 0) && (a.x != c.x)) { a.x += d.x; p.x += i.z; p.z -= i.y; } else { a.y += d.y; p.y += i.z; p.z += i.x; } if (isvoxelsolidwrap(a.x, a.y,a.z)) { *x = a.x; *y = a.y; *z = a.z; return 1; } cnt--; } return 0; }
long can_see(MapData * map, float x0, float y0, float z0, float x1, float y1, float z1) { Vector f, g; LongVector a, c, d, p, i; long cnt = 0; ftol(x0-.5f,&a.x); ftol(y0-.5f,&a.y); ftol(z0-.5f,&a.z); ftol(x1-.5f,&c.x); ftol(y1-.5f,&c.y); ftol(z1-.5f,&c.z); if (c.x < a.x) { d.x = -1; f.x = x0-a.x; g.x = (x0-x1)*1024; cnt += a.x-c.x; } else if (c.x != a.x) { d.x = 1; f.x = a.x+1-x0; g.x = (x1-x0)*1024; cnt += c.x-a.x; } else f.x = g.x = 0; if (c.y < a.y) { d.y = -1; f.y = y0-a.y; g.y = (y0-y1)*1024; cnt += a.y-c.y; } else if (c.y != a.y) { d.y = 1; f.y = a.y+1-y0; g.y = (y1-y0)*1024; cnt += c.y-a.y; } else f.y = g.y = 0; if (c.z < a.z) { d.z = -1; f.z = z0-a.z; g.z = (z0-z1)*1024; cnt += a.z-c.z; } else if (c.z != a.z) { d.z = 1; f.z = a.z+1-z0; g.z = (z1-z0)*1024; cnt += c.z-a.z; } else f.z = g.z = 0; ftol(f.x*g.z - f.z*g.x,&p.x); ftol(g.x,&i.x); ftol(f.y*g.z - f.z*g.y,&p.y); ftol(g.y,&i.y); ftol(f.y*g.x - f.x*g.y,&p.z); ftol(g.z,&i.z); if (cnt > 32) cnt = 32; while (cnt) { if (((p.x|p.y) >= 0) && (a.z != c.z)) { a.z += d.z; p.x -= i.x; p.y -= i.y; } else if ((p.z >= 0) && (a.x != c.x)) { a.x += d.x; p.x += i.z; p.z -= i.y; } else { a.y += d.y; p.y += i.z; p.z += i.x; } if (isvoxelsolidwrap(a.x, a.y, a.z)) return 0; cnt--; } return 1; }
result CMuli3DPresentTargetAmigaOS4::Present( const float32 *i_pSource, uint32 i_iFloats ) { m3ddeviceparameters DeviceParameters = m_pParent->GetDeviceParameters(); // Copy pixels to the image-buffer --------------------------------------- // Doesn't currently do anything... fpuTruncate(); // Picasso96 RenderInfo for locking the bitmap struct RenderInfo ri; // Lock bitmap for drawing ULONG lock = IP96->p96LockBitMap( m_pBitMap, (UBYTE*)&ri, sizeof(struct RenderInfo) ); if ( lock ) { // Pointer to allocated buffer uint8 *pDestination = (uint8 *)ri.Memory; // Help pointer to a row in bitmap uint8 *_pDestination; for ( uint32 y = 0; y < DeviceParameters.iBackbufferHeight; y++ ) { // Next row _pDestination = pDestination + y * ri.BytesPerRow; for ( uint32 x = 0; x < DeviceParameters.iBackbufferWidth; x++ ) { //*_pDestination++ = iClamp( (int32)( *i_pSource++ * 255.0f ), 0, 255 ); // r //*_pDestination++ = iClamp( (int32)( *i_pSource++ * 255.0f ), 0, 255 ); // g //*_pDestination++ = iClamp( (int32)( *i_pSource++ * 255.0f ), 0, 255 ); // b // Set r, g and b bytes in our buffer _pDestination[0] = iClamp( ftol( i_pSource[0] * 255.0f ), 0, 255 ); // r _pDestination[1] = iClamp( ftol( i_pSource[1] * 255.0f ), 0, 255 ); // g _pDestination[2] = iClamp( ftol( i_pSource[2] * 255.0f ), 0, 255 ); // b //*_pDestination++ = (iClamp( ftol( i_pSource[0] * 255.0f ), 0, 255 ) << 16) | // (iClamp( ftol( i_pSource[1] * 255.0f ), 0, 255 ) << 8) | // iClamp( ftol( i_pSource[2] * 255.0f ), 0, 255 ); i_pSource += i_iFloats; _pDestination += 3; } } IP96->p96UnlockBitMap( m_pBitMap, lock ); // Blit bitmap to window IGraphics->BltBitMapRastPort( m_pBitMap, 0, 0, DeviceParameters.hDeviceWindow->RPort, DeviceParameters.hDeviceWindow->BorderLeft, DeviceParameters.hDeviceWindow->BorderTop, DeviceParameters.iBackbufferWidth, DeviceParameters.iBackbufferHeight, 0xC0); IGraphics->WaitTOF(); } // lock // Doesn't currently do anything... fpuReset(); return s_ok; }
result CMuli3DPresentTargetWin32::Present( const float32 *i_pSource, uint32 i_iFloats ) { m3ddeviceparameters DeviceParameters = m_pParent->GetDeviceParameters(); // Check for lost DirectDraw surfaces ------------------------------------- if( m_bDDSurfaceLost ) { m_pDirectDrawSurfaces[0]->Restore(); if( DeviceParameters.bWindowed ) m_pDirectDrawSurfaces[1]->Restore(); m_bDDSurfaceLost = false; } // Lock backbuffer-surface------------------------------------------------- DDSURFACEDESC2 descSurface; descSurface.dwSize = sizeof( DDSURFACEDESC2 ); if( FAILED( m_pDirectDrawSurfaces[1]->Lock( 0, &descSurface, DDLOCK_WAIT|DDLOCK_NOSYSLOCK|DDLOCK_WRITEONLY, 0 ) ) ) { FUNC_FAILING( "CMuli3DPresentTargetWin32::Present: couldn't lock secondary surface.\n" ); return e_unknown; } const uint32 iDestBytes = descSurface.ddpfPixelFormat.dwRGBBitCount / 8; // Copy pixels to the backbuffer-surface ---------------------------------- const uint32 iDestRowJump = descSurface.lPitch - iDestBytes * DeviceParameters.iBackbufferWidth; uint8 *pDestination = (uint8 *)descSurface.lpSurface; fpuTruncate(); if( iDestBytes == 2 ) { // 16-bit uint32 iHeight = DeviceParameters.iBackbufferHeight; while( iHeight-- ) { uint32 iWidth = DeviceParameters.iBackbufferWidth; while( iWidth-- ) { const int32 iR = iClamp( ftol( i_pSource[0] * m_i16bitMaxVal[0] ), 0, m_i16bitMaxVal[0] ); const int32 iG = iClamp( ftol( i_pSource[1] * m_i16bitMaxVal[1] ), 0, m_i16bitMaxVal[1] ); const int32 iB = iClamp( ftol( i_pSource[2] * m_i16bitMaxVal[2] ), 0, m_i16bitMaxVal[2] ); i_pSource += i_iFloats; *((uint16 *)pDestination) = ( iR << m_i16bitShift[0] ) | ( iG << m_i16bitShift[1] ) | ( iB << m_i16bitShift[2] ); pDestination += 2; } pDestination += iDestRowJump; } } else { // 24- or 32-bit uint32 iHeight = DeviceParameters.iBackbufferHeight; while( iHeight-- ) { uint32 iWidth = DeviceParameters.iBackbufferWidth; while( iWidth-- ) { pDestination[0] = iClamp( ftol( i_pSource[2] * 255.0f ), 0, 255 ); // b pDestination[1] = iClamp( ftol( i_pSource[1] * 255.0f ), 0, 255 ); // g pDestination[2] = iClamp( ftol( i_pSource[0] * 255.0f ), 0, 255 ); // r i_pSource += i_iFloats; pDestination += iDestBytes; } pDestination += iDestRowJump; } } fpuReset(); // Unlock backbuffer-surface and surface m_pDirectDrawSurfaces[1]->Unlock( 0 ); // Present the image to the screen ---------------------------------------- if( DeviceParameters.bWindowed ) { POINT pntTopLeft = { 0, 0 }; ClientToScreen( DeviceParameters.hDeviceWindow, &pntTopLeft ); RECT rctDestination; GetClientRect( DeviceParameters.hDeviceWindow, &rctDestination ); OffsetRect( &rctDestination, pntTopLeft.x, pntTopLeft.y ); RECT rctSource; SetRect( &rctSource, 0, 0, DeviceParameters.iBackbufferWidth, DeviceParameters.iBackbufferHeight ); // Blt secondary to primary surface if( FAILED( m_pDirectDrawSurfaces[0]->Blt( &rctDestination, m_pDirectDrawSurfaces[1], &rctSource, DDBLT_WAIT, 0 ) ) ) { m_bDDSurfaceLost = true; FUNC_FAILING( "CMuli3DPresentTargetWin32::Present: primary surfaces have been lost!\n" ); return e_unknown; } } else { if( FAILED( m_pDirectDrawSurfaces[0]->Flip( 0, DDFLIP_WAIT ) ) ) { m_bDDSurfaceLost = true; FUNC_FAILING( "CMuli3DPresentTargetWin32::Present: surfaces have been lost!\n" ); return e_unknown; } } return s_ok; }