/*
   Display all available render engines

*/

#include <stdio.h>
#include <stdlib.h>
#include <exec/types.h>
#include <cybergraphx/cgx3drave.h>
#include <proto/cgx3drave.h>
#include <proto/exec.h>

struct Library *CGX3DRAVEBase;

void main()
{
 if(CGX3DRAVEBase = OpenLibrary("cgx3drave.library",0L))
 {
  TQAEngine *engine;

  if(engine=QADeviceGetFirstEngine(NULL))
  {
   ULONG fastf,optf,tsize,ftsize;
   long vendorID,engineID,revision,namelen,numsels;
   unsigned char *namestr=NULL;
   TQAError error;

   do
   {
    error=QAEngineGestalt(engine,kQAGestalt_OptionalFeatures,&optf);

    if(error!=kQANoErr)
    {
     printf(" Unable to request optional engine features\n");
    }

    error=QAEngineGestalt(engine,kQAGestalt_FastFeatures,&fastf);

    if(error!=kQANoErr)
    {
     printf(" Unable to request fast engine features\n");
    }

    error=QAEngineGestalt(engine,kQAGestalt_VendorID,&vendorID);

    if(error!=kQANoErr)
    {
     printf(" Unable to request engine vendor ID\n");
    }

    error=QAEngineGestalt(engine,kQAGestalt_EngineID,&engineID);

    if(error!=kQANoErr)
    {
     printf(" Unable to request engine ID\n");
    }

    error=QAEngineGestalt(engine,kQAGestalt_Revision,&revision);

    if(error!=kQANoErr)
    {
     printf(" Unable to request engine revision\n");
    }

    error=QAEngineGestalt(engine,kQAGestalt_ASCIINameLength,&namelen);

    if(error!=kQANoErr)
    {
     printf(" Unable to request engine ASCII name length\n");
    }

    if(namestr = malloc(namelen + 1))
    {
     error=QAEngineGestalt(engine,kQAGestalt_ASCIIName,namestr);

     if(error!=kQANoErr)
     {
      printf(" Unable to request engine ASCII name\n");
     }
    }

    error=QAEngineGestalt(engine,kQAGestalt_TextureMemory,&tsize);

    if(error!=kQANoErr)
    {
     printf(" Unable to request engine's available texture memory\n");
    }

    error=QAEngineGestalt(engine,kQAGestalt_FastTextureMemory,&ftsize);

    if(error!=kQANoErr)
    {
     printf(" Unable to request engine's available fast texture memory\n");
    }

    error=QAEngineGestalt(engine,kQAGestalt_NumSelectors,&numsels);

    if(error!=kQANoErr)
    {
     printf(" Unable to request engine's selectors currently defined\n");
    }

    printf("AVAILABLE ENGINES:\n");
    printf(" %s Revision %ld\n",namestr ? namestr : (STRPTR)"(unknown name",revision);

    printf("  vendorID %ld  engineID %ld\n",vendorID,engineID);

    if(optf)
    {
     printf("  Optional features: ");
     if(optf & kQAOptional_DeepZ)
      printf("DeepZ,");
     if(optf & kQAOptional_Texture)
      printf("Texture,");
     if(optf & kQAOptional_TextureHQ)
      printf("TextureHQ,");
     if(optf & kQAOptional_TextureColor)
      printf("TextureColor,");
     if(optf & kQAOptional_Blend)
      printf("Blend,");
     if(optf & kQAOptional_BlendAlpha)
      printf("BlendAlpha,");
     if(optf & kQAOptional_Antialias)
      printf("Antialias,");
     if(optf & kQAOptional_ZSorted)
      printf("ZSorted,");
     if(optf & kQAOptional_PerspectiveZ)
      printf("PerspectiveZ,");
     if(optf & kQAOptional_OpenGL)
      printf("OpenGL,");
     if(optf & kQAOptional_NoClear)
      printf("NoClear,");
     if(optf & kQAOptional_CSG)
      printf("CSG,");
     if(optf & kQAOptional_BoundToDevice)
      printf("BoundToDevice,");
     if(optf & kQAOptional_CL4)
      printf("CL4,");
     if(optf & kQAOptional_CL8)
      printf("CL8,");
     if(optf & kQAOptional_BufferComposite)
      printf("BufferComposite,");
     printf("%c \n",8);
    }
    else
    {
     printf("  no optional features\n");
    }

    if(fastf)
    {
     printf("  Fast features: ");
     if(fastf & kQAFast_Line)
      printf("Line,");
     if(fastf & kQAFast_Gouraud)
      printf("Gouraud,");
     if(fastf & kQAFast_Texture)
      printf("Texture,");
     if(fastf & kQAFast_TextureHQ)
      printf("TextureHQ,");
     if(fastf & kQAFast_Blend)
      printf("Blend,");
     if(fastf & kQAFast_Antialiasing)
      printf("Antialiasing,");
     if(fastf & kQAFast_ZSorted)
      printf("ZSorted,");
     if(fastf & kQAFast_CL4)
      printf("CL4,");
     if(fastf & kQAFast_CL8)
      printf("CL8,");
     printf("%c \n",8);
    }
    else
    {
     printf("  no fast features\n");
    }

    printf("  Available texture memory %ld\n",tsize);
    printf("  Available fast texture memory %ld\n",ftsize);

    printf("\n");

    if(namestr) free(namestr);
    namestr=NULL;
   }
   while(engine=QADeviceGetNextEngine(NULL,engine));

  }
  else
  {
   printf("No rendering engine(s) available\n");
  }
  CloseLibrary(CGX3DRAVEBase);
 }
 else
 {
  printf("Unable to open cgx3drave.library\n");
 }
}
