'===========================================================================
' Subject: 3D STUDIO .ASC MESH LOADER 1.01    Date: 06-22-99 (00:02)       
'  Author: Daniel Davies                      Code: QB, QBasic, PDS        
'  Origin: ia53@rapid.co.uk                 Packet: MISC.ABC
'===========================================================================
'3D STUDIO .ASC MESH LOADER V1.01
'Copyright (C) UK 1999 DANIEL DAVIES
'HTTP://WWW.USERS.RAPID.NET.UK/IA53
'MAILTO://ARCLIGHT@PAGANS.ORG
'
'THIS PROGRAM ONLY WORKS ON 3D STUDIO .ASC MESH FILES
'
'TO LOAD A MESH FILE FIRST RUN MeshLoaderInit AND PASS THE NAME OF THE
'FILE CONTAINING THE MESH YOU WISH TO LOAD
'THEN USE :-
'DIM SHARED VERTICES(ObjectVertices) AS vertex
'DIM SHARED polys(ObjectFaces) AS polygon
'TO INITIALISE THE ARRAYS IT WILL STORE THE OBJECT IN
'THEN CALL LoadMesh AND PASS THE NAME OF THE FILE YOU WISH TO LOAD
'
'IF YOU USE ANY OF THIS IN YOUR OWN NON COMMERCIAL PROGRAMS YOU MUST GIVE ME CREDIT
'IF YOU USE ANY OF IT IN A COMMERCIAL PROGRAM YOU MUST CONTACT ME, FOR LICENSING
'INFORMATION


TYPE vertex
  X AS DOUBLE
  Y AS DOUBLE
  Z AS DOUBLE
END TYPE
TYPE polygon
  p1 AS INTEGER
  p2 AS INTEGER
  p3 AS INTEGER
END TYPE

COMMON SHARED VERTICES()  AS vertex
COMMON SHARED polys() AS polygon
COMMON SHARED ObjectVertices AS LONG
COMMON SHARED ObjectFaces AS LONG
DECLARE SUB MeshLoaderInit (Filename AS STRING)
DECLARE SUB LoadMesh (Filename AS STRING)
DECLARE SUB GetChar (what AS STRING)
DECLARE SUB GetVertex (n AS LONG)
DECLARE SUB GetFace (n AS LONG)
DECLARE FUNCTION GetNr& ()
DECLARE FUNCTION GetReal# ()
DECLARE FUNCTION GetMaxVertex& ()
DECLARE FUNCTION GetMaxFace& ()

'3D STUDIO .ASC MESH LOADER
'Copyright (C) UK 1999 DANIEL DAVIES
'HTTP://WWW.USERS.RAPID.NET.UK/IA53
'MAILTO://ARCLIGHT@PAGANS.ORG
SUB GetChar (what AS STRING)
c$ = STRING$(1, " ")
DO
GET #1, , c$
LOOP UNTIL c$ = what
END SUB

'3D STUDIO .ASC MESH LOADER
'Copyright (C) UK 1999 DANIEL DAVIES
'HTTP://WWW.USERS.RAPID.NET.UK/IA53
'MAILTO://ARCLIGHT@PAGANS.ORG
SUB GetFace (n AS LONG)
nr$ = STR$(n)
c$ = STRING$(1, " ")

GET #1, , c$
IF c$ = "F" THEN
 GET #1, , c$
 IF c$ = "a" THEN
  GET #1, , c$
  IF c$ = "c" THEN
   GET #1, , c$
   IF c$ = "e" THEN
    GET #1, , c$
    IF c$ = " " THEN
     GET #1, , ch$
     FOR k = 1 TO LEN(nr$)
      IF ch$ = MID$(nr$, k, 1) THEN
       GET #1, , ch$
      ELSE
       ch$ = "0"
      END IF
     NEXT
     IF ch$ = ":" THEN
      GET #1, , c$
      IF c$ = " " THEN
       GET #1, , c$
       IF c$ = " " THEN
        GET #1, , c$
        IF c$ = " " THEN
         GET #1, , c$
         IF c$ = " " THEN
          GET #1, , c$
          IF c$ = " " THEN
           GET #1, , c$
           IF c$ = "A" THEN
            GET #1, , c$
            IF c$ = ":" THEN
             polystmp = GetNr
             polys(n).p1 = polystmp
            
             GetChar "B"
             GET #1, , ch$
             polystmp = GetNr
             polys(n).p2 = polystmp
            
             GetChar "C"
             GET #1, , ch$
             polystmp = GetNr
             polys(n).p3 = polystmp
            END IF
           END IF
          END IF
         END IF
        END IF
       END IF
      END IF
     END IF
    END IF
   END IF
  END IF
 END IF
END IF
END SUB

'3D STUDIO .ASC MESH LOADER
'Copyright (C) UK 1999 DANIEL DAVIES
'HTTP://WWW.USERS.RAPID.NET.UK/IA53
'MAILTO://ARCLIGHT@PAGANS.ORG
FUNCTION GetMaxFace&
c$ = STRING$(1, " ")

GET #1, , c$
IF c$ = "F" THEN
 GET #1, , c$
 IF c$ = "a" THEN
  GET #1, , c$
  IF c$ = "c" THEN
   GET #1, , c$
   IF c$ = "e" THEN
    GET #1, , c$
    IF c$ = "s" THEN
     GET #1, , c$
     IF c$ = ":" THEN
      GET #1, , c$
      IF c$ = " " THEN
       MaxFaceS$ = ""
       GET #1, , c$
       WHILE c$ <> " "
        MaxFaceS$ = MaxFaceS$ + c$
        GET #1, , c$
       WEND
       GetMaxFace = VAL(MaxFaceS$) - 1
      END IF
     END IF
    END IF
   END IF
  END IF
 END IF
