/* $Revision Header built automatically *************** (do not edit) ************
**
** © Copyright by Frank Mariak
**
** File             : MyData:SASC-DATA/RealDev/Real3DLibMain.c
** Created on       : Dienstag, 07.02.95 13:24:22
** Created by       : Frank Mariak
** Current revision : V40.1
**
**
** Purpose
** -------
**     Real3D CyBERgraphics display driver
**
** Revision V40.1
** --------------
** created on Samstag, 04.03.95 02:35:06  by  Frank Mariak.   LogMessage :
**   - now supports all v2 library calls
**
** Revision V1.0
** --------------
** created on Dienstag, 07.02.95 13:24:22  by  Frank Mariak.   LogMessage :
**     --- Initial release ---
**
*********************************************************************************/
#define REVISION "40.1"
#define REVDATE  "04.03.95"
#define REVTIME  "02:35:06"
#define AUTHOR   "Frank Mariak"
#define VERNUM   40
#define REVNUM   1

#define PROGNAME    "CyBERgraphics Real3D RenderLibrary"

//
//  includes
//
#define USE_BUILTIN_MATH
#include <string.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <graphics/modeid.h>
#include <intuition/intuitionbase.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>
#include <clib/exec_protos.h>
#include <pragmas/exec_sysbase_pragmas.h>
#include <clib/intuition_protos.h>
#include <pragmas/intuition_pragmas.h>
#include <cybergraphics/cybergraphics.h>
#include <pragmas/cybergraphics_pragmas.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/asl.h>

//
//  global data (read only or write once)
//
struct Library *SysBase;
struct Library *CyberGfxBase;

static const char version[] = "\0$VER: " PROGNAME " " REVISION " (" REVDATE ") © 1995 Vision Factory Development";

APTR __asm __saveds R3DInitDspDrv(void);
void __asm __saveds R3DFreeDspDrv(register __a0 APTR handle);
void __asm __saveds R3DSetMode(register __a0 APTR handle);
void __asm __saveds R3DGetSize(register __a0 APTR handle,register __a1 int *x,register __d0 int *y);
void __asm __saveds R3DWriteLine(register __a0 APTR handle,register __a1 int *buffer,register __a2 int len,register __d0 int x,register __d1 int y);
void __asm __saveds R3DReadLine(register __a0 APTR handle,register __a1 int *buffer,register __a2 int len,register __d0 int x,register __d1 int y);
void __asm __saveds R3DClsScr(register __a0 APTR handle,register __a1 ULONG color);
void __asm __saveds R3DCustomSave(register __a0 APTR handle,register __a1 char *name,register __a2 int x,register __d0 int y,register __d1 int w,register __d2 int h);
int __asm __saveds R3DInitRen(register __a0  struct R3DHandle *handle);
void __asm __saveds R3DEndRen(register __a0  struct R3DHandle *handle);
int __asm __saveds R3DEndRow(register __a0  struct R3DHandle *handle, register __a1 int y);
void __asm __saveds R3DGetAspect(register __a0  struct R3DHandle *handle,register __a1 int *w ,register __d0 int *h);
int __asm __saveds R3DExtF(register __a0  struct R3DHandle *handle);





ULONG	DefDispID	= -1;

struct R3DHandle	{
			 struct Screen *RenderScr;
			 ULONG		Flags;
			};


APTR __asm __saveds R3DInitDspDrv()
{
 struct R3DHandle *R3DH;

 if(R3DH=AllocVec(sizeof(struct R3DHandle),MEMF_CLEAR|MEMF_PUBLIC))
 {
  if(DefDispID!=INVALID_ID)
  {
   ULONG Depth=GetCyberIDAttr(CYBRIDATTR_DEPTH,DefDispID);
   if(R3DH->RenderScr=OpenScreenTags(NULL,		SA_Width,STDSCREENWIDTH,
							SA_Height,STDSCREENHEIGHT,
							SA_DisplayID,DefDispID,
							SA_Title,(UBYTE *)"CyBERgraphics Real3D Render Display",
							SA_Depth,Depth,
							TAG_DONE))
   {
    return((APTR)R3DH);
   }
   else
   {
    FreeVec(R3DH);
    return(0L);
   }
  }
  else
  {
   FreeVec(R3DH);
   return(0L);
  }
 }
}


void __asm __saveds R3DFreeDspDrv(register __a0 struct R3DHandle *handle)
{
 if(handle->RenderScr) CloseScreen(handle->RenderScr);
 FreeVec(handle);
}


