REFSKRIPT
GET_N_PARAMS
GET_RESULT np
RETURN_IF_EQUAL np 0 ANIM_FX
GET_PARAM_NR 1
GET_RESULT modus
GET_PARAM_NR 2
GET_RESULT ich

IF_STR_EQUAL_GOTO modus INIT init
IF_STR_EQUAL_GOTO modus INIT_READ init_read
IF_STR_EQUAL_GOTO modus START start
IF_STR_EQUAL_GOTO modus PRE_RENDER prerender
IF_STR_EQUAL_GOTO modus AFTER_RENDER afterrender
IF_STR_EQUAL_GOTO modus FINISH finish
IF_STR_EQUAL_GOTO modus GET_OBJS get_objs
IF_STR_EQUAL_GOTO modus SET_OBJS set_objs
IF_STR_EQUAL_GOTO modus GET_INFO get_info

MELDUNG Falscher Aufruf

RETURN 0
;*****************************************************

>init:
; Ergebnis:
; OK alles geklapp
; ER fehler
; AB abbruch
;
; ich brauche 1 objekt-variable.
; als dummy

; Objekt abfragen 


GET_GEO_OBJ Rad_vorne_links
RETURN_IF_ABBRUCH AB
GET_RESULT rad_vl

GET_GEO_OBJ Rad_vorne_rechts
RETURN_IF_ABBRUCH AB
GET_RESULT rad_vr

GET_GEO_OBJ Rad_hinten_links
RETURN_IF_ABBRUCH AB
GET_RESULT rad_hl

GET_GEO_OBJ Rad_hinten_rechts
RETURN_IF_ABBRUCH AB
GET_RESULT rad_hr

; sich selbst umbenennen in rüttel-<objname>
ADD_STR ich - rad_vl
GET_RESULT ich1
OBJ_SET_NAME ich ich1
GET_RESULT ich

>init_read:
; ich brauche interne-variablen
;  28 reals  um radien und koordinaten und orientierung der räder vom letzten bild zu speichern
; sowie 2*vorletzte pos
; = 4*(rad(1) + koord(3)+orient(3))
; sowie die radiuen in welt-koords
;  4 pointer-obj für 4 räder
; und 1 afx-objekt umd die aktuellen winkel der räder zu speichern.

AFX_ALLOK_INTERN_VARS ich 28 1 5
; objekt 0..3 = räder

AFX_SET_OBJ ich 0 rad_vl
AFX_SET_OBJ ich 1 rad_vr
AFX_SET_OBJ ich 2 rad_hl
AFX_SET_OBJ ich 3 rad_hr
AFX_SET_OBJ ich 4 ----

; heißt faktor und geht von 0 bis 1
AFX_SET_N_OBJ_VARS ich 1
AFX_DEFINE_OBJ_VAR ich 0 0 Blockier 0 1
AFX_SET_INT ich 0 0
RETURN OK
;********************************************************
>start:
; falls integer-var ungleich 0 dann wurde ich von set_objs 
; schon gesetzt
  AFX_GET_INT ich 0 
  GET_RESULT flag
; falls flag=1 müssen wir keins erzeugen, dann wurde es
; schon gelesen
  IF_EQUAL_GOTO flag 1 start1
; ein afx-objekt erzeugen. das die aktuellen winkel der 4
; räder aufnimmt

  ADD_STR ich winkel
  GET_RESULT afx1
  OBJ_NEW afx1 25
  GET_RESULT afx1
  AFX_SET_OBJ ich 4 afx1
  AFX_ALLOK_INTERN_VARS afx1 4 0 0
  GOTO start1a
>start1:
  AFX_GET_OBJ ich 4
  GET_RESULT afx1

>start1a:

;aktuelle position der räder lesen
SET_VAR i 0
>loop1:
  ; jedes rad
  PRINT i
  AFX_GET_OBJ ich i
  GET_RESULT rad
  ; position fragen
  GEO_GET_POS rad 1
  GET_RESULT pos
  COPY_WORD pos 1 
  GET_RESULT x
  COPY_WORD pos 2 
  GET_RESULT y
  COPY_WORD pos 3 
  GET_RESULT z

  GEO_GET_ORIENT rad 
  GET_RESULT or
  COPY_WORD or 1
  GET_RESULT roll
  COPY_WORD or 2
  GET_RESULT steig
  COPY_WORD or 3
  GET_RESULT dreh
  
  IF_EQUAL_GOTO flag 0 start2
; wir nehmen den steig-winkel aus dem afx1  
  AFX_GET_REAL afx1 i
  GET_RESULT steig
>start2:
  
  MUL i 7
  GET_RESULT j

  ; und bei real-variable(j) speichern
  AFX_SET_REAL ich j x
  ADD j 1
  GET_RESULT j
  AFX_SET_REAL ich j y
  ADD j 1
  GET_RESULT j
  AFX_SET_REAL ich j z
  ADD j 1
  GET_RESULT j
  AFX_SET_REAL ich j roll
  ADD j 1
  GET_RESULT j
  AFX_SET_REAL ich j steig
  ADD j 1
  GET_RESULT j
  AFX_SET_REAL ich j dreh
  ADD j 1
  GET_RESULT j
  
  ; radius berechnen = dz/2   
   GEO_GET_BBOX rad
   GET_RESULT box
   COPY_WORD box 3
   GET_RESULT dz
   DIV dz 2
   GET_RESULT radius