END IF
END FUNCTION

'3D STUDIO .ASC MESH LOADER
'Copyright (C) UK 1999 DANIEL DAVIES
'HTTP://WWW.USERS.RAPID.NET.UK/IA53
'MAILTO://ARCLIGHT@PAGANS.ORG
FUNCTION GetMaxVertex&
c$ = STRING$(1, " ")

GET #1, , c$
IF c$ = "V" THEN
 GET #1, , c$
 IF c$ = "e" THEN
  GET #1, , c$
  IF c$ = "r" THEN
   GET #1, , c$
   IF c$ = "t" THEN
    GET #1, , c$
    IF c$ = "i" THEN
     GET #1, , c$
     IF c$ = "c" THEN
      GET #1, , c$
      IF c$ = "e" THEN
       GET #1, , c$
       IF c$ = "s" THEN
        GET #1, , c$
        IF c$ = ":" THEN
         GET #1, , c$
         IF c$ = " " THEN
         MaxVertexS$ = ""
         GET #1, , c$
         WHILE c$ <> " "
          MaxVertexS$ = MaxVertexS$ + c$
          GET #1, , c$
         WEND
         GetMaxVertex = VAL(MaxVertexS$) - 1
        END IF
       END IF
      END IF
     END IF
    END IF
   END IF
  END IF
 END IF
END IF
END IF
END FUNCTION

'3D STUDIO .ASC MESH LOADER
'Copyright (C) UK 1999 DANIEL DAVIES
'HTTP://WWW.USERS.RAPID.NET.UK/IA53
'MAILTO://ARCLIGHT@PAGANS.ORG
FUNCTION GetNr&
nr$ = ""
c$ = STRING$(1, " ")
GET #1, , c$
WHILE ch$ <> " " AND ch$ <> "." AND ch$ <> CHR$(13)
  nr$ = nr$ + ch$
  GET #1, , ch$
WEND
GetNr = VAL(nr$)
END FUNCTION

'3D STUDIO .ASC MESH LOADER
'Copyright (C) UK 1999 DANIEL DAVIES
'HTTP://WWW.USERS.RAPID.NET.UK/IA53
'MAILTO://ARCLIGHT@PAGANS.ORG
FUNCTION GetReal#
nr$ = ""
c$ = STRING$(1, " ")
GET #1, , c$
WHILE ch$ <> " " AND ch$ <> CHR$(13)
  nr$ = nr$ + ch$
  GET #1, , ch$
WEND
GetReal = VAL(nr$)
END FUNCTION

'3D STUDIO .ASC MESH LOADER
'Copyright (C) UK 1999 DANIEL DAVIES
'HTTP://WWW.USERS.RAPID.NET.UK/IA53
'MAILTO://ARCLIGHT@PAGANS.ORG
SUB GetVertex (n AS LONG)
nr$ = STR$(n)
c$ = STRING$(1, " ")

GET #1, , c$
IF c$ = "V" THEN
 GET #1, , c$
 IF c$ = "e" THEN
  GET #1, , c$
  IF c$ = "r" THEN
   GET #1, , c$
   IF c$ = "t" THEN
    GET #1, , c$
    IF c$ = "e" THEN
     GET #1, , c$
     IF c$ = "x" THEN
      GET #1, , c$
      IF c$ = " " THEN
       GET #1, , ch$
       FOR k = 1 TO LEN(nr)
        IF ch$ = MID$(nr$, k, 1) THEN
         GET #1, , ch$
        ELSE
         ch$ = "0"
        END IF
       NEXT
       IF ch$ = ":" THEN
        GET #1, , ch$
        IF ch$ = " " THEN
         GET #1, , ch$
         IF ch$ = " " THEN
          GET #1, , ch$
          IF ch$ = "X" THEN
           GET #1, , ch$
           IF ch$ = ":" THEN
            GET #1, , ch$
            IF ch$ = " " THEN
             VERTICES(n).X = GetReal
             GET #1, , ch$
             GET #1, , ch$
             VERTICES(n).Y = GetReal
             GET #1, , ch$
             GET #1, , ch$
             VERTICES(n).Z = GetReal
            END IF
           END IF
          END IF
         END IF
        END IF
       END IF
      END IF
     END IF
    END IF
   END IF
  END IF
 END IF
END IF

END SUB

'3D STUDIO .ASC MESH LOADER
'Copyright (C) UK 1999 DANIEL DAVIES
'HTTP://WWW.USERS.RAPID.NET.UK/IA53
'MAILTO://ARCLIGHT@PAGANS.ORG
SUB LoadMesh (Filename AS STRING)
c$ = STRING$(1, " ")
OPEN Filename FOR BINARY AS #1
ObjectVertices = GetMaxVertex

SEEK #1, 1
ObjectFaces = GetMaxFace

SEEK #1, 1
FOR a% = 0 TO ObjectVertices
 GetVertex (a%)
NEXT a%
FOR a% = 0 TO ObjectFaces
 GetFace (a%)
NEXT a%

END SUB

'3D STUDIO .ASC MESH LOADER
'Copyright (C) UK 1999 DANIEL DAVIES
'HTTP://WWW.USERS.RAPID.NET.UK/IA53
'MAILTO://ARCLIGHT@PAGANS.ORG
SUB MeshLoaderInit (Filename AS STRING)
OPEN Filename FOR BINARY AS #1
ObjectVertices = GetMaxVertex

SEEK #1, 1
ObjectFaces = GetMaxFace

END SUB
