Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}