void __asm __saveds R3DSetMode(register __a0 struct R3DHandle *handle)
{
 struct ScreenModeRequester	*AslReq;
 if(AslReq=(struct ScreenModeRequester *)AllocAslRequestTags(ASL_ScreenModeRequest,TAG_DONE))
 {
  ULONG retval;
  ScreenToFront(handle->RenderScr);
  if(retval=AslRequestTags(AslReq,	ASLSM_Screen,handle->RenderScr,
					ASLSM_TitleText,(UBYTE *)"Please select Rendermode",
					ASLSM_PositiveText,(UBYTE *)"Use",
					ASLSM_NegativeText,(UBYTE *)"Cancel",
					ASLSM_InitialDisplayID,DefDispID,
					ASLSM_PropertyFlags,0,
					ASLSM_PropertyMask,0,
					ASLSM_MinDepth,15,
					ASLSM_MaxDepth,32,
					TAG_DONE))
  {
   if(AslReq->sm_DisplayID != INVALID_ID)
   {
    ULONG Depth=GetCyberIDAttr(CYBRIDATTR_DEPTH,AslReq->sm_DisplayID);
    DefDispID=AslReq->sm_DisplayID;
    if(handle->RenderScr) CloseScreen(handle->RenderScr);
    handle->RenderScr=OpenScreenTags(NULL,		SA_DisplayID,DefDispID,
							SA_Title,(UBYTE *)"CyBERgraphics Real3D Render Display",
							SA_Depth,Depth,
							TAG_DONE);
   }
   FreeAslRequest(AslReq);
  }
 }
}

void __asm __saveds R3DGetSize(register __a0 struct R3DHandle *handle,register __a1 int *x,register __d0 int *y)
{
 struct Screen *MyScreen;

 MyScreen=handle->RenderScr;
 *x = MyScreen->Width;
 *y = MyScreen->Height-MyScreen->BarHeight-1;

}

void __asm __saveds R3DWriteLine(register __a0 struct R3DHandle *handle,register __a1 int *buffer,register __a2 int len,register __d0 int x,register __d1 int y)
{
 if(handle)
 {
  struct Screen *rscr=handle->RenderScr;
  WritePixelArray(buffer,0,0,len*4,&rscr->RastPort,x,y+rscr->BarHeight+1,len,1,RECTFMT_RGBA);
 }
}

void __asm __saveds R3DReadLine(register __a0 struct R3DHandle *handle,register __a1 int *buffer,register __a2 int len,register __d0 int x,register __d1 int y)
{
 if(handle)
 {
  struct Screen *rscr=handle->RenderScr;
  ReadPixelArray(buffer,0,0,len*4,&rscr->RastPort,x,y+rscr->BarHeight+1,len,1,RECTFMT_RGBA);
 }
}

void __asm __saveds R3DClsScr(register __a0 struct R3DHandle *handle,register __a1 ULONG color)
{

 if (handle->RenderScr)
 {
  struct Screen *rscr=handle->RenderScr;
  EraseRect(&rscr->RastPort,0,rscr->BarHeight+1,rscr->Width,rscr->Height);
 }
}

void __asm __saveds R3DCustomSave(register __a0 APTR handle,register __a1 char *name,register __a2 int x,register __d0 int y,register __d1 int w,register __d2 int h)
{
 return(0L);
}



int __asm __saveds R3DInitRen(register __a0  struct R3DHandle *handle)
{
 if (handle->RenderScr)
 {
  ScreenToFront(handle->RenderScr);
 }
   return(TRUE);
}

void __asm __saveds R3DEndRen(register __a0  struct R3DHandle *handle)
{
 if (handle->RenderScr)
 {
  ScreenToBack(handle->RenderScr);
 }
}

int __asm __saveds R3DEndRow(register __a0  struct R3DHandle *handle, register __a1 int y)
{   return(TRUE);
}

void __asm __saveds R3DGetAspect(
register __a0  struct R3DHandle *handle,
register __a1 int *w ,
register __d0 int *h)
{   *h = *w = 1;
}

int __asm __saveds R3DExtF(register __a0  struct R3DHandle *handle)
{   return(NULL);
}


int __saveds __UserLibInit(void)
{
 SysBase = (*(struct Library **)4);

 if (CyberGfxBase = OpenLibrary("cybergraphics.library", 40))
 {
  if((DefDispID=BestCModeIDTags(	CYBRBIDTG_Depth,16,
					CYBRBIDTG_NominalWidth,640,
					CYBRBIDTG_NominalHeight,480,
					TAG_DONE))!=INVALID_ID)
  {
   return(0);
  }
  CloseLibrary(CyberGfxBase);
  }
 return(1);
}

void __saveds __UserLibCleanup(void)
{
}