; 
   GEO_GET_FATHER rad
   GET_RESULT father
   IF_STR_EQUAL_GOTO father ---- w1
   GEO_PT_TO_WK father 0 0 radius
   GET_RESULT res
   COPY_WORD res 1
   GET_RESULT xx
   COPY_WORD res 2
   GET_RESULT yy
   COPY_WORD res 3
   GET_RESULT zz
   GEO_PT_TO_WK father 0 0 0
   GET_RESULT res
   COPY_WORD res 1
   GET_RESULT x0
   COPY_WORD res 2
   GET_RESULT y0
   COPY_WORD res 3
   GET_RESULT z0
   FUNCTION SQRT(((xx-x0)^2)+((yy-y0)^2)+((zz-z0)^2))
   GET_RESULT radius
>w1:
   AFX_SET_REAL ich j radius
   ADD j 1
   GET_RESULT j
   
  

  ADD i 1
  GET_RESULT i
  IF_LESS_GOTO i 4 loop1

 

RETURN OK


;*******************************************************
>prerender:

; falls faktor!0, dann nichts machen
OBJ_GET_VAR ich 0
GET_RESULT rfaktor
PRINT rfaktor
RETURN_IF_NOT_EQUAL rfaktor 0 OK

; jetzt für alle räder:
; abstand zur pos im letzten bild feststellen
; in winkel entsprechend radius umrechnen
; rad entsprechend drehen

SET_VAR PI 3.14159
AFX_GET_INT ich 0
GET_RESULT flag
AFX_SET_INT ich 0 0
AFX_GET_OBJ ich 4
GET_RESULT afx1

SET_VAR i 0 
>loop2:
  ; jedes rad
  AFX_GET_OBJ ich i
  GET_RESULT rad
  ; position fragen
  GEO_GET_POS rad 1
  GET_RESULT pos
  COPY_WORD pos 1 
  GET_RESULT x
  COPY_WORD pos 2 
  GET_RESULT y
  COPY_WORD pos 3 
  GET_RESULT z
; letzte pos abfragen
  MUL i 7
  GET_RESULT j
  AFX_GET_REAL ich j  
  GET_RESULT x1
  ADD j 1
  GET_RESULT j
  AFX_GET_REAL ich j  
  GET_RESULT y1
  ADD j 1
  GET_RESULT j
  AFX_GET_REAL ich j  
  GET_RESULT z1
  ADD j 1
  GET_RESULT j
  
  AFX_GET_REAL ich j  
  GET_RESULT roll
  ADD j 1
  GET_RESULT j
  AFX_GET_REAL ich j  
  GET_RESULT steig
  ADD j 1
  GET_RESULT j
  AFX_GET_REAL ich j  
  GET_RESULT dreh
  ADD j 1
  GET_RESULT j
  
  AFX_GET_REAL ich j  
  GET_RESULT radius
  
; abstand zu letzter pos berechnen
   FUNCTION SQRT(((x-x1)^2)+((y-y1)^2)+((z-z1)^2))
   GET_RESULT abst
   FUNCTION (abst*360)/(2*PI*radius)
   GET_RESULT winkel 
   PRINT rad radius abst winkel
   ADD steig winkel
   GET_RESULT winkel
   ; falls flag=1 dann wird der winkel nicht verändert
   ; sondern der aus afx genommen 
   IF_EQUAL_GOTO flag 0 pre2
   AFX_GET_REAL afx1 i
   GET_RESULT winkel
>pre2:
   GEO_SET_ORIENT rad roll winkel dreh
 ; jetzt noch pos und neue orientierung speichern
   MUL i 7
   GET_RESULT j
   AFX_SET_REAL ich j x
   ADD j 1
   GET_RESULT j
   AFX_SET_REAL ich j y
   ADD j 1
   GET_RESULT j
   AFX_SET_REAL ich j z
   ADD j 1
   GET_RESULT j
   AFX_SET_REAL ich j roll
   ADD j 1
   GET_RESULT j
   AFX_SET_REAL ich j winkel
   ADD j 1
   GET_RESULT j
   AFX_SET_REAL ich j dreh
  
   AFX_SET_REAL afx1 i winkel

   ADD i 1
   GET_RESULT i
   IF_LESS_GOTO i 4 loop2
RETURN OK
;*********************************************************************
>afterrender:
 
RETURN OK
;*********************************************************

>finish:
; winkel-afx löschen
AFX_GET_OBJ ich 4
GET_RESULT afx1
IF_STR_EQUAL_GOTO afx1 ---- finish1
AFX_SET_OBJ ich 4 ----
OBJ_DEL afx1
>finish1:
RETURN OK
;**********************************************************
>get_objs:
; winkel-afx-objekt
AFX_GET_OBJ ich 4
GET_RESULT afx1
ADD_STR OK afx1
GET_RESULT res

RETURN res
;*********************************************************
>set_objs:
GET_PARAM_NR 3
GET_RESULT afx1
AFX_SET_OBJ ich 4 afx1
AFX_SET_INT ich 0 1

RETURN OK
;*********************************************************
>get_info:
;
GET_PARAM_NR 3
GET_RESULT ask_info

; abfragen, was für information gewünscht ist 
IF_EQUAL_GOTO ask_info 1 create_obj
; kein information, die ich liefern kann, returne  also 0
RETURN OK0
>create_obj: 
; explos braucht ein Objekt, das explosions-partikel-objekt,
; also liefere ich 1
RETURN OK1

;*********************************************************



