' ****************************************************************************** ' **** EB MODELEUR Universel Version 3.61f **** ' **** Modeleur sp‚cialis‚ pour P.O.V.III **** ' **** Version totale STf/STe/TT/FALCON **** ' **** MEDUSA/HADES/MILAN/PHOENIX...etc... **** ' **** Routines ASM 68030 de Lo‹c SEBALD **** ' **** par XtendTOS **** ' **** ic“nes monochromes ou couleurs... **** ' **** Suite de EB_EDPOV V.2.23a **** ' **** et EB_MODEL V.2.90a **** ' **** (C) BARANGER Emmanuel GFA 3.5EF **** ' **** 31, rue de la porte Morard **** ' **** 28000 Chartres **** ' **** France T‚l‚phone : 06 16 67 89 04 03/01/2005 **** ' **** 02 37 35 67 02 13/01/2005 **** ' **** e-mail : helijah@free.fr 05/06/2005 **** ' **** WEB : helijah.free.fr ou ebmodel3.atari.org 12-19-27/11/2005 **** ' **** 30-31/12/2005 **** ' **** 04-08-10/01/2006 **** ' **** 05-18-20/02/2006 **** ' ****************************************************************************** $m64000 ! Pour le compilateur compile!=BYTE{ADD(BASEPAGE,256)}<>96 ! L'‚x‚cution est elle en compil‚ IF NOT compile! ! Si ce n'est pas le cas RESERVE 64000 ! On r‚serve un peu de m‚moire ENDIF ! Sinon, on continue ap_id&=@appl_init ! Recuperer l'AP_ID de l'application IF ap_id&=-1 ! AP_ID incorrecte...D‚sol‚, mais n%=@prendre(512,FALSE,3) ! il faut pr‚venir que le lancement CHAR{n%}="[1][" ! du programme est annul‚ CHAR{n%}=CHAR{n%}+" Mauvais ID d'application,|" CHAR{n%}=CHAR{n%}+" Programme arrˆt‚ ! |" CHAR{n%}=CHAR{n%}+" Bad application ID, |" CHAR{n%}=CHAR{n%}+" Programm stopped ! |" CHAR{n%}=CHAR{n%}+"][ D‚sol‚ | Sorry ]"+CHR$(0) ~@afficher_alerte(n%) libere(*n%) appl_exit ! on le dit au GEM END ! et on sort de l…. ...snif ENDIF definir_variables ! les constantes du programme open_virtuel_screen_workstation(2) ! Ouvrir une station de travail etude_du_systeme ! Mais quelle machine est ce donc ? extended_inquire_function ! On r‚cupŠre toutes les donn‚es ON ERROR GOSUB gestion_des_erreurs ! Pour les erreurs. Si, si, il y en a ! IF @initialisation ! Initialisation complŠte du programme retour_des_erreurs: ! En cas d'erreur c'est la le retour boucle_principale ! Boucle presque sans fin ENDIF ! liberation_memoire ! On rend la m‚moire au GEM close_virtual_screen_workstation(vdihandle%) ! On ferme la sation de travail appl_exit ! et on le dit au GEM END ! L…, c'est la fin...snif...snif ' ! > PROCEDURE boucle_principale ! La, on boucle et on attend LOCAL event& ! Type d'‚v‚nement, index de boucle ' souris|=11 asouris|=100 DO ! BOUCLE PRINCIPALE DU PROGRAMME ' Appel fonction xform_do() qui gŠre le bureau event&=@xform_do(&X110011,adr_desk%,255) ' whandle&=@wind_find(global_mx&,global_my&) IF BTST(event&,4) ! EVENEMENT DE MESSAGE evenements_message CLR event& ENDIF IF BTST(event&,0) ! EVENEMENT CLAVIER evenements_clavier CLR event& ENDIF IF BTST(event&,1) ! EVENEMENT DE CLIC SOURIS evenements_souris CLR event& ENDIF ' evenements_autres ! AUCUN EVENEMENT MAIS LA SOURIS BOUGE ' LOOP WHILE NOT fin_programme! ' RETURN ' > PROCEDURE evenements_message ! Tien ! un message vient d'arriver LOCAL xw&,yw&,ww&,hw& ! Coordonn‚es zone de travail fenˆtre LOCAL temp&,adr_arb%,obstate& LOCAL zx&,zy&,zw&,zh&,adrc%,cr|,cv|,cb|,c0 LOCAL fx&,fy&,fw&,fh& ' $S&,S> SELECT INT{buf%} CASE mn_selected& evenements_menus CASE wm_redraw& redraw(INT{ADD(buf%,8)},INT{ADD(buf%,10)},INT{ADD(buf%,12)},INT{ADD(buf%,14)},TRUE) CASE wm_topped& wind_set(INT{ADD(buf%,6)},wf_top&,0,0,0,0) ~@wind_get(INT{ADD(buf%,6)},wf_workxywh&,xw&,yw&,ww&,hw&) desactiver_fenetre IF @numero_fenetre(INT{ADD(buf%,6)})=6 ! Fenˆtre des lumiŠres cr|=BYTE{ADD(mem_src%,4)} cv|=BYTE{ADD(mem_src%,5)} cb|=BYTE{ADD(mem_src%,6)} objc_offset(adr_lumieres%,souscoul&,fx&,fy&) fw&=OB_W(adr_lumieres%,souscoul&) fh&=OB_H(adr_lumieres%,souscoul&) affichage_couleur_tc(fx&,fy&,fw&,fh&,cr|,cv|,cb|,global_xb&,global_yb&,global_wb&,global_hb&) ENDIF CASE wm_closed& temp&=@numero_fenetre(INT{ADD(buf%,6)}) IF temp&<>-1 SELECT temp& CASE idx_outils& menu_icheck(adr_menu%,maffiout&,0) CASE idx_vue_fine& menu_icheck(adr_menu%,mgouraud&,0) menu_icheck(adr_menu%,mphong&,0) gouraud!=FALSE phong!=FALSE CASE idx_temps_passe& temps_des_calcul!=FALSE CASE idx_vue& IF travail_a_sauver! AND (nombre_d_objets&>0) IF @afficher_alerte(adr_danger%)=2 IF @afficher_alerte(adr_quitter%)=1 fin_programme!=TRUE ENDIF ENDIF ELSE IF @afficher_alerte(adr_quitter%)=1 fin_programme!=TRUE ENDIF ENDIF CASE idx_info_objet& info_objet_supp!=FALSE ENDSELECT IF (NOT fin_programme!) AND temp&<>idx_vue& fermeture_fenetre(SHL(temp&,1)) ENDIF ENDIF CASE wm_fulled& fulled CASE wm_moved& zx&=SHL(SHR(INT{ADD(buf%,8)},2),2) ! Sur un multiple de 8 zy&=INT{ADD(buf%,10)} zw&=INT{ADD(buf%,12)} zh&=INT{ADD(buf%,14)} wind_set(INT{ADD(buf%,6)},wf_currxywh&,zx&,zy&,zw&,zh&) temp&=@numero_fenetre(INT{ADD(buf%,6)}) IF temp&<>-1 IF temp&=idx_vue& ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,xw&,yw&,ww&,hw&) OB_X(adr_fenetre%,0)=xw& OB_Y(adr_fenetre%,0)=yw& tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE tri_2d!=FALSE ELSE ~@wind_get(INT{ADD(hwind%,SHL(temp&,1))},wf_workxywh&,xw&,yw&,ww&,hw&) OB_X(@arbre_ressource(temp&),0)=xw& OB_Y(@arbre_ressource(temp&),0)=yw& ENDIF ENDIF CASE wm_sized& wind_set(INT{ADD(buf%,6)},wf_currxywh&,INT{ADD(buf%,8)},INT{ADD(buf%,10)},INT{ADD(buf%,12)},INT{ADD(buf%,14)}) temp&=@numero_fenetre(INT{ADD(buf%,6)}) IF temp&=idx_vue& mise_a_la_taille_fenetre_de_vue tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE tri_2d!=FALSE redessin_deja_fait!=FALSE ELSE IF temp&=idx_hierarchie& CLR posx_hierarchie%,posy_hierarchie% ascenceurs_hierarchie etat_bouton_hierarchie_vertical(FALSE) etat_bouton_hierarchie_horizontal(FALSE) ELSE IF temp&=idx_animation& resize_fenetre_d_anime ENDIF redraw_force(temp&,temp&) CASE wm_newtop& wind_set(INT{ADD(buf%,6)},wf_currxywh&,INT{ADD(buf%,8)},INT{ADD(buf%,10)},INT{ADD(buf%,12)},INT{ADD(buf%,14)}) CASE bubblegem_request& bulles_d_aide CASE ap_dragdrop& recois_drag_drop(INT{ADD(buf%,6)},INT{ADD(buf%,8)},INT{ADD(buf%,10)},INT{ADD(buf%,12)},ADD(buf%,14)) CASE va_start& IF travail_a_sauver! AND (nombre_d_objets&>0) IF @afficher_alerte(adr_danger%)=2 chargement_par_va_start ENDIF ELSE chargement_par_va_start ENDIF CASE shut_down& IF travail_a_sauver! AND (nombre_d_objets&>0) IF @afficher_alerte(adr_danger%)=2 IF @afficher_alerte(adr_quitter%)=1 fin_programme!=TRUE ENDIF ENDIF ELSE IF @afficher_alerte(adr_quitter%)=1 fin_programme!=TRUE ENDIF ENDIF CASE wm_zero& INT{ADD(buf%,8)}=0 INT{ADD(buf%,10)}=0 INT{ADD(buf%,12)}=0 INT{ADD(buf%,14)}=0 ENDSELECT ' RETURN > PROCEDURE evenements_menus ! Bon, on a cliquer dans les menus LOCAL reponse&,rx&,ry& LOCAL un%,fin_un% LOCAL fx&,fy&,fw&,fh& ' ' Placer le titre de menus dans son ‚tat normal menu_tnormal(adr_menu%,INT{ADD(buf%,6)},1) $S&,S> SELECT INT{ADD(buf%,8)} ! Selon l'option de menu cliqu‚e CASE minfo& ouvrir_information CASE mnouvell& IF @nouvelle_scene(FALSE)=1 scene_vide redraw_force(idx_info&,idx_animation&) ENDIF CASE mcharges& IF BTST(kbd&,cl_alternate&) mise_en_place_popup(chxancsc&) rx&=SUB(global_mx&,DIV(OB_W(adr_popup_divers%,chxancsc&),2)) ry&=SUB(global_my&,DIV(OB_H(adr_popup_divers%,chxancsc&),2)) positionner_popup(-2,0,0,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,ancsce01&,ancsce02&,0) IF reponse&<255 charger_une_ancienne_scene(reponse&) ENDIF ELSE charger_fichier_ebs(FALSE) mise_a_jour_des_chemins_et_nom_de_fichier mise_a_jour_de_l_objet_actif(TRUE) ENDIF redraw_force(idx_info&,idx_animation&) CASE msauvers& CHAR{masque%}="ebs"+CHR$(0) definition_fichier(adr_parametres%,cheebs&,nom_en_cours%,FALSE,FALSE,-1) IF CHAR{nom_en_cours%}<>"" sauvegarde_fichiers_ebs(TRUE) ELSE sauver_fichier_ebs ENDIF mise_a_jour_des_chemins_et_nom_de_fichier redraw_force(idx_vue&,idx_vue&) CASE msauvnom& CHAR{masque%}="ebs"+CHR$(0) sauver_fichier_ebs mise_a_jour_des_chemins_et_nom_de_fichier redraw_force(idx_vue&,idx_vue&) CASE mimg& assigner_les_images_de_fond redraw_force(idx_info&,idx_animation&) CASE m3d2& importation_d_objets mise_a_jour_de_l_objet_actif(TRUE) CASE msauverp& IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) generation_de_scripts(TRUE) ELSE generation_de_scripts(FALSE) ENDIF CASE mimprime& gestion_des_outils_externes CASE medtexte& lancer_un_programme(chetxt&,chepov&,OB_SPEC(adr_divers%,lin36&),OB_SPEC(adr_divers%,lin38&),OB_SPEC(adr_lanceur%,povscrip&)) CASE mvimage& lancer_un_programme(chevis&,cheimg&,OB_SPEC(adr_divers%,lin37&),OB_SPEC(adr_divers%,lin39&),OB_SPEC(adr_lanceur%,povimage&)) CASE mprogext& lancer_un_programme(cheext&,0,0,0,0) CASE mlancpov& ouvrir_lanceur_pov CASE mquitter& IF travail_a_sauver! AND (nombre_d_objets&>0) IF @afficher_alerte(adr_danger%)=2 IF @afficher_alerte(adr_quitter%)=1 fin_programme!=TRUE ENDIF ENDIF ELSE IF @afficher_alerte(adr_quitter%)=1 fin_programme!=TRUE ENDIF ENDIF CASE mmodifie& ouvrir_modification CASE mcalques& ouvrir_les_calques CASE mcaler& ouvrir_les_calages CASE meffacer& ouvrir_effacer CASE munion& ouvrir_fonctions CASE mbibl& ouvrir_bibliotheque CASE mtexture& ' IF normal_camera! ' fermeture_fenetre(44) ' normal_camera!=FALSE ' mettre_a_jour_les_redraws(global_xb&,global_yb&,global_wb&,global_hb&,-1) ' ENDIF IF nombre_d_objets&>0 videsouris mise_en_place_popup(chxhalde&) rx&=SUB(global_mx&,DIV(OB_W(adr_popup_divers%,chxhalde&),2)) ry&=SUB(global_my&,DIV(OB_H(adr_popup_divers%,chxhalde&),2)) positionner_popup(-2,0,0,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,haldes01&,haldes02&,0) IF reponse&<>255 $S&,$S> SELECT reponse& CASE 0 lancement_gestion_texture ' ouvrir_textures CASE 1 lancement_gestion_texture ' ouvrir_pigment CASE 2 lancement_gestion_texture ' ouvrir_normal CASE 3 lancement_gestion_texture ' ouvrir_finish CASE 4 lancement_gestion_texture ' ouvrir_interior CASE 5 lancement_gestion_texture ' ouvrir_atmosphere ENDSELECT ENDIF ELSE lancement_gestion_texture ' ouvrir_atmosphere ENDIF CASE mmodtai& lancement_gestion_texture ' ouvrir_textures_multiples CASE mcopier& copier_objet_actif CASE mstatist& ouvrir_statistiques CASE mselmult& ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,fx&,fy&,fw&,fh&) global_mx&=PRED(ADD(fx&,DIV(fw&,2))) global_my&=PRED(ADD(fy&,DIV(fh&,2))) SUB global_mx&,DIV(OB_W(adr_selec_mult%,0),2) SUB global_my&,DIV(OB_H(adr_selec_mult%,0),2) ADD global_mx&,16 IF global_mx&PRED(ADD(fx&,fw&)) global_mx&=SUB(PRED(ADD(fx&,fw&)),OB_W(adr_selec_mult%,0)) ENDIF IF PRED(ADD(global_my&,OB_H(adr_selec_mult%,0)))>PRED(ADD(fy&,fh&)) global_my&=SUB(PRED(ADD(fy&,fh&)),OB_H(adr_selec_mult%,0)) ENDIF @selection_multiple(global_mx&,global_my&) CASE mseltout& deplacement_multiple%=@prendre(SHL(limite_des_objets&,1),TRUE,3) CLR objets_a_deplacer&,numero& un%=univers% fin_un%=@adresse_objet(nombre_d_objets&) DO ' Si l'objet n'est pas masqu‚, alors, on le s‚lectionne IF NOT BTST(BYTE{ADD(un%,offset_drapeau0&)},bit_masque|) CARD{ADD(deplacement_multiple%,SHL(objets_a_deplacer&,1))}=numero& INC objets_a_deplacer& ENDIF INC numero& ADD un%,taille_objet& LOOP WHILE un%-1 fermeture_fenetre(idx_outils_dbl&) menu_icheck(adr_menu%,maffiout&,0) ELSE ouvrir_outils menu_icheck(adr_menu%,maffiout&,1) ENDIF CASE mparamet& ouvrir_parametrages ENDSELECT ' RETURN > PROCEDURE evenements_souris ! La souris a encore fait des siennes LOCAL temp&,i&,rx&,ry& LOCAL fx&,fy&,fw&,fh& LOCAL top&,anc_ob_ac& LOCAL src_depl% LOCAL des_depl% LOCAL tai_depl% LOCAL univ%,adr_poi% ' temp&=@numero_fenetre(@wind_find(global_mx&,global_my&)) $S&,S> SELECT temp& CASE idx_info& gestion_information CASE idx_outils& gestion_outils CASE idx_vue_subjective& gestion_vue_subjective CASE idx_modification& gestion_modifications CASE 4 gestion_couleurs_predefinies CASE 5 ' Pour plus tard CASE idx_lumieres& gestion_lumieres CASE idx_aide& gestion_aide CASE idx_fonctions& gestion_des_fonctions_des_effacements_et_des_masquages CASE idx_calques& gestion_des_calques CASE idx_statistiques& gestion_statistiques CASE idx_merci& gestion_merci CASE idx_camera& gestion_position_camera CASE idx_lanceur& gestion_du_lanceur_pov CASE 14 ' Pour plus tard CASE idx_parametrage& gestion_parametres CASE 16 ' Pour plus tard CASE idx_bicubic& gestion_bicubics CASE idx_auteur& gestion_image_auteur CASE idx_vue_fine& gestion_vue_fine CASE idx_temps_passe& gestion_temps_passe CASE 21 ' Pour plus tard CASE 22 ' Pour plus tard CASE 23 ' Pour plus tard CASE idx_vue& IF global_mk&=2 OR click&=2 ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,fx&,fy&,fw&,fh&) IF RC_INTERSECT(global_mx&,global_my&,1,1,fx&,fy&,fw&,fh&) la_fenetre(fen_act&,fx&,fy&,fw&,fh&) IF RC_INTERSECT(global_mx&,global_my&,1,1,fx&,fy&,fw&,fh&) ob&=@objet_cliquer IF ob&>-1 $S&,$S> SELECT ob& CASE 1000,1001 ouvrir_camera CASE 2000,2010 ouvrir_lumieres CASE 6000 TO 6007,7000,8000,9999 redraw(fx&,fy&,fw&,fh&,TRUE) ouvrir_modification CASE 9000 TO 9015,9100 TO 9115 redraw(fx&,fy&,fw&,fh&,TRUE) ouvrir_modification univ%=@adresse_objet(objet_actif&) afficher_les_points_bicubic(univ%,FALSE) modif_bez!=TRUE ouvrir_fenetre(idx_bicubic&,adr_bicubics%) modif_faite!=TRUE DEFAULT redraw(fx&,fy&,fw&,fh&,TRUE) ouvrir_modification ENDSELECT ELSE IF nombre_d_objets&>0 ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,fx&,fy&,fw&,fh&) global_mx&=PRED(ADD(fx&,DIV(fw&,2))) global_my&=PRED(ADD(fy&,DIV(fh&,2))) SUB global_mx&,DIV(OB_W(adr_selec_mult%,0),2) SUB global_my&,DIV(OB_H(adr_selec_mult%,0),2) ADD global_mx&,16 IF global_mx&PRED(ADD(fx&,fw&)) global_mx&=SUB(PRED(ADD(fx&,fw&)),OB_W(adr_selec_mult%,0)) ENDIF IF PRED(ADD(global_my&,OB_H(adr_selec_mult%,0)))>PRED(ADD(fy&,fh&)) global_my&=SUB(PRED(ADD(fy&,fh&)),OB_H(adr_selec_mult%,0)) ENDIF @selection_multiple(global_mx&,global_my&) ELSE mise_en_place_popup(chxancsc&) rx&=SUB(global_mx&,DIV(OB_W(adr_popup_divers%,chxancsc&),2)) ry&=SUB(global_my&,DIV(OB_H(adr_popup_divers%,chxancsc&),2)) positionner_popup(-2,0,0,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,ancsce01&,ancsce02&,0) IF reponse&<255 charger_une_ancienne_scene(reponse&) redraw_force(idx_info&,idx_animation&) ENDIF ENDIF ENDIF ENDIF ENDIF ELSE IF un_clic! un_clic!=FALSE ELSE IF trois_vue! AND @clique_centre_4_vues change_taille_des_vues mise_a_la_taille_fenetre_de_vue tri_2d!=FALSE tri_fi!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE anc_ob_ac&=objet_actif& ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,fx&,fy&,fw&,fh&) IF RC_INTERSECT(global_mx&,global_my&,1,1,fx&,fy&,fw&,fh&) la_fenetre(fen_act&,fx&,fy&,fw&,fh&) IF dessin_3d|-1 $S&,$S> SELECT ob& CASE 1000 ! D‚placer la cam‚ra deplacer_un_element(-1,TRUE,type_camera&) CASE 1001 ! D‚placer point de vis‚ de la cam‚ra deplacer_un_element(-1,FALSE,type_camera&) CASE 2000 ! D‚placer source de lumiŠre deplacer_un_element(-1,TRUE,type_lumiere&) CASE 2010 ! D‚placer point de vis‚ source de lumiŠre deplacer_un_element(-1,FALSE,type_lumiere&) CASE 6000 TO 6007 ! Modification de taille de l'objet actif deplacer_un_element(SUB(ob&,6000),FALSE,type_poignees&) CASE 6008 ! D‚placer un objet deplacer_un_element(-1,FALSE,type_objet&) CASE 7000 IF @test_touche_morte(TRUE,FALSE,FALSE,FALSE) OR @test_touche_morte(FALSE,TRUE,FALSE,FALSE) IF objets_a_deplacer&=0 IF anc_ob_ac&<>objet_actif& deplacement_multiple%=@prendre(SHL(limite_des_objets&,1),TRUE,3) CARD{deplacement_multiple%}=anc_ob_ac& INC objets_a_deplacer& CARD{ADD(deplacement_multiple%,SHL(objets_a_deplacer&,1))}=objet_actif& INC objets_a_deplacer& ENDIF ELSE CARD{ADD(deplacement_multiple%,SHL(objets_a_deplacer&,1))}=objet_actif& INC objets_a_deplacer& ENDIF ELSE IF objets_a_deplacer&>0 libere(*deplacement_multiple%) CLR objets_a_deplacer& ENDIF ENDIF calcul_selection_multiple!=FALSE redraw_force(idx_vue&,idx_vue&) CASE 8000 deplacer_un_element(-1,FALSE,type_rotation&) CASE 9000 TO 9015 IF @test_touche_morte(TRUE,FALSE,FALSE,FALSE) INC num_pt_ctrl& num_pt_ctrl&=0*(num_pt_ctrl&>15)-num_pt_ctrl&*(num_pt_ctrl&<16) ELSE IF @test_touche_morte(FALSE,TRUE,FALSE,FALSE) DEC num_pt_ctrl& num_pt_ctrl&=-15*(num_pt_ctrl&<0)-num_pt_ctrl&*(num_pt_ctrl&>-1) ELSE num_pt_ctrl&=SUB(ob&,9000) ENDIF redraw_force(idx_vue&,idx_vue&) CASE 9100 TO 9115 IF @test_touche_morte(TRUE,FALSE,FALSE,FALSE) INC num_pt_ctrl& num_pt_ctrl&=0*(num_pt_ctrl&>15)-num_pt_ctrl&*(num_pt_ctrl&<16) redraw_force(idx_vue&,idx_vue&) ELSE IF @test_touche_morte(FALSE,TRUE,FALSE,FALSE) DEC num_pt_ctrl& num_pt_ctrl&=-15*(num_pt_ctrl&<0)-num_pt_ctrl&*(num_pt_ctrl&>-1) redraw_force(idx_vue&,idx_vue&) ELSE deplacer_point_de_controle_a_la_souris(num_pt_ctrl&) ENDIF DEFAULT IF @test_touche_morte(TRUE,FALSE,FALSE,FALSE) OR @test_touche_morte(FALSE,TRUE,FALSE,FALSE) i&=@dans_saisie_multiple(objet_actif&) IF i&>-1 DEC objets_a_deplacer& IF objets_a_deplacer&=0 libere(*deplacement_multiple%) CLR objets_a_deplacer& ELSE src_depl%=ADD(deplacement_multiple%,SHL(SUCC(i&),1)) des_depl%=ADD(deplacement_multiple%,SHL(i&,1)) tai_depl%=SHL(SUB(objets_a_deplacer&,i&),1) bmove(src_depl%,des_depl%,tai_depl%) objet_actif&=INT{ADD(deplacement_multiple%,SHL(PRED(objets_a_deplacer&),1))} ENDIF redraw_force(idx_vue&,idx_vue&) ENDIF ENDIF ENDSELECT ENDIF ELSE IF objets_a_deplacer&>0 libere(*deplacement_multiple%) CLR objets_a_deplacer& redraw_force(idx_vue&,idx_vue&) calcul_selection_multiple!=FALSE ENDIF gestion_fenetre_de_vue ENDIF ELSE gestion_fenetre_de_vue ENDIF ENDIF ENDIF ENDIF CASE idx_calage& gestion_des_calages CASE idx_info_objet& gestion_info_objet CASE idx_quartic& gestion_quartic CASE idx_quadric& gestion_quadric CASE idx_bibliotheque& gestion_bibliotheque CASE idx_hierarchie& gestion_hierarchie CASE idx_animation& gestion_animation ENDSELECT ' RETURN > PROCEDURE evenements_clavier ! Pas si fort, les touches sont fragiles LOCAL fx&,fy&,fw&,fh&,suivante&,l%,lo%,i& LOCAL x&,y&,w&,h&,univ%,univs%,univd% LOCAL temp&,top&,mem_dum&,tot%,mem_d| LOCAL px,py,pz,pw,ph,pf,rx,ry,rz LOCAL zx&,zy&,zw&,zh& LOCAL stg_id&,ob&,mem_def! ' IF edit&=0 kbd&=BCLR(kbd&,4) ! Annuler bit Capslock ' PRINT AT(1,23);HEX$(key&,4);" " IF key&=&H206 ' Touche CONTROL '1' les_calque_invisibles_sauf(0) redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H302 ' Touche CONTROL '2' les_calque_invisibles_sauf(1) redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H402 ' Touche CONTROL '3' les_calque_invisibles_sauf(2) redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H507 ' Touche CONTROL '4' les_calque_invisibles_sauf(3) redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H608 ' Touche CONTROL '5' les_calque_invisibles_sauf(4) redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H71D ' Touche CONTROL '6' les_calque_invisibles_sauf(5) redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H80A ' Touche CONTROL '7' les_calque_invisibles_sauf(6) redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H901 ' Touche CONTROL '8' les_calque_invisibles_sauf(7) redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF CARD(key&)=&HA07 ' Touche CONTROL '9' les_calque_invisibles_sauf(8) redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF CARD(key&)=&HB05 ' Touche CONTROL '0' les_calque_invisibles_sauf(9) redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF CARD(key&)=&HC09 ' Touche CONTROL 'ø' tous_les_calques_visibles redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H211 ' Touche SHIFT CONTROL '1' BYTE{ADD(nom_calque%,35)}=1 redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H300 ' Touche SHIFT CONTROL '2' BYTE{ADD(ADD(nom_calque%,36),35)}=1 redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H413 ' Touche SHIFT CONTROL '3' BYTE{ADD(ADD(nom_calque%,72),35)}=1 redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H514 ' Touche SHIFT CONTROL '4' BYTE{ADD(ADD(nom_calque%,108),35)}=1 redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H615 ' Touche SHIFT CONTROL '5' BYTE{ADD(ADD(nom_calque%,144),35)}=1 redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H71E ' Touche SHIFT CONTROL '6' BYTE{ADD(ADD(nom_calque%,180),35)}=1 redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H817 ' Touche SHIFT CONTROL '7' BYTE{ADD(ADD(nom_calque%,216),35)}=1 redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H918 ' Touche SHIFT CONTROL '8' BYTE{ADD(ADD(nom_calque%,252),35)}=1 redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF CARD(key&)=&HA19 ' Touche SHIFT CONTROL '9' BYTE{ADD(ADD(nom_calque%,288),35)}=1 redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF CARD(key&)=&HB10 ' Touche SHIFT CONTROL '0' BYTE{ADD(ADD(nom_calque%,324),35)}=1 redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H3B00 ' Touche F1 ! Charger une nouvelle scŠne charger_fichier_ebs(FALSE) mise_a_jour_des_chemins_et_nom_de_fichier mise_a_jour_de_l_objet_actif(TRUE) redraw_force(idx_info&,idx_animation&) ELSE IF key&=&H5400 ' Touche Shift F1 ! Sauver la scŠne en m‚moire IF nombre_d_objets&>0 CHAR{masque%}="ebs"+CHR$(0) definition_fichier(adr_parametres%,cheebs&,nom_en_cours%,FALSE,FALSE,-1) IF CHAR{nom_en_cours%}<>"" sauvegarde_fichiers_ebs(TRUE) ELSE sauver_fichier_ebs ENDIF mise_a_jour_des_chemins_et_nom_de_fichier redraw_force(idx_vue&,idx_vue&) ENDIF ELSE IF key&=&H3C00 ' Touche F2 ! Importer un objet ou une scŠne importation_d_objets mise_a_jour_de_l_objet_actif(TRUE) ELSE IF key&=&H5500 ' Touche Shift F2 ! Exporter la scŠne sous... IF nombre_d_objets&>0 generation_de_scripts(FALSE) ENDIF ELSE IF key&=&H3D00 ' Touche F3 ! Modification des objets IF nombre_d_objets&>0 ouvrir_modification ENDIF ELSE IF key&=&H5600 ' Touche Shift F3 ! Gestion des C.S.G. IF nombre_d_objets&>0 ouvrir_fonctions ENDIF ELSE IF key&=&H3E00 IF BTST(kbd&,cl_control&) ' Touche CONTROL F4 : Fermeture de la fenˆtre active ~@wind_get(0,wf_top&,top&,temp&,temp&,temp&) temp&=@numero_fenetre(top&) IF temp&<>-1 SELECT temp& CASE idx_outils& menu_icheck(adr_menu%,maffiout&,0) fermeture_fenetre(SHL(temp&,1)) CASE idx_vue& IF travail_a_sauver! AND (nombre_d_objets&>0) IF @afficher_alerte(adr_danger%)=2 IF @afficher_alerte(adr_quitter%)=1 fin_programme!=TRUE fermeture_fenetre(SHL(temp&,1)) ENDIF ENDIF ELSE IF @afficher_alerte(adr_quitter%)=1 fin_programme!=TRUE fermeture_fenetre(SHL(temp&,1)) ENDIF ENDIF DEFAULT fermeture_fenetre(SHL(temp&,1)) ENDSELECT ENDIF ELSE IF BTST(kbd&,cl_alternate&) ' Touche ALTERNATE F4 : Fermeture de l'aplication IF travail_a_sauver! AND (nombre_d_objets&>0) IF @afficher_alerte(adr_danger%)=2 IF @afficher_alerte(adr_quitter%)=1 fin_programme!=TRUE ENDIF ENDIF ELSE IF @afficher_alerte(adr_quitter%)=1 fin_programme!=TRUE ENDIF ENDIF ELSE ' Touche F4 ! D‚finition des textures IF editeur_texture_dispo! IF nombre_d_objets&>0 ' IF normal_camera! ' fermeture_fenetre(44) ' normal_camera!=FALSE ' mettre_a_jour_les_redraws(global_xb&,global_yb&,global_wb&,global_hb&,-1) ' ENDIF lancement_gestion_texture ' ouvrir_textures ENDIF ENDIF ENDIF ELSE IF key&=&H5700 ' Touche Shift F4 ! D‚finition des PIGMENTs IF editeur_texture_dispo! IF nombre_d_objets&>0 ' IF normal_camera! ' fermeture_fenetre(44) ' normal_camera!=FALSE ' mettre_a_jour_les_redraws(global_xb&,global_yb&,global_wb&,global_hb&,-1) ' ENDIF lancement_gestion_texture ' ouvrir_pigment ENDIF ENDIF ELSE IF key&=&H3F00 ' Touche F5 ! D‚finition des NORMALs IF editeur_texture_dispo! IF nombre_d_objets&>0 ' IF normal_camera! ' fermeture_fenetre(44) ' normal_camera!=FALSE ' mettre_a_jour_les_redraws(global_xb&,global_yb&,global_wb&,global_hb&,-1) ' ENDIF lancement_gestion_texture ' ouvrir_normal ENDIF ENDIF ELSE IF key&=&H5800 ' Touche Shift F5 ! D‚finition des FINISHs IF editeur_texture_dispo! IF nombre_d_objets&>0 ' IF normal_camera! ' fermeture_fenetre(44) ' normal_camera!=FALSE ' mettre_a_jour_les_redraws(global_xb&,global_yb&,global_wb&,global_hb&,-1) ' ENDIF lancement_gestion_texture ' ouvrir_finish ENDIF ENDIF ELSE IF key&=&H4000 ' Touche F6 ! D‚finition de la cam‚ra ' IF normal_camera! ' fermeture_fenetre(44) ' normal_camera!=FALSE ' mettre_a_jour_les_redraws(global_xb&,global_yb&,global_wb&,global_hb&,-1) ' ENDIF ouvrir_camera ELSE IF key&=&H5900 ' Touche Shift F6 ! D‚finition des lumiŠres ouvrir_lumieres ELSE IF key&=&H4100 ' Touche F7 ! Vue de face changement_de_vue(vue_de_face|) ELSE IF key&=&H5A00 ' Touche Shift F7 ! Vue de dos changement_de_vue(vue_de_dos|) ELSE IF key&=&H4200 ' Touche F8 ! Vue de droite changement_de_vue(vue_de_droite|) ELSE IF key&=&H5B00 ' Touche Shift F8 ! Vue de gauche changement_de_vue(vue_de_gauche|) ELSE IF key&=&H4300 ' Touche F9 ! Vue de dessus changement_de_vue(vue_de_dessus|) ELSE IF key&=&H5C00 ' Touche Shift F9 ! Vue de dessous changement_de_vue(vue_de_dessous|) ELSE IF key&=&H4400 ' Touche F10 ! Vue 3D filaire changement_de_vue(vue_en_3d|) ELSE IF key&=&H5D00 ' Touche Shift F10 ! Vue 3D faces cach‚es changement_de_vue(vue_en_3d_cache|) ELSE IF key&=&H11B ' Touche ESC A ne pas utiliser pour ne pas interf‚rer avec ' les saisies du GEM ELSE IF key&=&HF09 ' Touche TAB ou Shift TAB IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) passer_a_l_objet_precedent ELSE passer_a_l_objet_suivant ENDIF ELSE IF key&=&H2E63 OR key&=&H2E43 ' Touche 'C' ou 'c' centrage des vues sur l'objets actif IF nombre_d_objets&>0 centrage_auto!=NOT centrage_auto! ob_state(adr_outils%,izcentre&,aes_selected&,centrage_auto!) redraw_elem(adr_outils%,izcentre&) IF nombre_d_objets&>0 AND centrage_auto! redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ENDIF ENDIF ELSE IF key&=&H2D78 OR key&=&H2D58 ' Touche 'x' ou 'X' pour bloquer/d‚bloquer l'axe X IF NOT BTST(OB_STATE(adr_fenetre%,fenlib_x&),aes_disable&) liberte_x!=NOT liberte_x! ob_state(adr_fenetre%,fenlib_x&,aes_selected&,liberte_x!) redraw_elem(adr_fenetre%,fenlib_x&) verifier_les_contraintes(0) ENDIF ELSE IF key&=&H1579 OR key&=&H1559 ' Touche 'y' ou 'Y' pour bloquer/d‚bloquer l'axe Y IF NOT BTST(OB_STATE(adr_fenetre%,fenlib_y&),aes_disable&) liberte_y!=NOT liberte_y! ob_state(adr_fenetre%,fenlib_y&,aes_selected&,liberte_y!) redraw_elem(adr_fenetre%,fenlib_y&) verifier_les_contraintes(1) ENDIF ELSE IF key&=&H1970 OR key&=&H1950 ' Touche 'p' ou 'P' pour bloquer/d‚bloquer l'axe Z IF NOT BTST(OB_STATE(adr_fenetre%,fenlib_z&),aes_disable&) liberte_z!=NOT liberte_z! ob_state(adr_fenetre%,fenlib_z&,aes_selected&,liberte_z!) redraw_elem(adr_fenetre%,fenlib_z&) verifier_les_contraintes(2) ENDIF ELSE IF key&=&H117A OR key&=&H115A ' Touche 'Z' ou 'z' D‚finition du zoom … la souris IF dessin_3d|0 retire_centrage definition_zoom_souris ENDIF ELSE IF key&=&H1675 OR key&=&H1655 ' Touche 'U' ou 'u' pour le centrage de l'univers IF nombre_d_objets&>0 centrage_sur_univers ENDIF ELSE IF key&=&H2146 OR key&=&H2166 ' Touche 'F' ou 'f' pour le activer/d‚sactiver les images de fond d'‚cran image_de_calque!=NOT image_de_calque! ob_state(adr_outils%,iimgfond&,aes_selected&,image_de_calque!) redraw_element_fenetre(2,adr_outils%,iimgfond&) redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ELSE IF key&=&H1474 OR key&=&H1454 ' Touche 'T' ou 't' pour zoom totale IF nombre_d_objets&>0 total_auto!=NOT total_auto! ob_state(adr_outils%,iztotal&,aes_selected&,total_auto!) redraw_elem(adr_outils%,iztotal&) IF total_auto! tri_2d!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ENDIF ENDIF ELSE IF key&=&H1372 OR key&=&H1352 ' Touche 'R' ou 'r' pour reconstruire toutes les C.S.G. IF nombre_d_objets&>0 reconstruction_des_csg tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE tri_2d!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_vue&,idx_vue&) ENDIF ELSE IF SHR&(key&,8)=&H4D ' Curseur vers la droite IF dessin_3d|0 IF @afficher_alerte(adr_danger%)=2 IF objets_a_deplacer&>0 i&=PRED(objets_a_deplacer&) DO enleve_objet(CARD{ADD(deplacement_multiple%,SHL(i&,1))}) DEC i& LOOP WHILE i&>-1 libere(*deplacement_multiple%) CLR objets_a_deplacer& calcul_selection_multiple!=FALSE ELSE enleve_objet(objet_actif&) ENDIF objet_suivant calque_actif|=@calque_actif(@adresse_objet(objet_actif&)) mise_a_jour_de_l_objet_actif(TRUE) tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE tri_2d!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_info&,idx_animation&) ENDIF ENDIF ELSE IF BYTE(key&)=&H2B ' Touche '+' pour augmenter le Zoom IF dessin_3d|20 retire_centrage ' Totalit‚ du monde (de -16383 … +16384) la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) tot%=(global_wf&/32767)*1024 IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) IF zoom%>tot%+20 SUB zoom%,512 ENDIF ELSE IF zoom%>tot%+20 SUB zoom%,102 ENDIF ENDIF IF zoom%<10 zoom%=10 ENDIF tri_2d!=FALSE ecrire_zoom_dans_outils(FALSE) redessin_deja_fait!=FALSE redraw_force(idx_info&,idx_animation&) ENDIF ELSE IF key&=&H662A OR key&=&H1B2A ' Touche '*' pav‚ num‚rique ou clavier pour sauver la scŠne du UNDO IF nombre_d_objets&>0 AND max_undo&>0 CHAR{masque%}="ebs"+CHR$(0) definition_fichier(adr_parametres%,cheund&,nom_divers%,FALSE,FALSE,-1) IF undo_sauver&1 CHAR{nom_divers%}="und"+RIGHT$("00000"+STR$(max_undo&),5)+".ebs"+CHR$(0) minuscule(nom_divers%) CHAR{mem_nom%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) IF @s_exist(mem_nom%) ~GEMDOS(&H41,L:mem_nom%) ENDIF i&=PRED(max_undo&) DO CHAR{nom_divers%}="und"+RIGHT$("00000"+STR$(i&),5)+".ebs"+CHR$(0) minuscule(nom_divers%) CHAR{nom_mouvement%}="und"+RIGHT$("00000"+STR$(SUCC(i&)),5)+".ebs"+CHR$(0) minuscule(nom_mouvement%) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) minuscule(mem_che%) CHAR{mem_nom%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%}+CHR$(0) minuscule(mem_nom%) IF @s_exist(mem_che%) ~GEMDOS(&H56,L:mem_che%,L:mem_nom%) ENDIF DEC i& LOOP WHILE i&>0 CHAR{nom_divers%}="und00001.ebs"+CHR$(0) ELSE CHAR{nom_divers%}="und00001.ebs"+CHR$(0) ENDIF minuscule(nom_divers%) undo_appel&=undo_sauver& CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) minuscule(mem_che%) charger_ancienne!=TRUE sauvegarde_fichiers_ebs(FALSE) charger_ancienne!=FALSE redraw_force(idx_vue&,idx_vue&) ENDIF ELSE IF key&=&H6100 ' 'UNDO' pour rappeler la sauvegarde du UNDO IF max_undo&>0 AND undo_sauver&>0 mem_d|=dessin_3d| CHAR{mem_nom%}=CHAR{titre_en_cours%}+CHR$(0) charger_ancienne!=TRUE ~@nouvelle_scene(TRUE) charger_ancienne!=FALSE CHAR{titre_en_cours%}=CHAR{mem_nom%} dessin_3d|=mem_d| CHAR{masque%}="ebs"+CHR$(0) definition_fichier(adr_parametres%,cheund&,nom_divers%,FALSE,FALSE,-1) CHAR{nom_divers%}="und"+RIGHT$("00000"+STR$(undo_appel&),5)+".ebs"+CHR$(0) minuscule(nom_divers%) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} lire_un_chunk(l%,lo%) lire_un_chunk(l%,lo%) RELSEEK #1,lo% CLR l% IF @charger_ebs CLR debut_texture&,debut_couleur&,compteur_csg& scene_remplie CLR debut_liste_csg&,debut_liste_eff& CLR debut_popup_choix&,objet_actif& CLR debut_popup_lum& redimention!=FALSE tri_3d!=FALSE trace_3d_plein!=FALSE tri_2d!=FALSE tri_fi!=FALSE redessin_deja_fait!=FALSE sauve!=TRUE CLR face_maximum% ecrire_zoom_dans_outils(FALSE) redraw_force(idx_vue&,idx_vue&) ENDIF DEC undo_appel& IF undo_appel&=0 undo_appel&=undo_sauver& ENDIF CLOSE #1 ENDIF ENDIF ELSE IF key&=&H4700 ' Touche 'CLR/HOME' pour tout recentrer … l'‚cran IF (dessin_3d|0 OR deplacement_en_y&<>0 OR deplacement_en_z&<>0 OR zoom%<>1024)) OR (trois_vue! AND (dif_fx&<>0 OR dif_fy&<>0)) retire_centrage zoom%=1024 ecrire_zoom_dans_outils(FALSE) redessin_deja_fait!=FALSE tri_2d!=FALSE IF dif_fx&<>0 OR dif_fy&<>0 CLR dif_fx&,dif_fy& mise_a_la_taille_fenetre_de_vue ENDIF CLR deplacement_en_x&,deplacement_en_y&,deplacement_en_z& redraw_force(idx_info&,idx_animation&) ENDIF ELSE IF key&=&H6200 ' Touche 'HELP' pour appeller l'aide en ligne inactif pour l'instant ' pr‚vu pour l'envoi d'un message d'ouverture d'une aide HYPERTEXTE ' On s'envoie … soi-mˆme un message de redraw IF adr_bub%>0 temp&=@numero_fenetre(@wind_find(global_mx&,my&)) INT{buf%}=bubblegem_request& ! Num‚ro du message INT{ADD(buf%,2)}=ap_id& ! Indentifiant exp‚diteur INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent message INT{ADD(buf%,6)}=INT{ADD(hwind%,SHL(temp&,1))} ! Handle fenˆtre INT{ADD(buf%,8)}=global_mx& ! Coordonn‚es de la souris INT{ADD(buf%,10)}=global_my& appl_write(ap_id&,16,buf%) ! Envoi du message ENDIF ELSE IF key&=&H314E OR key&=&H316E ' Touche 'N' ou 'n' pour recalculer les normales IF nombre_d_objets&>0 refaire_toutes_les_normales(0,PRED(nombre_d_objets&),TRUE,TRUE) redessin_deja_fait!=FALSE redraw_force(idx_info&,idx_animation&) ENDIF ELSE IF key&=&H276D OR key&=&H274D ' Touche 'M' ou 'm' pour mesurer les distance IF dessin_3d| PROCEDURE evenements_autres ! LOCAL temp&,ob& LOCAL fx&,fy&,fw&,fh& LOCAL fx2&,fy2&,fw2&,fh2& LOCAL px&,py&,dum& LOCAL zx&,zy&,zw&,zh& LOCAL tex_tro&,fin_s%,adr_sr% LOCAL cx,cy,cz,xm&,ym&,minx,miny,maxx,maxy ' ~@wind_get(0,wf_top&,top&,temp&,temp&,temp&) dum&=@numero_fenetre(top&) temp&=@numero_fenetre(@wind_find(global_mx&,global_my&)) ~@wind_get(@wind_find(global_mx&,global_my&),wf_workxywh&,fx&,fy&,fw&,fh&) IF trois_vue! objc_offset(adr_fenetre%,fenvue07&,global_xf&,global_yf&) global_wf&=ADD(OB_W(adr_fenetre%,fenvue07&),OB_W(adr_fenetre%,fenvue27&)) global_hf&=ADD(OB_H(adr_fenetre%,fenvue07&),OB_H(adr_fenetre%,fenvue37&)) ELSE la_fenetre(fenvue07&,global_xf&,global_yf&,global_wf&,global_hf&) ENDIF calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& fx2&=global_xf& fy2&=global_yf& fw2&=global_wf& fh2&=global_hf& dans_quelle_vue(origx&,origy&) IF temp&=idx_outils& ! La souris passe sur les icones outils IF souris|<>100 graf_mouse(fleche&,0) souris|=100 asouris|=souris| ENDIF ob&=@objc_find(adr_outils%,0,7,global_mx&,global_my&) IF ob&=>2 IF ob&<>aob& CHAR{{OB_SPEC(adr_fenetre%,fenvue06&)}}=CHAR{OB_SPEC(adr_messages%,ob&)} redraw_element_fenetre(48,adr_fenetre%,fenvue06&) aob&=ob& ENDIF ENDIF mem_des_3_vue|=vue_de_gauche| ELSE IF temp&=idx_vue& AND RC_INTERSECT(global_mx&,global_my&,1,1,fx&,fy&,fw&,fh&) AND RC_INTERSECT(global_mx&,global_my&,1,1,fx2&,fy2&,fw2&,fh2&) ' La, elle passe dans la zone de dessin de la scŠnes en mode 2D IF (dessin_3d|global_amx& OR global_my&<>global_amy&) IF trois_vue! fen_act&=@objc_find(adr_fenetre%,0,12,global_mx&,global_my&) $S&,$S> SELECT fen_act& CASE fenvue07& dessin_3d|=vue_de_face| IF mem_des_3_vue|<>dessin_3d| position_objet_actif(FALSE) mem_des_3_vue|=dessin_3d| ENDIF CASE fenvue27& dessin_3d|=vue_de_gauche| IF mem_des_3_vue|<>dessin_3d| position_objet_actif(FALSE) mem_des_3_vue|=dessin_3d| ENDIF CASE fenvue37& dessin_3d|=vue_de_dessus| IF mem_des_3_vue|<>dessin_3d| position_objet_actif(FALSE) mem_des_3_vue|=dessin_3d| ENDIF CASE fenvue47& dessin_3d|=vue_en_3d| IF mem_des_3_vue|<>dessin_3d| mem_des_3_vue|=dessin_3d| ENDIF ENDSELECT ELSE fen_act&=fenvue07& ENDIF IF @dans_point_de_control_carreau_inactif<>-1 ' Point de contr“le d'un carreau de B‚zier inactif souris|=10 ELSE IF @dans_point_de_control_carreau_actif<>-1 ' Point de contr“le d'un carreau de B‚zier actif souris|=10 ELSE IF @test_plot_de_taille(INT{deplace%},INT{ADD(deplace%,2)}) AND INT{@adresse_objet(objet_actif&)}<>primitive_triangle& ' En haut … gauche souris|=0 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,4)},INT{ADD(deplace%,6)}) AND INT{@adresse_objet(objet_actif&)}<>primitive_triangle& ' En haut au milieu souris|=5 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,8)},INT{ADD(deplace%,10)}) AND INT{@adresse_objet(objet_actif&)}<>primitive_triangle& ' En haut … droite souris|=1 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,24)},INT{ADD(deplace%,26)}) AND INT{@adresse_objet(objet_actif&)}<>primitive_triangle& ' A gauche au milieu souris|=3 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,32)},INT{ADD(deplace%,34)}) AND INT{@adresse_objet(objet_actif&)}<>primitive_triangle& ' A droite au milieu souris|=3 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,12)},INT{ADD(deplace%,14)}) AND INT{@adresse_objet(objet_actif&)}<>primitive_triangle& ' En bas … gauche souris|=1 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,16)},INT{ADD(deplace%,18)}) AND INT{@adresse_objet(objet_actif&)}<>primitive_triangle& ' En bas au milieu souris|=5 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,20)},INT{ADD(deplace%,22)}) AND INT{@adresse_objet(objet_actif&)}<>primitive_triangle& ' En bas … droite souris|=0 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,28)},INT{ADD(deplace%,30)}) ' Au milieu (D‚placement) souris|=2 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,36)},INT{ADD(deplace%,38)}) AND INT{@adresse_objet(objet_actif&)}<>primitive_triangle& ' Point de contr“le des rotations souris|=4 ELSE cx=SINGLE{camera%} cy=SINGLE{ADD(camera%,4)} cz=SINGLE{ADD(camera%,8)} cherche_dans_vue_2d(cx,cy,cz,20,20,20,xm&,ym&,minx,miny,maxx,maxy) IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy souris|=7 ! Cam‚ra ELSE cx=SINGLE{ADD(camera%,12)} cy=SINGLE{ADD(camera%,16)} cz=SINGLE{ADD(camera%,20)} cherche_dans_vue_2d(cx,cy,cz,13,13,13,xm&,ym&,minx,miny,maxx,maxy) IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy souris|=8 ! Point de vis‚ ELSE souris|=101 ! R‚ticule de base fin_s%=@adresse_source(nombre_de_source&) adr_sr%=source% DO IF BYTE{adr_sr%}=1 sx=ROUND(SINGLE{ADD(adr_sr%,8)},3) sy=ROUND(SINGLE{ADD(adr_sr%,12)},3) sz=ROUND(SINGLE{ADD(adr_sr%,16)},3) cherche_dans_vue_2d(sx,sy,sz,15,15,15,xm&,ym&,minx,miny,maxx,maxy) IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy souris|=6 ! Source lumineuse ENDIF ENDIF EXIT IF souris|<>101 IF BTST(BYTE{ADD(adr_sr%,1)},bit_spot|) sx=ROUND(SINGLE{ADD(adr_sr%,20)},3) sy=ROUND(SINGLE{ADD(adr_sr%,24)},3) sz=ROUND(SINGLE{ADD(adr_sr%,28)},3) cherche_dans_vue_2d(sx,sy,sz,17,17,17,xm&,ym&,minx,miny,maxx,maxy) IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy souris|=9 ! Point de vis‚ ENDIF ENDIF EXIT IF souris|<>101 ADD adr_sr%,taille_source& LOOP WHILE adr_sr%asouris| $S|,$S> SELECT souris| CASE 0 graf_mouse(user_def&,form_mouse%) CASE 1 graf_mouse(user_def&,ADD(form_mouse%,74)) CASE 2 graf_mouse(user_def&,ADD(form_mouse%,148)) CASE 3 graf_mouse(user_def&,ADD(form_mouse%,222)) CASE 4 graf_mouse(user_def&,ADD(form_mouse%,296)) CASE 5 graf_mouse(user_def&,ADD(form_mouse%,370)) CASE 6 graf_mouse(user_def&,ADD(form_mouse%,444)) CASE 7 graf_mouse(user_def&,ADD(form_mouse%,518)) CASE 8 graf_mouse(user_def&,ADD(form_mouse%,592)) CASE 9 graf_mouse(user_def&,ADD(form_mouse%,666)) CASE 10 graf_mouse(user_def&,ADD(form_mouse%,740)) CASE 101 graf_mouse(reticule_mince&,0) ENDSELECT asouris|=souris| ENDIF IF fen_act&<>fenvue47& afficher_coordonnees(FALSE) global_amx&=global_mx& global_amy&=global_my& ENDIF ENDIF ELSE IF souris|<>100 graf_mouse(fleche&,0) souris|=100 asouris|=souris| ENDIF mem_des_3_vue|=vue_de_gauche| ENDIF ' RETURN ' ****************************************************************************** ' **** Gestion du DRAG and DROP (COPIER et COLLER) d'aprŠs les sources GFA **** ' **** de FACE VALUE et aprŠs simplification maximum. **** ' ****************************************************************************** > PROCEDURE recois_drag_drop(ddhandle&,ddx&,ddy&,ddks&,ddid%) LOCAL f_handle%,ddret%,dra_drop! LOCAL ddbbuffer%,dd_msg&,dddonnee% LOCAL ddtype%,ddid_data%,ddfile%,ddsize% LOCAL nom_tmp%,z_tmp%,adresse% ' z_tmp%=@prendre(1552,TRUE,3) adresse%=z_tmp% ' adresse%=SHL(SHR(ADD(z_tmp%,15),4),4) ' nom_tmp%=@zone(512,adresse%) ddbuffer%=@zone(1040,adresse%) ' dra_drop!=FALSE CLR dd_msg& dddonnee%=coord_polygon% ddtype%=mem_num% ddid_data%=mfdb% ddfile%=mfbd% membfill(ddbuffer%,1040,0) membfill(dddonnee%,512,0) membfill(mem_nom%,512,0) membfill(ddtype%,24,0) membfill(ddid_data%,20,0) membfill(ddfile%,20,0) ' CHAR{mem_nom%}="u:\pipe\dragdrop."+CHAR{ddid%}+CHR$(0) IF @s_exist(mem_nom%) f_handle%=@fopen(mem_nom%,gemdos_read_write%) IF f_handle%>0 dd_reply(f_handle%,ddbuffer%,dd_msg&) dd_type_de_donnee(f_handle%,ddbuffer%,dddonnee%) IF @dd_message_entete(f_handle%,ddbuffer%,ddtype%,ddid_data%,ddfile%,ddsize%) IF CHAR{ddtype%}="ARGS" dd_reply(f_handle%,ddbuffer%,dd_msg&) membfill(nom_tmp%,512,0) ddret%=@fread(f_handle%,nom_tmp%,ddsize%) IF ddret%>-1 CHAR{masque%}="ebs"+CHR$(0) ' Extraire le disque du chemin sp‚cifi‚ CHAR{disque%}=LEFT$(CHAR{nom_tmp%},2)+CHR$(0) ' Extraire le chemin proprement dit membfill(path%,272,0) CHAR{path%}=RIGHT$(LEFT$(CHAR{nom_tmp%},RINSTR(CHAR{nom_tmp%},"\")),SUB(LEN(LEFT$(CHAR{nom_tmp%},RINSTR(CHAR{nom_tmp%},"\"))),2))+CHR$(0) ' CHAR{{OB_SPEC(adr_parametres%,cheebs&)}}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%}+CHR$(0) dra_drop!=TRUE ENDIF ENDIF ENDIF ~@fclose(f_handle%) ENDIF ENDIF IF dra_drop! ~@nouvelle_scene(TRUE) bmove(nom_tmp%,titre_en_cours%,512) libere(*z_tmp%) charger_fichier_ebs(TRUE) mise_a_jour_des_chemins_et_nom_de_fichier mise_a_jour_de_l_objet_actif(TRUE) redraw_force(idx_info&,idx_animation&) ELSE libere(*z_tmp%) ENDIF ' RETURN ' > FUNCTION dd_message_entete(f_handle%,ddbuffer%,VAR ddtype%,ddid_data%,ddfile%,ddsize%) LOCAL return%,len% return%=@fread(f_handle%,ddbuffer%,2) ! Lecture taille de l'entˆte IF return%>0 len%=MIN(CARD{ddbuffer%},1024) return%=@fread(f_handle%,ddbuffer%,len%) IF return%>0 {ddtype%}=0 {ADD(ddtype%,4)}=0 BMOVE ddbuffer%,ddtype%,4 ddsize%=LONG{ADD(ddbuffer%,4)} CHAR{ddid_data%}=CHAR{ADD(ddbuffer%,8)}+CHR$(0) CHAR{ddfile%}=CHAR{ADD(ADD(ddbuffer%,8),SUCC(LEN(CHAR{ddid_data%})))}+CHR$(0) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC > PROCEDURE dd_reply(f_handle%,ddbuffer%,flg&) BYTE{ddbuffer%}=flg& ~@fwrite(f_handle%,ddbuffer%,1) RETURN > PROCEDURE dd_type_de_donnee(f_handle%,ddbuffer%,dddonnee%) membfill(dddonnee%,32,0) BMOVE dddonnee%,ddbuffer%,32 ~@fwrite(f_handle%,ddbuffer%,32) RETURN ' ****************************************************************************** ' **** Fonctions disque...Ouverture, Fermeture, Lecture, Ecriture... **** ' ****************************************************************************** > FUNCTION fcreate(name%,attr%) ' RETURN GEMDOS(&H3C,L:name%,attr%) ' ENDFUNC > FUNCTION fopen(name%,mode%) ' RETURN GEMDOS(&H3D,L:name%,mode%) ' ENDFUNC > FUNCTION fclose(handle%) ' RETURN GEMDOS(&H3E,handle%) ' ENDFUNC > FUNCTION fread(handle%,buff%,count%) ' RETURN GEMDOS(&H3F,handle%,L:count%,L:buff%) ' ENDFUNC > FUNCTION fwrite(handle%,buff%,count%) ' RETURN GEMDOS(&H40,handle%,L:count%,L:buff%) ' ENDFUNC > FUNCTION fseek(handle%,offset%,seekmode%) ' RETURN GEMDOS(&H42,L:offset%,handle%,seekmode%) ' ENDFUNC > FUNCTION floc(handle%) LOCAL offset%,seekmode% offset%=0 seekmode%=1 ' RETURN GEMDOS(&H42,L:offset%,handle%,seekmode%) ' ENDFUNC > FUNCTION flof(handle%) LOCAL offset%,seekmode%,retour% offset%=0 seekmode%=2 ' retour%=GEMDOS(&H42,L:offset%,handle%,seekmode%) ~@fseek(handle%,0,0) ' RETURN retour% ENDFUNC ' ********************** Gestion des messages VA_START ************************* > PROCEDURE chargement_par_va_start LOCAL ap_id_prg_appelant& LOCAL adr_nom% ' adr_nom%={ADD(buf%,6)} ap_id_prg_appelant&=INT{ADD(buf%,2)} ' IF adr_nom%>0 ! juste un petite s‚curit‚ ' membfill(titre_en_cours%,512,0) bmove(adr_nom%,titre_en_cours%,LEN(CHAR{adr_nom%})) ' ' on confirme au programme appelant qu'on a r‚cup‚r‚ quelque chose ' INT{buf%}=av_start& ! Num‚ro du message INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur du message INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message {ADD(buf%,6)}=adr_nom% ! Le nom de fichier en question INT{ADD(buf%,8)}=0 ! Le reste est mis … z‚ro pour INT{ADD(buf%,10)}=0 ! ‚viter tout problŠme. INT{ADD(buf%,12)}=0 ! INT{ADD(buf%,14)}=0 ' ! et enfin l'envoie de tout cela. appl_write(ap_id_prg_appelant&,16,buf%) ' ' on r‚cup‚re le nom du fichier ' IF RINSTR(CHAR{titre_en_cours%},"\")=0 CHAR{titre_en_cours%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+CHAR{titre_en_cours%}+CHR$(0) ELSE CHAR{titre_en_cours%}=CHAR{titre_en_cours%}+CHR$(0) ENDIF ' ' et enfin, on charge le fichier pass‚ en paramŠtre. ' charger_fichier_ebs(TRUE) ' ENDIF RETURN ' *********************** Les routines XFORM DO en GFA ************************* ' ****************************************************************************** > FUNCTION xform_do(flags&,address%,count|) LOCAL evnt&,count|,top&,temp&,whandle& ' ' Fonction qui remplace le form_do du GEM permettant la gestion de dialogues ' dans des fenˆtres. ' CLR objet& ! Mise … z‚ro avant de commencer ~@wind_get(0,wf_top&,top&,temp&,temp&,temp&) IF @numero_fenetre(top&)=24 AND count|=255 count|=100 ELSE count|=5 ENDIF DO ! BOUCLE "SANS FIN" ' Surveillance des ‚v‚nements evnt&=@evnt_multi(flags&,258,3,0,0,0,0,1,1,0,0,0,1,1,buf%,count|,global_mx&,global_my&,global_mk&,kbd&,key&,click&) ' ========================================================================== ' ==== EvŠnement clavier ' ========================================================================== IF BTST(evnt&,0) IF @xform_do_clavier(address%,evnt&) RETURN evnt& ENDIF ENDIF ' ========================================================================== ' ==== EvŠnement message ' ========================================================================== IF BTST(evnt&,4) IF @xform_do_message(address%,evnt&) RETURN evnt& ENDIF ENDIF ' ========================================================================== ' ==== EvŠnement souris ' ========================================================================== IF BTST(evnt&,1) IF @xform_do_souris(address%,evnt&) RETURN evnt& ENDIF ENDIF RETURN evnt& ! Toujours retourner l'‚v‚nement LOOP ' ENDFUNC ' .............................................................................. > FUNCTION xform_do_clavier(address%,VAR evnt&) LOCAL xfd_i&,xfd_adr%,xfd_dum&,xfd_top& LOCAL xfd_cha&,xfd_ctr| ' IF address%=adr_desk% ! Si on travaille sur le bureau ~@wind_get(0,wf_top&,xfd_top&,xfd_dum&,xfd_dum&,xfd_dum&) ' Si la fenˆtre formulaire est au 1ø plan xfd_dum&=@numero_fenetre(xfd_top&) IF xfd_dum&<>-1 ' R‚cup‚rer adresse formulaire en fenˆtre xfd_adr%=@arbre_ressource(xfd_dum&) ELSE xfd_adr%=adr_desk% ENDIF ELSE ! Si on travaille sur formulaire xfd_adr%=address% ! R‚cup‚rer adresse formulaire ENDIF ' ........................................................................ ' .... Si ou appuy‚ au clavier ' ........................................................................ IF BYTE(key&)=&HD ' Chercher bouton DEFAULT et s'il y en a un, le s‚lectionner CLR xfd_i& ! En partant de la racine DO IF BTST(OB_FLAGS(xfd_adr%,xfd_i&),aes_default&) ! Si objet DEFAULT objc_offset(xfd_adr%,xfd_i&,xob&,yob&) ! Position de l'objet wob&=OB_W(xfd_adr%,xfd_i&) ! Largeur de l'objet hob&=OB_H(xfd_adr%,xfd_i&) ! Hauteur de l'objet ob_state(xfd_adr%,xfd_i&,aes_selected&,TRUE) ! le s‚lectionner ' Redessiner l'objet objc_draw(xfd_adr%,xfd_i&,12,xob&,yob&,wob&,hob&,-1) objet&=xfd_i& ! Enregistrer l'objet avmx&=global_mx& ! Position de la souris avant avmy&=global_my& ! // // // // // global_mx&=ADD(xob&,DIV(wob&,2)) ! Milieu X de l'objet global_my&=ADD(yob&,DIV(hob&,2)) ! Mileur Y de l'objet set_input_mode(sample&) ! Mode SAMPLE input_locator(global_mx&,global_my&) ! Positionner la souris set_input_mode(request&) ! Retour en mode REQUEST evnt&=2 ! Modifier le type d'‚vŠnement IF edit& ! Si curseur … l'‚cran objc_edit(xfd_adr%,edit&,0,pos&,3,pos&) ! le d‚sactiver CLR edit& ENDIF RETURN TRUE ! Retourner l'‚v‚nement ENDIF EXIT IF BTST(OB_FLAGS(xfd_adr%,xfd_i&),aes_lastob&) INC xfd_i& ! Objet suivant LOOP ' ...................................................................... ' .... L'une des flŠches (avec ou sans … ‚t‚ appuy‚e ' .... sans champ ‚ditable dans le formulaire actif ' ...................................................................... ELSE IF edit&=0 AND (key&=&H11B OR key&=&H4D00 OR key&=&H4B00 OR key&=&H4800 OR key&=&H5000) evnt&=1 RETURN TRUE ' ...................................................................... ' .... Un champ ‚ditable est pr‚sent dans le formulaire actif ' ...................................................................... ELSE IF edit&>0 ' ...................................................................... ' .... FlŠche vers le bas ' ...................................................................... IF key&=&H5000 IF xfd_adr%<>adr_saisie% xfd_cha&=@next(xfd_adr%,edit&) ! Chercher champ suivant ' S'il y en a un et qu'il n'est pas DISABLE IF xfd_cha&>-1 IF NOT BTST(OB_STATE(xfd_adr%,xfd_cha&),aes_disable&) objc_edit(xfd_adr%,edit&,0,pos&,3,pos&) ! D‚sactiver curseur edit&=xfd_cha& ! Nouvel ‚ditable objc_edit(xfd_adr%,edit&,0,pos&,1,pos&) ! R‚activer curseur ENDIF ELSE objc_edit(xfd_adr%,edit&,0,pos&,3,pos&) ! D‚sactiver curseur ENDIF ELSE evnt&=1 RETURN TRUE ENDIF ' .................................................................... ' .... FlŠche vers le haut ' .................................................................... ELSE IF key&=&H4800 IF xfd_adr%<>adr_saisie% xfd_cha&=@prev(xfd_adr%,edit&) ! Chercher champ pr‚c‚dent ' S'il y en a un et qu'il n'est pas DISABLE IF xfd_cha&>-1 IF BTST(OB_STATE(xfd_adr%,xfd_cha&),aes_disable&)=0 objc_edit(xfd_adr%,edit&,0,pos&,3,pos&) ! D‚sactiver curseur edit&=xfd_cha& ! Nouvel ‚ditable objc_edit(xfd_adr%,edit&,0,pos&,1,pos&) ! R‚activer curseur ENDIF ELSE objc_edit(xfd_adr%,edit&,0,pos&,3,pos&) ! D‚sactiver curseur ENDIF ELSE evnt&=1 RETURN TRUE ENDIF ' .................................................................... ' .... Pour toute autre touche, c'est le GEM qui s'occupe de tout ' .................................................................... ELSE objc_edit(xfd_adr%,edit&,key&,pos&,2,pos&) ENDIF ' ...................................................................... ' .... Sinon, on regarde si ce n'est pas un raccourcis des menus ' ...................................................................... ELSE kbd&=BIOS(&HB,-1) ! Etat des touches sp‚ciales kbd&=BCLR(kbd&,4) ! Annuler bit Capslock IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) xfd_ctr|=ASC("") ! enfonc‚e ELSE IF BTST(kbd&,cl_control&) xfd_ctr|=ASC("^") ! enfonc‚e ELSE IF BTST(kbd&,cl_alternate&) xfd_ctr|=ASC("") ! enfonc‚e ELSE ! Sinon CLR xfd_ctr| ! Pas de touche sp‚ciale ENDIF IF xfd_ctr| touc|=@stdkey ! Recherche code Ascii xfd_i&=0 DO ! Pour chaque objet du menu IF OB_TYPE(adr_menu%,xfd_i&)=28 ! Est ce une option de menu CHAR{option%}=TRIM$(CHAR{OB_SPEC(adr_menu%,xfd_i&)}) ! La lire IF (ASC(RIGHT$(CHAR{option%},1))=touc|) AND (ASC(LEFT$(RIGHT$(CHAR{option%},2),1))=xfd_ctr|) ' Si le caractŠre et la touche sp‚ciale correspondent IF NOT (BTST(OB_STATE(adr_menu%,xfd_i&),aes_disable&)) ! Si actif evnt&=16 ! Fabriquer un ‚v‚nement INT{buf%}=10 INT{ADD(buf%,6)}=@m_title(adr_menu%,xfd_i&) ! Titre de l'option INT{ADD(buf%,8)}=xfd_i& ENDIF ENDIF ENDIF EXIT IF BTST(OB_FLAGS(adr_menu%,xfd_i&),aes_lastob&) INC xfd_i& LOOP ENDIF ENDIF RETURN FALSE ENDFUNC > FUNCTION xform_do_message(address%,VAR evnt&) LOCAL obstate&,whandle& ' IF INT{buf%}=wm_topped& ! Le message … envoyer au GEM whandle&=@wind_find(global_mx&,global_my&) ! Fenˆtre cliqu‚e IF @numero_fenetre(whandle&)=1 ! Si "boŒte … outils" obstate&=OB_STATE(adr_outils%,@objc_find(adr_outils%,0,7,global_mx&,global_my&)) IF (NOT BTST(obstate&,wm_xmoved&)) AND (NOT BTST(obstate&,wm_xclosed&) OR BTST(obstate&,wm_xreducted&)) AND (NOT BTST(obstate&,wm_xfulled&)) IF @fenetre_deja_ouverte(@objc_find(adr_outils%,0,7,global_mx&,global_my&)) ' La, on a cliqu‚ sur la "boŒte … outils" non activ‚, mais pas sur ' sur barre de d‚placement...Du coup, on ne l'ative pas, mais on ' la gŠre comme si elle ‚tait active... sympa non ? evnt&=BCLR(evnt&,4) ! Efface l'‚vŠnement MESSAGE evnt&=BSET(evnt&,1) ! Force un ‚vŠnement SOURIS ELSE CLR evnt& RETURN TRUE ENDIF ELSE RETURN TRUE ENDIF ELSE RETURN TRUE ENDIF ELSE RETURN TRUE ENDIF RETURN FALSE ENDFUNC > FUNCTION xform_do_souris(address%,VAR evnt&) LOCAL xfd_adr%,obflags&,obstate& LOCAL whandle&,temp&,xfd_i&,xfd_j& LOCAL nx&,ny&,fx&,fy&,fw&,fh& ' IF address%=adr_desk% ! Si on travaille sur le bureau whandle&=@wind_find(global_mx&,global_my&) ! A t-on cliqu‚ une fenˆtre ? IF whandle&>0 ! Si oui ' +++++++++++++++++++ Chercher le num‚ro de la fenˆtre de premier plan ~@wind_get(0,wf_top&,top&,temp&,temp&,temp&) ' ++++++++++++++ clique sur fenˆtre de 1ø plan ou sur "boŒte … outils" IF whandle&=top& OR @numero_fenetre(whandle&)=1 IF @numero_fenetre(whandle&)=1 temp&=1 ELSE temp&=@numero_fenetre(top&) ENDIF IF temp&<>-1 ' Adresse formulaire en fenˆtre xfd_adr%=@arbre_ressource(temp&) ENDIF ENDIF ENDIF ELSE ! Sinon on travaille sur formulaire xfd_adr%=address% ! Adresse formulaire ENDIF objet&=@objc_find(xfd_adr%,0,7,global_mx&,global_my&) ! Objet cliqu‚ IF objet&>-1 ! Si on a cliqu‚ sur un objet obflags&=OB_FLAGS(xfd_adr%,objet&) ! Noter ob_flags objet obstate&=OB_STATE(xfd_adr%,objet&) ! Noter ob_state objet IF BTST(obstate&,wm_xmenu&) ! Popup de gestion fenˆtre ' IF click&=2 fermer_fenetre(whandle&) IF @numero_fenetre(whandle&)=31 mise_a_la_taille_fenetre_d_anime(FALSE) ENDIF ELSE ob_state(xfd_adr%,objet&,aes_selected&,TRUE) redraw_elem(xfd_adr%,objet&) videsouris ob_state(xfd_adr%,objet&,aes_selected&,FALSE) redraw_elem(xfd_adr%,objet&) IF edit& objc_edit(xfd_adr%,edit&,0,pos&,3,pos&) ! D‚sactiver curseur CLR edit& ENDIF ' mise_en_place_popup(chxhalty&) positionner_popup(-3,objet&,xfd_adr%,adr_popup_divers%,rx&,ry&) temp&=@popup_general(rx&,ry&,adr_popup_divers%,haltyp01&,haltyp02&,0) $S&,$S> SELECT temp& CASE 0 ! R‚duire reduire_fenetre(whandle&) CASE 1 ! Agrandir agrandir_fenetre(whandle&) CASE 2 ! Suivante fenetre_suivante(whandle&) CASE 4 ! Fermer fermer_fenetre(whandle&) IF @numero_fenetre(whandle&)=31 mise_a_la_taille_fenetre_d_anime(FALSE) ENDIF ENDSELECT ENDIF ' RETURN TRUE ELSE IF BTST(obstate&,wm_xclosed&) ! Fermeture de fenˆtre ' ob_state(xfd_adr%,objet&,aes_selected&,TRUE) redraw_elem(xfd_adr%,objet&) videsouris ob_state(xfd_adr%,objet&,aes_selected&,FALSE) redraw_elem(xfd_adr%,objet&) IF edit& objc_edit(xfd_adr%,edit&,0,pos&,3,pos&) ! D‚sactiver curseur CLR edit& ENDIF fermer_fenetre(top&) IF @numero_fenetre(top&)=31 mise_a_la_taille_fenetre_d_anime(FALSE) ENDIF ' RETURN TRUE ELSE IF BTST(obstate&,wm_xmoved&) ! Mouvement de fenˆtre IF click&=2 temp&=INT{ADD(hwind%,SHL(@numero_fenetre(top&),1))} ~@wind_get(temp&,wf_currxywh&,fx&,fy&,fw&,fh&) IF fh&=24 agrandir_fenetre(top&) ELSE reduire_fenetre(top&) ENDIF ELSE ' On s'envoie … soi-mˆme un message de mouvement ~@wind_get(INT{ADD(hwind%,SHL(@numero_fenetre(top&),1))},wf_currxywh&,fx&,fy&,fw&,fh&) graf_dragbox(fw&,fh&,fx&,fy&,global_xb&,global_yb&,ADD(global_wb&,SHL(fw&,1)),ADD(global_hb&,SHL(fw&,1)),nx&,ny&) INT{buf%}=wm_moved& ! Num‚ro du message (mouvement) INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message ' Handle fenˆtre concern‚e INT{ADD(buf%,6)}=INT{ADD(hwind%,SHL(@numero_fenetre(top&),1))} INT{ADD(buf%,8)}=nx& ! Cordonn‚e zone redraw (fenˆtre) INT{ADD(buf%,10)}=ny& INT{ADD(buf%,12)}=fw& INT{ADD(buf%,14)}=fh& appl_write(ap_id&,16,buf%) ! Envoi du message ENDIF RETURN TRUE ELSE IF BTST(obstate&,wm_xreducted&) ! fenˆtre en barre ' ob_state(xfd_adr%,objet&,aes_selected&,TRUE) redraw_elem(xfd_adr%,objet&) videsouris ob_state(xfd_adr%,objet&,aes_selected&,FALSE) redraw_elem(xfd_adr%,objet&) IF edit& objc_edit(xfd_adr%,edit&,0,pos&,3,pos&) ! D‚sactiver curseur CLR edit& ENDIF ' temp&=INT{ADD(hwind%,SHL(@numero_fenetre(top&),1))} ~@wind_get(temp&,wf_currxywh&,fx&,fy&,fw&,fh&) IF fh&=24 agrandir_fenetre(top&) ELSE reduire_fenetre(top&) ENDIF ' RETURN TRUE ELSE IF BTST(obstate&,wm_xfulled&) ! fenˆtre en plein ‚cran ou non ' ob_state(xfd_adr%,objet&,aes_selected&,TRUE) redraw_elem(xfd_adr%,objet&) videsouris ob_state(xfd_adr%,objet&,aes_selected&,FALSE) redraw_elem(xfd_adr%,objet&) ' ' On s'envoie … soi-mˆme un message de redimensionnement INT{buf%}=wm_fulled& ! Num‚ro du message (plein ‚cran) INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message ' Handle fenˆtre concern‚e INT{ADD(buf%,6)}=INT{ADD(hwind%,SHL(@numero_fenetre(top&),1))} INT{ADD(buf%,8)}=fx& ! Cordonn‚e zone redraw (fenˆtre) INT{ADD(buf%,10)}=fy& INT{ADD(buf%,12)}=fw& INT{ADD(buf%,14)}=fh& appl_write(ap_id&,16,buf%) ! Envoi du message RETURN TRUE ENDIF ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ' """" Si l'objet cliqu‚ est d‚j… s‚lectionn‚ => gestion des bascules ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" IF BTST(obstate&,aes_selected&) IF xfd_adr%=adr_lumieres% IF @bouton_lumiere(objet&) CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_parametre_tos2gem% IF @bouton_t2g(objet&) CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_modules% IF objet&<>drivpere& CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_copier% IF @bouton_copie(objet&) CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_calage% IF objet&<>numrefe& CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_predefinie% IF @bouton_couleur(objet&) CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_fenetre% IF @buton_fenetre(objet&) CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_lanceur% IF @bouton_du_lanceur(objet&) CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_parametres% IF objet&<>act_opengl& CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_outils% IF objet&<>izcentre& AND objet&<>iztotal& AND objet&<>iplein& AND objet&<>iimgfond& CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_modifier% IF @bouton_modifier(objet&) CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_fonctions% IF (objet&fnct02&) AND (objet&lte02&) AND objet&<>fnctpere& CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_bicubics% IF (objet&<>fraopt&) CLR evnt& RETURN TRUE ENDIF ELSE IF xfd_adr%=adr_camera% IF objet&<>camfocac& CLR evnt& RETURN TRUE ENDIF ELSE CLR evnt& RETURN TRUE ENDIF ENDIF ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ' "" Si c'est un objet 'DEFAULT' donc fermer la fenˆtre, retirer EDIT& ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" IF BTST(obflags&,aes_default&) IF edit& objc_edit(xfd_adr%,edit&,0,pos&,3,pos&) ! D‚sactiver curseur CLR edit& ENDIF ENDIF ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ' """ Si l'objet est d‚sactiv‚, sortir de suite, il n'y a rien … faire ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" IF BTST(obstate&,aes_disable&) CLR evnt& RETURN TRUE ENDIF ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ' """" Si s‚lectable simple alors on inverse son ‚tat ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" IF ((BTST(obflags&,aes_selectable&)) AND (NOT (BTST(obflags&,aes_rbutton&)))) ob_state(xfd_adr%,objet&,aes_selected&,NOT BTST(OB_STATE(xfd_adr%,objet&),aes_selected&)) IF xfd_adr%=adr_outils% redraw_element_fenetre(2,xfd_adr%,objet&) ELSE redraw_elem(xfd_adr%,objet&) ENDIF ENDIF ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ' """" Si ce n'est pas un TOUCHEXIT ou que l'on clique bouton droit ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" IF (NOT BTST(obflags&,aes_touchexit&)) OR global_mk&=2 OR click&=2 IF global_mk&=2 OR click&=2 IF xfd_adr%<>adr_hierarchie% videsouris global_mk&=2 ENDIF ELSE videsouris ENDIF ENDIF ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ' """" Si c'est un RADIO-BOUTON ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" IF (BTST(obflags&,aes_selectable&)) AND (BTST(obflags&,aes_rbutton&)) AND (NOT (BTST(obstate&,aes_selected&))) xfd_j&=objet& ! Partir de cet objet ob_state(xfd_adr%,objet&,aes_selected&,TRUE) redraw_elem(xfd_adr%,objet&) xfd_i&=@parent(xfd_adr%,xfd_j&) ! Chercher le pŠre xfd_j&=OB_HEAD(xfd_adr%,xfd_i&) ! Partir du 1ø enfant... xfd_i&=OB_TAIL(xfd_adr%,xfd_i&) ! jusqu'au dernier. DO IF (BTST(OB_FLAGS(xfd_adr%,xfd_j&),aes_rbutton&)) AND (xfd_j&<>objet&) AND (BTST(OB_STATE(xfd_adr%,xfd_j&),aes_selected&)) ' ----------Les mettre en normal si RBUTTON sauf l'objet cliqu‚. ob_state(xfd_adr%,xfd_j&,aes_selected&,NOT BTST(OB_STATE(xfd_adr%,xfd_j&),aes_selected&)) redraw_elem(xfd_adr%,xfd_j&) ENDIF xfd_j&=OB_NEXT(xfd_adr%,xfd_j&) ! Au suivant... EXIT IF (xfd_j&>xfd_i&) OR (xfd_j&=-1) LOOP ! jusqu'au dernier. ENDIF ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ' """" Si c'est une zone ‚ditable ' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" IF BTST(obflags&,aes_editable&) IF edit&>0 objc_edit(xfd_adr%,edit&,0,pos&,3,pos&) ! D‚sactiver curseur CLR edit& ENDIF IF BTST(obflags&,aes_selectable&) ob_state(xfd_adr%,objet&,aes_selected&,NOT BTST(OB_STATE(xfd_adr%,objet&),aes_selected&)) IF xfd_adr%=adr_outils% redraw_element_fenetre(2,xfd_adr%,objet&) ELSE redraw_elem(xfd_adr%,objet&) ENDIF ENDIF edit&=objet& ! Nouvel ‚ditable courant objc_edit(xfd_adr%,edit&,0,pos&,1,pos&) ! R‚activer curseur ENDIF ENDIF RETURN FALSE ENDFUNC ' .............................................................................. > FUNCTION parent(adr%,object&) ' Retourne l'objet pŠre d'un objet LOCAL i& i&=object& ! Partir de cet objet WHILE i&>=object& i&=OB_NEXT(adr%,i&) ! Passer au suivant WEND ! Jusqu'au dernier RETURN i& ! Retourner le pŠre ENDFUNC > FUNCTION next(adr%,ed&) ' Chercher l'‚ditable suivant ' Attention : si l'‚ditable, ou l'un de ses pŠres est HIDETREE, ' il ne faut pas le prendre LOCAL pere&,vu&,ob& ' vu&=TRUE ob&=SUCC(ed&) WHILE (NOT (BTST(OB_FLAGS(adr%,ob&),aes_lastob&))) ' Tant qu'on n'est pas au dernier objet pere&=@parent(adr%,ob&) ! Chercher son pŠre ' Si ce n'est pas la racine et pas HIDETREE WHILE ((pere&>0) AND (vu&=TRUE)) ' Si le pŠre est HIDETREE IF BTST(OB_FLAGS(adr%,pere&),aes_hidetree&) vu&=FALSE ! l'objet n'est pas visible ENDIF pere&=@parent(adr%,pere&) ! PŠre suivant WEND IF vu&=TRUE ! Si l'objet est visible IF NOT ((BTST(OB_STATE(adr%,ob&),aes_disable&))) IF NOT ((BTST(OB_FLAGS(adr%,ob&),aes_hidetree&))) IF (BTST(OB_FLAGS(adr%,ob&),aes_editable&)) RETURN ob& ! Retourner son num‚ro ENDIF ENDIF ENDIF ENDIF INC ob& WEND RETURN -1 ! Sinon, -1 ENDFUNC > FUNCTION prev(adr%,ed&) ' Chercher l'‚ditable pr‚c‚dent ' Attention : si l'‚ditable, ou l'un de ses pŠres est HIDETREE, ' il ne faut pas le prendre LOCAL pere&,vu&,ob& ' vu&=TRUE ob&=PRED(ed&) WHILE (ob&>0) ! En arriŠre jusqu'… la racine pere&=@parent(adr%,ob&) ! PŠre de l'objet ' Si ce n'est pas la racine et pas HIDETREE WHILE ((pere&>0) AND (vu&=TRUE)) ' Si le pŠre est HIDETREE IF BTST(OB_FLAGS(adr%,pere&),aes_hidetree&) vu&=FALSE ! L'objet n'est pas visible ENDIF pere&=@parent(adr%,pere&) ! PŠre suivant WEND IF vu&=TRUE ! Si l'objet est visible IF NOT ((BTST(OB_STATE(adr%,ob&),aes_disable&))) IF NOT ((BTST(OB_FLAGS(adr%,ob&),aes_hidetree&))) IF (BTST(OB_FLAGS(adr%,ob&),aes_editable&)) RETURN ob& ! Retourner son num‚ro ENDIF ENDIF ENDIF ENDIF DEC ob& WEND RETURN -1 ! Sinon, -1 ENDFUNC > FUNCTION stdkey LOCAL b% b%=XBIOS(16,L:-1,L:-1,L:-1) RETURN ASC(UPPER$(CHR$(BYTE{{ADD(b%,4)}+BYTE(SHR&(key&,8))}))) ENDFUNC > FUNCTION m_title(adresse%,option&) LOCAL men_&,k& LOCAL pere&,tit& ' men_&=1 k&=3 pere&=@parent(adresse%,option&) WHILE (OB_TYPE(adresse%,k&)<>20) INC k& ! Chercher la 1ø G_BOX WEND WHILE (k&<>pere&) k&=OB_NEXT(adresse%,k&) ! Chercher menu correspondant INC men_& ! Compter les menus WEND k&=3 WHILE ((k&-3)<>men_&) tit&=k& ! L'affecter INC k& WEND RETURN tit& ! Retourner le nø du titre ENDFUNC > FUNCTION bouton_modifier(objet&) $S&,$S> SELECT objet& CASE visuel&,ouvert&,ensmooth&,modtaide&,facinout& RETURN FALSE DEFAULT RETURN TRUE ENDSELECT ENDFUNC > FUNCTION buton_fenetre(objet&) $S&,$S> SELECT objet& CASE fenvue23&,fenvue24&,fenlib_x&,fenlib_y&,fenlib_z& RETURN FALSE DEFAULT RETURN TRUE ENDSELECT ENDFUNC > FUNCTION bouton_du_lanceur(objet&) $S&,$S> SELECT objet& CASE povgene&,povaffi&,povatte&,povater&,antionof&,symbonof& RETURN FALSE CASE povutsl&,povnume&,povlafa&,jittonof&,buffonof&,povcont& RETURN FALSE CASE pov_ul&,pov_uv&,pov_ur&,pov_su&,pov_ua&,povmosai& RETURN FALSE CASE pov_ga&,pov_gd&,pov_gf&,pov_gr&,pov_gs&,pov_gw& RETURN FALSE DEFAULT RETURN TRUE ENDSELECT ENDFUNC > FUNCTION bouton_couleur(objet&) $S&,$S> SELECT objet& CASE ascetein&,ascelumi&,ascesatu&,asceroug& RETURN FALSE CASE ascevert&,ascebleu&,ascetran&,asccol& RETURN FALSE DEFAULT RETURN TRUE ENDSELECT ENDFUNC > FUNCTION bouton_copie(objet&) $S&,$S> SELECT objet& CASE distri0x&,distri0y&,distri0z& RETURN FALSE CASE distri1x&,distri1y&,distri1z& RETURN FALSE DEFAULT RETURN TRUE ENDSELECT ENDFUNC > FUNCTION bouton_lumiere(objet&) $S&,$S> SELECT objet& CASE surfjitt&,surcylin&,suratmos&,surombre&,surinter& RETURN FALSE DEFAULT RETURN TRUE ENDSELECT ENDFUNC > FUNCTION bouton_t2g(objet&) $S&,$S> SELECT objet& CASE t2gclose&,t2gmove&,t2gfulle&,t2gvert&,t2gsize&,t2ghori& RETURN FALSE DEFAULT RETURN TRUE ENDSELECT ENDFUNC ' ------------------------------------------------------------------------------ > PROCEDURE fenetre_suivante(fen&) LOCAL temp&,top&,mem_dum&,suivante& ' ~@wind_get(0,wf_top&,top&,temp&,temp&,temp&) temp&=@numero_fenetre(fen&) mem_dum&=temp& suivante&=-1 DO INC temp& IF temp&<32 ' Regarder si la fenˆtre est ouverte et si elle n'est pas l'active IF INT{ADD(hwind%,SHL(temp&,1))}>0 AND temp&<>mem_dum& ' Si oui, alors, c'est elle que l'on va activer suivante&=temp& ENDIF ' Sinon, on passe … la suivante au prochain tour ELSE ' Si c'‚tait la derniŠre fenˆtre, alors, on reprend … la premiŠre ' De toute fa‡on, il y a toujours plusieurs fenˆtres actives ' en mˆme temps temp&=-1 ENDIF IF temp&=mem_dum& suivante&=mem_dum& ENDIF EXIT IF suivante&=>0 LOOP IF mem_dum&<>suivante& ' On envoie le message de mise en avant de la fenˆtre suivante INT{buf%}=wm_topped& ! Num‚ro du message INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message ' Handle fenˆtre concern‚e INT{ADD(buf%,6)}=INT{ADD(hwind%,SHL(suivante&,1))} INT{ADD(buf%,8)}=global_xb& ! Cordonn‚e zone redraw (bureau) INT{ADD(buf%,10)}=global_yb& INT{ADD(buf%,12)}=global_wb& INT{ADD(buf%,14)}=global_hb& appl_write(ap_id&,16,buf%) ! Envoi du message ENDIF RETURN > PROCEDURE reduire_fenetre(fen&) LOCAL temp&,fx&,fy&,fw&,fh& ' temp&=INT{ADD(hwind%,SHL(@numero_fenetre(fen&),1))} ~@wind_get(temp&,wf_currxywh&,fx&,fy&,fw&,fh&) fh&=24 wind_set(temp&,wf_currxywh&,fx&,fy&,fw&,fh&) ' On s'envoie … soi-mˆme un message de redimensionnement INT{buf%}=wm_redraw& ! Num‚ro du message (redessin) INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message ' Handle fenˆtre concern‚e INT{ADD(buf%,6)}=INT{ADD(hwind%,SHL(@numero_fenetre(whandle&),1))} INT{ADD(buf%,8)}=global_xb& ! Cordonn‚e zone redraw (fenˆtre) INT{ADD(buf%,10)}=global_yb& INT{ADD(buf%,12)}=global_wb& INT{ADD(buf%,14)}=global_hb& appl_write(ap_id&,16,buf%) ! Envoi du message RETURN > PROCEDURE agrandir_fenetre(fen&) LOCAL temp&,fx&,fy&,fw&,fh& ' temp&=INT{ADD(hwind%,SHL(@numero_fenetre(fen&),1))} ~@wind_get(temp&,wf_currxywh&,fx&,fy&,fw&,fh&) fh&=OB_H(@arbre_ressource(@numero_fenetre(fen&)),0) wind_set(temp&,wf_currxywh&,fx&,fy&,fw&,fh&) ' On s'envoie … soi-mˆme un message de redimensionnement INT{buf%}=wm_redraw& ! Num‚ro du message (redessin) INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message ' Handle fenˆtre concern‚e INT{ADD(buf%,6)}=INT{ADD(hwind%,SHL(@numero_fenetre(whandle&),1))} INT{ADD(buf%,8)}=global_xb& ! Cordonn‚e zone redraw (fenˆtre) INT{ADD(buf%,10)}=global_yb& INT{ADD(buf%,12)}=global_wb& INT{ADD(buf%,14)}=global_hb& appl_write(ap_id&,16,buf%) ! Envoi du message RETURN > PROCEDURE fermer_fenetre(fen&) ' INT{buf%}=wm_closed& ! Num‚ro du message INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur message INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message ' Handle fenˆtre concern‚e INT{ADD(buf%,6)}=INT{ADD(hwind%,SHL(@numero_fenetre(fen&),1))} INT{ADD(buf%,8)}=global_xb& ! Cordonn‚e zone redraw (bureau) INT{ADD(buf%,10)}=global_yb& INT{ADD(buf%,12)}=global_wb& INT{ADD(buf%,14)}=global_hb& appl_write(ap_id&,16,buf%) ! Envoi du message RETURN ' ****************************************************************************** > FUNCTION initialisation ! Initialisation du programme LOCAL lar_gou&,hau_gou&,taille_zone%,largeur1%,largeur2%,taille_z_buf% LOCAL x&,y&,w&,h&,duree%,tail%,comm%,taille_totale% LOCAL xw&,yw&,ww&,hw&,v|,univ%,dum&,tm%,atm% LOCAL temp&,i&,j&,i%,taille_forme%,a& LOCAL ro,ve,bl,pr&,adresse%,ofs&,offs% LOCAL adr_sr%,n%,tos%,mem_f!,top&,atop& LOCAL taille%,decalage%,palette_video& LOCAL cfg_lim!,cfg_par!,obspec%,presentex&,presentey& LOCAL mi_x&,mi_y&,adr%,fin_adr%,adr2% LOCAL ex&,ey&,ew&,eh&,adr_presente% LOCAL x_ouv&,y_ouv&,w_ouv&,h_ouv& LOCAL chemin%,icone_couleur! ' init_correct!=FALSE CLR flag_aes_mctrl!,flag_aes_update! ' precalcul%=@prendre(256,FALSE,3) adr%=precalcul% ' adr%=SHL(SHR(ADD(precalcul%,15),4),4) fin_adr%=ADD(adr%,256) DO {adr%}=0 ADD adr%,4 LOOP WHILE adr%640) AND (ymax&>640) haute_resolution!=TRUE ENDIF maxcol&=PRED(INT{ADD(station%,26)}) plan_systeme&=INT{ADD(etendue%,8)} $S&,$S> SELECT plan_systeme& CASE 1,2 ! 2, 4 couleurs mode_entrelace!=TRUE true_color!=FALSE CASE 4,8 ! 16, 256 couleurs mode_entrelace!=TRUE ! Est-ce entrelac‚ ? IF maxcol&=255 mode_entrelace!=@mode_entrelace_256 ELSE IF maxcol&=15 mode_entrelace!=@mode_entrelace_16 ENDIF true_color!=FALSE CASE 15,16,24,32 ! 32768, 65536 ou 16777216 coul. mode_entrelace!=FALSE true_color!=TRUE ENDSELECT ecran%=((SUCC(xmax&)/8)*SUCC(ymax&)*plan_systeme&) taille_preview_ecran%=MUL(600,plan_systeme&) quartecran%=DIV(ecran%,4) physique%=XBIOS(2) lecteur%=GEMDOS(&H19) ' tracer_bios_tab%=0 CLR taille_totale% ADD taille_totale%,4 ! disque_systeme% ADD taille_totale%,128 ! masque% ADD taille_totale%,128 ! msq% ADD taille_totale%,272 ! path_systeme ADD taille_totale%,4 ! disque% ADD taille_totale%,272 ! path% ADD taille_totale%,512 ! a_charger% ADD taille_totale%,512 ! chemin% ADD taille_totale%,512 ! eb_temp% ADD taille_totale%,512 ! mem_nom% ADD taille_totale%,512 ! mem_che% ADD taille_totale%,512 ! titre_en_cours% ADD taille_totale%,1024 ! tr_tmp% ' multitache!=(WORD{{GB+4}+2}<>1) ' adr_chemin_systeme%=@prendre(taille_totale%,TRUE,3) adresse%=adr_chemin_systeme% ' adresse%=SHL(SHR(ADD(adr_chemin_systeme%,15),4),4) ' disque_systeme%=@zone(4,adresse%) ! Le disque systŠme (au lancement) path_systeme%=@zone(272,adresse%) ! Le chemin systŠme (au lancement) disque%=@zone(4,adresse%) ! Le disque de mouvement masque%=@zone(128,adresse%) ! Les masques du s‚lecteur msq%=@zone(128,adresse%) ! Les masque de backup path%=@zone(272,adresse%) ! Le chemin de mouvement a_charger%=@zone(512,adresse%) ! Nom du fichier … charger du SHEL_READ chemin%=@zone(512,adresse%) ! Chemin systŠme dans le SHEL_READ eb_temp%=@zone(512,adresse%) ! Chemin des fichiers de configurations mem_nom%=@zone(512,adresse%) ! M‚moire pour les acc‚s disque mem_che%=@zone(512,adresse%) ! Pour les chemins d'acc‚s disque titre_en_cours%=@zone(512,adresse%) ! Le titre de la scŠne en cours tr_tmp%=@zone(1024,adresse%) ! Pour les trac‚s temporaires ' ' ============================================================================ ' ==== R‚cup‚ration de la ligne de commande (si il y en a une bien sur) ===== ' ==== ===== ' ==== chemin% : le chemin systŠme si tous s'est bien pass‚ ===== ' ==== Merci … Eric REBOUX pour l'info sur ce paramŠtre du SHELL_READ ===== ' ==== ===== ' ==== a_charger% : Le nom du fichier … charger ===== ' ==== ===== ' ============================================================================ lire_la_ligne_de_commande(chemin%,a_charger%) ' ============================================================================ ' ==== V‚rifier la validit‚e du chemin systŠme. En cas de problŠme, ===== ' ==== essayer par les fonctions GEMDOS (DGETDRV et DGETPATH) ===== ' ==== ===== ' ==== Si rien ne va, on arrˆte l… et on pr‚vient du problŠme de chemin ===== ' ============================================================================ CHAR{path%}=LEFT$(CHAR{chemin%},RINSTR(CHAR{chemin%},"\"))+"sys\rsc\verif.dat"+CHR$(0) IF @s_exist(path%) CHAR{disque_systeme%}=LEFT$(CHAR{chemin%},2)+CHR$(0) bmove(ADD(chemin%,2),chemin%,510) CHAR{path_systeme%}=LEFT$(CHAR{chemin%},RINSTR(CHAR{chemin%},"\"))+CHR$(0) ELSE CHAR{disque_systeme%}=CHR$(ADD(65,lecteur%))+":"+CHR$(0) ~GEMDOS(&H47,L:path_systeme%,0) CHAR{path_systeme%}=CHAR{path_systeme%}+"\"+CHR$(0) ENDIF CHAR{path%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\rsc\verif.dat"+CHR$(0) IF NOT @s_exist(path%) CHAR{path%}="[3][|Chemin systŠme non d‚fini|System path not defined ][ Annule|Cancel ]"+CHR$(0) ~@afficher_alerte(path%) RETURN FALSE ENDIF minuscule(disque_systeme%) IF multitache! lecteur%=SUB(ASC(CHAR{disque_systeme%}),97) ELSE lecteur%=SUB(ASC(CHAR{disque_systeme%}),65) ENDIF minuscule(path_systeme%) ' ' ============================================================================ CLR fond%,largeur_fond%,hauteur_fond%,nombre_de_source& CLR presente%,largeur_presente&,hauteur_presente& CLR auteur%,largeur_auteur&,hauteur_auteur&,mesa_gl! CLR roue%,largeur_roue&,hauteur_roue&,flag_creation_eb_temp! CLR deg_gris%,largeur_deg_gris&,hauteur_deg_gris& CLR degigris%,largeur_degigris&,hauteur_degigris& CLR deg_roug%,largeur_deg_roug&,hauteur_deg_roug& CLR deg_vert%,largeur_deg_vert&,hauteur_deg_vert& CLR deg_bleu%,largeur_deg_bleu&,hauteur_deg_bleu& ' ' ! Recherche le disque contenant EB_TEMP. chemin_eb_temp ! Demander un lecteur en cas d'absence flag_creation_eb_temp!=FALSE IF CHAR{eb_temp%}="VIDE" ! par ouverture du selecteur. IF @demande_chemin_eb_temp flag_creation_eb_temp!=TRUE creation_repertoire_eb_temp ELSE CHAR{tr_tmp%}="[1][" ! Pr‚venir qu'il faut obligatoirement un chemin. CHAR{tr_tmp%}=CHAR{tr_tmp%}+" Chemin pour EB_TEMP |" CHAR{tr_tmp%}=CHAR{tr_tmp%}+" obligatoire. Recommencez!|" CHAR{tr_tmp%}=CHAR{tr_tmp%}+" EB_TEMP path needed. |" CHAR{tr_tmp%}=CHAR{tr_tmp%}+" Another time ! |" CHAR{tr_tmp%}=CHAR{tr_tmp%}+"][ Merci | Thank ]"+CHR$(0) ~@afficher_alerte(tr_tmp%) RETURN FALSE ENDIF ENDIF ' chemin_systeme ! Forcer le chemin systŠme de EB Model 3 ' ' ============================================================================ ' === Pour afficher les ic“nes couleurs sur TT ou STf/STe === ' === et par la mˆme ˆtre compatible avec cette salet‚ de FALCON !!! === ' === Uniquement si l'on n'est pas sous MagiC!, GENEVA ou N_AES === ' === qui eux gŠrent trŠs bien les gros ressources couleurs... === ' === De mˆme, si l'AES est inf‚rieur ou ‚gale … 2.06, il ne faut pas === ' === la routine sous peine de planter sous le ‚mulateurs PC Shareware. === ' === Et bien s–r, en monochrome et 4 couleurs la routine est inutile. === ' ============================================================================ r_resident!=FALSE IF plan_systeme&>2 ! Si plus de 4 couleurs IF NOT mode_myaes! ! Si pas MyAES IF NOT magic! ! Si pas MagiC! IF NOT geneva! ! Si pas Geneva IF NOT mode_naes! ! Si pas N_AES IF WORD{{ADD(GB,4)}}<&H340 ! Si AES<3.40 IF WORD{{ADD(GB,4)}}>&H206 ! Si AES>2.06 IF @chargement_des_routines_xrsrc ! Alors OK xrsrc_init ! On charge les routines ENDIF ! ASM venant de ENDIF ! INTERFACE pour ENDIF ! afficher les ic“nes ENDIF ! couleures. ENDIF ENDIF ENDIF ENDIF icone_couleur!=FALSE IF plan_systeme&>2 AND (r_resident! OR mode_myaes! OR magic! OR geneva! OR mode_naes! OR WORD{{ADD(GB,4)}}>&H339) icone_couleur!=TRUE ENDIF ' ---------------------------------------------------------------------------- CHAR{disque%}=CHAR{disque_systeme%}+CHR$(0) CHAR{path%}=CHAR{path_systeme%}+CHR$(0) ' ' ============================================================================ ' ==== Charger la limite d'objets ==== ' ============================================================================ lire_limite_par_defaut pas_grille&=20 CLR taille_son_glop%,taille_son_youpi%,son_actif! ' ' ============================================================================ ' ==== Les images utiles … l'interface ==== ' ============================================================================ largeur_fond%=SUCC(xmax&) hauteur_fond%=SUCC(ymax&) taille_fond%=MUL(MUL(SHR(largeur_fond%,3),hauteur_fond%),plan_systeme&) ' ' ============================================================================ ' ==== Faire tout les MALLOC n‚cessaires au bon fonctionnement du programme == ' ============================================================================ reservation_memoire ' ' ............................................................................ ' .... Ensuite, on recopie la zone contenant le fichier … charger dans .... ' .... la zone pr‚vue … cet effet. .... ' .... et on rempli les diff‚rents champs ASCII pr‚-d‚finis .... ' ............................................................................ bmove(a_charger%,titre_en_cours%,512) ' ' INLINE load_img%,294 INLINE img_asm%,372 ' INLINE char_img%,326 ' focale&=400 ' ' ============================================================================ ' ==== Remplissage des zones XtendTOS par defaut. == ' ============================================================================ tracer_par_defaut ' ' ============================================================================ ' ==== D‚finition des diff‚rentes formes de souris utilis‚es. ====== ' ============================================================================ definition_des_souris ' ' ============================================================================ ' === Sauvegarder la palette systŠme et installer une palette === ' === systŠme propre au programme si l'option "PALETTE SYSTEME" le demande === ' ============================================================================ sauvegarde_palette_systeme ' ** IF NOT true_color! charger_les_trames ENDIF ' ============================================================================ ' ==== Chargement avec conversion format ‚cran des images utilies ==== ' ============================================================================ charger_images_utiles ' ============================================================================ ' ============ Allez, on affiche une belle image pour la pr‚sentation ======== ' ============================================================================ mem_f!=fond_img! fond_img!=FALSE CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\presente.rsc"+CHR$(0) pr&=-1 IF @xrsrc_load(mem_che%)<>0 ~@xrsrc_gaddr(0,0,adr_presente%) ' x&=SUB(SHR(xmax&,1),SHR(largeur_presente&,1)) y&=SUB(SHR(ymax&,1),SHR(hauteur_presente&,1)) w&=largeur_presente& h&=hauteur_presente& ' ww&=OB_W(adr_presente%,2) hw&=OB_H(adr_presente%,2) pr&=@wind_create(0,SUB(x&,2),SUB(y&,2),ADD(w&,4),ADD(ADD(h&,hw&),24)) wind_open(pr&,SUB(x&,2),SUB(y&,2),ADD(w&,4),ADD(ADD(h&,hw&),24)) ' logo_eb3_vers_ecran(x&,y&,w&,h&) ' OB_X(adr_presente%,0)=x& ' OB_Y(adr_presente%,0)=ADD(ADD(y&,h&),3) OB_Y(adr_presente%,0)=ADD(y&,h&) ' objc_draw(adr_presente%,0,12,x&,SUB(ADD(y&,h&),hw&),ww&,hw&,-1) objc_offset(adr_presente%,1,presentex&,presentey&) ' ADD presentey&,OB_H(adr_presente%,1) ~@xrsrc_free garbage_collector ENDIF fond_img!=mem_f! ' ' ============================================================================ ' ==== Eliminer les fichiers temporaires qui sont rest‚s par m‚garde ==== ' ============================================================================ elimination_des_temporaires effacer_fichiers_csg(TRUE) ' mon_aespb%={ADD(GB,4)} ! _GemParBlk.global ' open_gl!=FALSE IF ldg_gl%>0 ! Cookie LDG trouv‚ on cherche TINY_GL open_gl!=@activation_de_mesa_gl ENDIF ' IF NOT @chargement_des_ressources(pr&,presentex&,presentey&) RETURN FALSE ENDIF ' IF open_gl! ob_state(adr_popup_divers%,faces02&,aes_disable&,TRUE) ENDIF ' **************************************************************************** ' **** Un peu de m‚moire pour les routines de GOURAUD et PHONG **** ' **************************************************************************** OB_W(adr_vue_fine%,gourphon&)=SHL(SHR(OB_W(adr_vue_fine%,gourphon&),2),2) IF pr& CHAR{mem_nom%}=" Initialisation du systŠme... "+CHR$(0) ligne_d_init(presentex&,presentey&) ENDIF IF NOT utilise_opengl! lar_gou&=OB_W(adr_vue_fine%,gourphon&) ! Largeur de la fenˆtre hau_gou&=OB_H(adr_vue_fine%,gourphon&) ! Hauteur de la fenˆtre taille_z_buf%=MUL(hau_gou&,SHL(lar_gou&,2)) largeur1%=SHL(lar_gou&,1) ! * 2 largeur2%=SHL(lar_gou&,2) ! * 4 ' taille_zone%=largeur1%+MUL(largeur2%,6)+224+taille_z_buf% ' IF taille_zone%0 les_outils%=@prendre(MUL(modules_outils&,10),TRUE,3) CLR i& ~GEMDOS(&H1A,L:BASEPAGE+128) e%=GEMDOS(&H4E,L:mem_che%,&X110001) DO UNTIL e% n%=LEN(CHAR{BASEPAGE+158}) CHAR{ADD(les_outils%,MUL(i&,10))}=LEFT$(CHAR{BASEPAGE+158},SUB(n%,4)) INC i& e%=GEMDOS(&H4F) LOOP ENDIF CLR modules_de_sauvegarde&,debut_liste_module& IF pr& CHAR{mem_nom%}=" Chargement des modules d'exportation "+CHR$(0) ligne_d_init(presentex&,presentey&) ENDIF CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"modules\sau*.drv"+CHR$(0) pdomain(1) ~GEMDOS(&H1A,L:BASEPAGE+128) e%=GEMDOS(&H4E,L:mem_che%,&X110001) DO UNTIL e% INC modules_de_sauvegarde& e%=GEMDOS(&H4F) LOOP IF modules_de_sauvegarde&>0 les_modules%=@prendre(MUL(modules_de_sauvegarde&,10),TRUE,3) CLR i& ~GEMDOS(&H1A,L:BASEPAGE+128) e%=GEMDOS(&H4E,L:mem_che%,&X110001) DO UNTIL e% n%=LEN(CHAR{BASEPAGE+158}) CHAR{ADD(les_modules%,MUL(i&,10))}=LEFT$(CHAR{BASEPAGE+158},SUB(n%,4)) INC i& e%=GEMDOS(&H4F) LOOP ENDIF CLR modules_d_importation&,debut_liste_import& IF pr& CHAR{mem_nom%}=" Chargement des modules d'importation "+CHR$(0) ligne_d_init(presentex&,presentey&) ENDIF CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"modules\imp*.drv"+CHR$(0) pdomain(1) ~GEMDOS(&H1A,L:BASEPAGE+128) e%=GEMDOS(&H4E,L:mem_che%,&X110001) DO UNTIL e% INC modules_d_importation& e%=GEMDOS(&H4F) LOOP IF modules_d_importation&>0 les_imports%=@prendre(MUL(modules_d_importation&,10),TRUE,3) CLR i& ~GEMDOS(&H1A,L:BASEPAGE+128) e%=GEMDOS(&H4E,L:mem_che%,&X110001) DO UNTIL e% n%=LEN(CHAR{BASEPAGE+158}) CHAR{ADD(les_imports%,MUL(i&,10))}=LEFT$(CHAR{BASEPAGE+158},SUB(n%,4)) INC i& e%=GEMDOS(&H4F) LOOP ENDIF IF pr&>-1 wind_close(pr&) wind_delete(pr&) ENDIF ' CLR adr_desk% menu_bar(adr_menu%,1) ! Afficher le menu ~@wind_get(0,wf_workxywh&,global_xb&,global_yb&,global_wb&,global_hb&) ! Coordonn‚es du bureau graf_mouse(fleche&,0) wind_calc(1,&X0,global_xb&,global_yb&,global_wb&,global_hb&,x&,y&,w&,h&) OB_X(adr_outils%,0)=x& OB_Y(adr_outils%,0)=y& segment boite(100) sphere prisme membfill(univers%,36,0) triangle(univers%) tronc_de_cone(50) hemisphere boite_arrondi(20) disque(0) ' pyramide colonne plan tore(80,0,360) boite_d_activation objet_projecteur objet_camera points_des_carreaux CLR avance% CLR rotationx,rotationy,rotationz CLR rotationx_cam,rotationy_cam,rotationz_cam fen_act&=fenvue07& select_module&=driv0& select_import&=driv0& select_outils&=driv0& avmx&=-1 avmy&=-1 CLR point_des_formes& optimisation!=FALSE flags_effacement!=FALSE flags_masquage!=FALSE flags_blobs!=FALSE grille!=TRUE grille_vue!=FALSE calcul!=FALSE raster_copier!=FALSE centrage_auto!=FALSE total_auto!=FALSE ful!=FALSE tri_3d!=FALSE tri_2d!=FALSE tri_fi!=FALSE mod_cal!=FALSE redimention!=FALSE echelle_ensemble!=FALSE trait!=FALSE face_pleine!=FALSE CLR face_maximum% modif_bez!=FALSE modif_csg!=FALSE modif_quart!=FALSE modif_quadr!=FALSE INT{ADD(camera%,28)}=focale& mem_focale&=focale& CLR a_px,a_py,a_pz,a_tx,a_ty,a_tz,a_rx,a_ry,a_rz,a_cou&,a_cal&,a_blob CLR z_correctionx%,z_correctiony%,version_charge CLR zone_mem_anim!,mem_univ% CLR nombre_d_objets&,objet_actif&,mem_des_3_vue| CLR pere_actif&,fils_actif&,debut_liste_csg&,debut_liste_eff& CLR source_active&,debut_popup_choix&,visible%,compteur_csg&,calque_actif| CLR debut_popup_plusieurs& CLR zone_dessin_2dfi%,zone_dessin_3d%,zone_index% CLR taille_zone_2dfi%,taille_zone_3d%,param_3d% CLR debut_popup_lum&,buffer_r%,buffer_v%,buffer_b% CLR deplacement_en_x&,deplacement_en_y&,deplacement_en_z& CLR taille_transfert% CLR nombre_de_carreaux%,nombre_extrude%,nombre_de_csg% ' ============================================================================ ' Zone de m‚morisation des redessins en 2D ' 4 octets pour l'adresse des paramŠtres (autant que de d'objets) ' 12 octets pour les points (x1,y1 x2,y2 x3,y3) taille_zone_2dfi%=16 ! 4+12 redessins en 2D/3D filaire ' ============================================================================ ' Zone de m‚moristion des redessins en 3D faces cach‚es ' 4 octets pour le nombre de faces une seule fois ' 4 octets pour l'adresse des paramŠtres (autant que de d'objets) taille_zone_3d%=16 ! 4+12 redessins en 3D cach‚es ' ============================================================================ ' Zone de m‚morisation pour le tri des faces sur Z ' 4 octets pour la valeurs moyenne sur Z par face ' 2 octets pour le num‚ro de l'objet ' 4 octets pour l'adresse de la face ' 12 octets pour le premier point en 3D ' 12 octets pour le second point en 3D ' 12 octets pour le troisiŠme point en 3D taille_zone_ttf%=48 ' ============================================================================ primitive&=13 modif_normale!=FALSE ' ------ Mise en forme des fichiers OVL pour la version de P.O.V. 3.10 ------- mise_a_jour_ovl_texture ' ---------------------------------------------------------------------------- membfill(ADD(camera%,52),taille_normal&,0) BYTE{ADD(ADD(camera%,52),2)}=24 CLR debut_texture&,debut_couleur&,debut_pigment&,debut_normal&,debut_finish& CLR debut_interior&,debut_color_map&,debut_texture_map&,debut_pigment_map& CLR debut_normal_map&,debut_warp&,debut_projection&,debut_atmosphere& CLR debut_slop_map&,debut_media&,debut_scattering&,debut_density& CLR debut_density_map& libere(*include_density_map%) ! 17 libere(*include_density%) ! 16 libere(*include_scattering%) ! 15 libere(*include_media%) ! 14 libere(*include_slop_map%) ! 13 libere(*include_atmosphere%) ! 12 libere(*include_projection%) ! 11 libere(*include_warp%) ! 10 libere(*include_normal_map%) ! 9 libere(*include_pigment_map%) ! 8 libere(*include_texture_map%) ! 7 libere(*include_color_map%) ! 6 libere(*include_interior%) ! 5 libere(*include_finish%) ! 4 libere(*include_normal%) ! 3 libere(*include_pigment%) ! 2 libere(*include_couleur%) ! 1 libere(*include_texture%) ! 0 ' 0- Chargement des textures pr‚d‚finies, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_textu.idx"+CHR$(0) include_texture%=@lire_table_d_index(total_texture&) ' ' 1- Chargement des couleurs pr‚d‚finies, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_coule.idx"+CHR$(0) include_couleur%=@lire_table_d_index(total_couleur&) ' ' 2- Chargement des pigments pr‚d‚finis, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_pigme.idx"+CHR$(0) include_pigment%=@lire_table_d_index(total_pigment&) ' ' 3- Chargement des normals pr‚d‚finis, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_norma.idx"+CHR$(0) include_normal%=@lire_table_d_index(total_normal&) ' ' 4- Chargement des finish pr‚d‚finis, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_finis.idx"+CHR$(0) include_finish%=@lire_table_d_index(total_finish&) ' ' 5- Chargement des interior pr‚d‚finis, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_inter.idx"+CHR$(0) include_interior%=@lire_table_d_index(total_interior&) ' ' 6- Chargement des Color_map pr‚d‚finies, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_c_map.idx"+CHR$(0) include_color_map%=@lire_table_d_index(total_color_map&) ' ' 7- Chargement des Texture_map pr‚d‚finies, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_t_map.idx"+CHR$(0) include_texture_map%=@lire_table_d_index(total_texture_map&) ' ' 8- Chargement des Pigment_map pr‚d‚finies, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_p_map.idx"+CHR$(0) include_pigment_map%=@lire_table_d_index(total_pigment_map&) ' ' 9- Chargement des Normal_map pr‚d‚finies, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_n_map.idx"+CHR$(0) include_normal_map%=@lire_table_d_index(total_normal_map&) ' ' 10- Chargement des Warps pr‚d‚finies, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_warps.idx"+CHR$(0) include_warps%=@lire_table_d_index(total_warps&) ' ' 11- Chargement des Projection pr‚d‚finies, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_proje.idx"+CHR$(0) include_projection%=@lire_table_d_index(total_projection&) ' ' 12- Chargement des AtmosphŠres pr‚d‚finies, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_atmos.idx"+CHR$(0) include_atmosphere%=@lire_table_d_index(total_atmosphere&) ' ' 13- Chargement des Slop maps pr‚d‚finis, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_s_map.idx"+CHR$(0) include_slop_map%=@lire_table_d_index(total_slop_map&) ' ' 14- Chargement des Media pr‚d‚finis, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_media.idx"+CHR$(0) include_media%=@lire_table_d_index(total_media&) ' ' 15- Chargement des Scattering pr‚d‚finis, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_scatt.idx"+CHR$(0) include_scattering%=@lire_table_d_index(total_scattering&) ' ' 16- Chargement des density pr‚d‚finis, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_densi.idx"+CHR$(0) include_density%=@lire_table_d_index(total_density&) ' ' 17- Chargement des Density maps pr‚d‚finis, si il y en a bien sur ! CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_d_map.idx"+CHR$(0) include_density_map%=@lire_table_d_index(total_density_map&) ' ********************************************* Initialiser les tables d'index init_table_d_index(include_texture%,total_texture&) ! 0 init_table_d_index(include_couleur%,total_couleur&) ! 1 init_table_d_index(include_pigment%,total_pigment&) ! 2 init_table_d_index(include_normal%,total_normal&) ! 3 init_table_d_index(include_finish%,total_finish&) ! 4 init_table_d_index(include_interior%,total_interior&) ! 5 init_table_d_index(include_color_map%,total_color_map&) ! 6 init_table_d_index(include_texture_map%,total_texture_map&) ! 7 init_table_d_index(include_pigment_map%,total_pigment_map&) ! 8 init_table_d_index(include_normal_map%,total_normal_map&) ! 9 init_table_d_index(include_warps%,total_warps&) ! 10 init_table_d_index(include_projection%,total_projection&) ! 11 init_table_d_index(include_atmosphere%,total_atmosphere&) ! 12 init_table_d_index(include_slop_map%,total_slop_map&) ! 13 init_table_d_index(include_media%,total_media&) ! 14 init_table_d_index(include_scattering%,total_scattering&) ! 15 init_table_d_index(include_density%,total_density&) ! 16 init_table_d_index(include_density_map%,total_density_map&) ! 17 INT{memoire_modifier%}=OB_W(adr_modifier%,0) ! Premier fond INT{ADD(memoire_modifier%,2)}=OB_W(adr_modifier%,1) ! Second fond INT{ADD(memoire_modifier%,4)}=OB_W(adr_modifier%,2) ! Barre de d‚placement INT{ADD(memoire_modifier%,6)}=OB_X(adr_modifier%,5) ! Icone en barre INT{ADD(memoire_modifier%,8)}=OB_X(adr_modifier%,fermpale&) ! Ic“ne voir CHAR{mem_che%}=CHAR{eb_temp%}+"\6_scenes.mem"+CHR$(0) IF @s_exist(mem_che%) charger_6_dernieres_scenes ELSE {OB_SPEC(adr_popup_divers%,ancsce01&)}=OB_SPEC(adr_divers%,nbiman&) {OB_SPEC(adr_popup_divers%,SUCC(ancsce01&))}=OB_SPEC(adr_divers%,nbiman&) {OB_SPEC(adr_popup_divers%,ADD(ancsce01&,2))}=OB_SPEC(adr_divers%,nbiman&) {OB_SPEC(adr_popup_divers%,ADD(ancsce01&,3))}=OB_SPEC(adr_divers%,nbiman&) {OB_SPEC(adr_popup_divers%,ADD(ancsce01&,4))}=OB_SPEC(adr_divers%,nbiman&) {OB_SPEC(adr_popup_divers%,ancsce02&)}=OB_SPEC(adr_divers%,nbiman&) CHAR{memoire_scenes%}=CHAR{{OB_SPEC(adr_popup_divers%,ancsce01&)}} CHAR{ADD(memoire_scenes%,512)}=CHAR{{OB_SPEC(adr_popup_divers%,SUCC(ancsce01&))}} CHAR{ADD(memoire_scenes%,1024)}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(ancsce01&,2))}} CHAR{ADD(memoire_scenes%,1536)}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(ancsce01&,3))}} CHAR{ADD(memoire_scenes%,2048)}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(ancsce01&,4))}} CHAR{ADD(memoire_scenes%,2560)}=CHAR{{OB_SPEC(adr_popup_divers%,ancsce02&)}} ENDIF scene_vide mise_a_la_taille_fenetre_de_vue lire_parametrage_par_defaut minuscule(titre_en_cours%) IF BYTE{titre_en_cours%}>0 ' L…, on d‚cale la ligne de commande de 1 caractŠre vers la gauche pour ' ‚liminer le premier qui indique la longueur de la ligne et dont nous ' n'avons vraiment strictement rien … f...faire. bmove(SUCC(titre_en_cours%),titre_en_cours%,510) ' Extraire le disque du chemin sp‚cifi‚ CHAR{disque%}=LEFT$(CHAR{titre_en_cours%},2) ' Extraire le chemin proprement dit CHAR{path%}=RIGHT$(LEFT$(CHAR{titre_en_cours%},RINSTR(CHAR{titre_en_cours%},"\")),SUB(LEN(LEFT$(CHAR{titre_en_cours%},RINSTR(CHAR{titre_en_cours%},"\"))),2))+CHR$(0) CHAR{masque%}="ebs"+CHR$(0) CHAR{{OB_SPEC(adr_parametres%,cheebs&)}}=CHAR{disque%}+CHAR{path%}+CHAR{masque%} extend(titre_en_cours%,masque%,titre_en_cours%) IF @s_exist(titre_en_cours%) IF @alerte_session_precedente=1 charger_fichier_ebs(TRUE) mise_a_jour_des_chemins_et_nom_de_fichier ELSE ~@nouvelle_scene(TRUE) ENDIF demarquer_les_menus marquer_les_menus ELSE CHAR{titre_en_cours%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"*.ebs"+CHR$(0) minuscule(titre_en_cours%) IF cfg_lim! AND cfg_par! CHAR{mem_che%}=CHAR{eb_temp%}+"\en_cours.prj"+CHR$(0) IF @s_exist(mem_che%) charger_derniere_session ENDIF ENDIF ENDIF ELSE CHAR{titre_en_cours%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"*.ebs"+CHR$(0) minuscule(titre_en_cours%) IF cfg_lim! AND cfg_par! CHAR{mem_che%}=CHAR{eb_temp%}+"\en_cours.prj"+CHR$(0) IF @s_exist(mem_che%) charger_derniere_session ENDIF ENDIF ENDIF mem_f!=FALSE CHAR{mem_che%}=CHAR{eb_temp%}+"\environn.cfg"+CHR$(0) IF @s_exist(mem_che%) charger_l_envirronnement IF temps_des_calcul! AND fl_timer! ouvrir_temps_passe ENDIF ELSE 2d_3d ouvrir_outils ouvrir_fenetre_de_vue(-1,-1,-1,-1) IF temps_des_calcul! AND fl_timer! ouvrir_temps_passe ENDIF ENDIF demarquer_les_menus marquer_les_menus IF (NOT cfg_lim!) OR (NOT cfg_par!) ~@afficher_alerte(adr_ficinclu%) ouvrir_parametrages ENDIF desactiver_fenetre objet_suivant RETURN TRUE ENDFUNC > PROCEDURE tracer_par_defaut ! Remplir les zones par defaut pour le trac‚ ' ' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ' //////////////////////////////////////////////////////////////////////////// ' Preparation de tous les champs de trac‚ ' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ' //////////////////////////////////////////////////////////////////////////// ' -------------------- Table de trac‚ ---------------------------------------- {ADD(tracer_trace_tab%,16)}=0 ! Adresse des points … tracer ABSOLUTE global_xf&,ADD(tracer_trace_tab%,20) ! \ ABSOLUTE global_xf2&,ADD(tracer_trace_tab%,22) ! \ Coordonn‚es de clipping ABSOLUTE global_yf&,ADD(tracer_trace_tab%,24) ! / ABSOLUTE global_yf2&,ADD(tracer_trace_tab%,26) ! / INT{ADD(tracer_trace_tab%,28)}=1 ! VDI/XBIOS on {ADD(tracer_trace_tab%,30)}=0 ! Adresse de l'‚cran ' -------------------- Zone de projection 2D -------------------------------- {ADD(tracer_proj2d%,16)}=0 ! Adresse source {ADD(tracer_proj2d%,20)}=0 ! Adresse destination {ADD(tracer_proj2d%,24)}=zoo% ! Adresse zooms {ADD(tracer_proj2d%,28)}=0 ! Type de vue 2D {ADD(tracer_proj2d%,32)}=0 ! Miy {ADD(tracer_proj2d%,36)}=0 ! Mix {ADD(tracer_proj2d%,40)}=10 ! Pr‚cision de 2^N (1/1024 Šme) ' -------------------- Zone de projection 3D --------------------------------- {ADD(tracer_proj3d%,16)}=0 ! Adresse source {ADD(tracer_proj3d%,20)}=0 ! Adresse destination {ADD(tracer_proj3d%,24)}=zoo% ! Adresse des zooms {ADD(tracer_proj3d%,28)}=SHL(focale&,10) ! Focale {ADD(tracer_proj3d%,32)}=SHL(focale&,10) ! Focale {ADD(tracer_proj3d%,36)}=0 ! Miy {ADD(tracer_proj3d%,40)}=0 ! Mix {ADD(tracer_proj3d%,44)}=10 ! Pr‚cision de 2^N (1/1024 Šme) ' -------------------- Zone de calcul matricielle ---------------------------- {ADD(tracer_rotattrans%,16)}=matrice% ! Adresse de la matrice {ADD(tracer_rotattrans%,20)}=transfert% ! Adresse source {ADD(tracer_rotattrans%,24)}=transfert% ! Adresse destination {ADD(tracer_rotattrans%,28)}=1024 ! Pr‚ multiplicateur {ADD(tracer_rotattrans%,32)}=0 ! Nombre de points {ADD(tracer_rotattrans%,36)}=0 ! \ {ADD(tracer_rotattrans%,40)}=0 ! > Coordonn‚es de translation {ADD(tracer_rotattrans%,44)}=0 ! / ' -------------------- Zone de calcul matricielle ---------------------------- {ADD(tracer_transrotat%,16)}=matrice_cam% ! Adresse de la matrice {ADD(tracer_transrotat%,20)}=transfert% ! Adresse source {ADD(tracer_transrotat%,24)}=transfert% ! Adresse destination {ADD(tracer_transrotat%,28)}=1024 ! Pr‚ multiplicateur {ADD(tracer_transrotat%,32)}=0 ! Nombre de points {ADD(tracer_transrotat%,36)}=0 ! \ {ADD(tracer_transrotat%,40)}=0 ! > Coordonn‚es de translation {ADD(tracer_transrotat%,44)}=0 ! / ' -------------------- zone de calcul de normale ----------------------------- {ADD(tracer_normal_tab%,16)}=0 ! \ {ADD(tracer_normal_tab%,20)}=0 ! > Premier point {ADD(tracer_normal_tab%,24)}=0 ! / {ADD(tracer_normal_tab%,28)}=0 ! \ {ADD(tracer_normal_tab%,32)}=0 ! > Second point {ADD(tracer_normal_tab%,36)}=0 ! / {ADD(tracer_normal_tab%,40)}=0 ! \ {ADD(tracer_normal_tab%,44)}=0 ! > TroisiŠme point {ADD(tracer_normal_tab%,48)}=0 ! / {ADD(tracer_normal_tab%,52)}=10 ! Pr‚ multiplicateur ' -------------------- zone de calcul de normalisation ----------------------- {ADD(tracer_normalise_tab%,16)}=0 ! \ {ADD(tracer_normalise_tab%,20)}=0 ! > Premier point {ADD(tracer_normalise_tab%,24)}=0 ! / {ADD(tracer_normalise_tab%,52)}=10 ! Pr‚ multiplicateur ' -------------------- zone de calcul de barycentre -------------------------- {ADD(tracer_centre_tab%,16)}=0 ! \ {ADD(tracer_centre_tab%,20)}=0 ! > Premier point {ADD(tracer_centre_tab%,24)}=0 ! / {ADD(tracer_centre_tab%,28)}=0 ! \ {ADD(tracer_centre_tab%,32)}=0 ! > Second point {ADD(tracer_centre_tab%,36)}=0 ! / {ADD(tracer_centre_tab%,40)}=0 ! \ {ADD(tracer_centre_tab%,44)}=0 ! > TroisiŠme point {ADD(tracer_centre_tab%,48)}=0 ! / {ADD(tracer_centre_tab%,52)}=10 ! Pr‚ multiplicateur ' -------------------- zone de calcul des trois pr‚c‚dentes ------------------ {ADD(tracer_lestrois_tab%,16)}=0 ! \ {ADD(tracer_lestrois_tab%,20)}=0 ! > Premier point {ADD(tracer_lestrois_tab%,24)}=0 ! / {ADD(tracer_lestrois_tab%,28)}=0 ! \ {ADD(tracer_lestrois_tab%,32)}=0 ! > Second point {ADD(tracer_lestrois_tab%,36)}=0 ! / {ADD(tracer_lestrois_tab%,40)}=0 ! \ {ADD(tracer_lestrois_tab%,44)}=0 ! > TroisiŠme point {ADD(tracer_lestrois_tab%,48)}=0 ! / {ADD(tracer_lestrois_tab%,52)}=10 ! Pr‚ multiplicateur ' -------------------- zone de tri ------------------------------------------- {ADD(tracer_tri_tab%,16)}=0 ! Adresse du tableau … trier CARD{ADD(tracer_tri_tab%,20)}=0 ! Index de d‚part CARD{ADD(tracer_tri_tab%,22)}=0 ! Index de fin CARD{ADD(tracer_tri_tab%,24)}=0 ! Taille d'un bloc ' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ' Dans tout EB Model, les trois premiŠres valeures de matrice_cam% sont … 2 ' //////////////////////////////////////////////////////////////////////////// {matrice_cam%}=2 {ADD(matrice_cam%,4)}=2 {ADD(matrice_cam%,8)}=2 ' -------------------- ParamŠtres de trac‚ divers ---------------------------- IF true_color! BYTE{ADD(tracer_param_tab%,1)}=0 ! Noir en TRUE COLOR BYTE{ADD(tracer_param_tab%,2)}=0 ! pour l'encre BYTE{ADD(tracer_param_tab%,3)}=0 ELSE {tracer_param_tab%}=noir& ENDIF IF true_color! BYTE{ADD(tracer_param_tab%,5)}=0 ! Noir en TRUE COLOR BYTE{ADD(tracer_param_tab%,6)}=0 ! pour le contour BYTE{ADD(tracer_param_tab%,7)}=0 ELSE {ADD(tracer_param_tab%,4)}=noir& ENDIF CARD{ADD(tracer_param_tab%,8)}=1 ! contour actif CARD{ADD(tracer_param_tab%,10)}=1 ! masque de dessin activ‚ {ADD(tracer_param_tab%,12)}=tracer_trame_tab% ! Adresse de la trame {ADD(tracer_param_tab%,16)}=0 ! R‚serv‚ au gouraud {ADD(tracer_param_tab%,20)}=0 ! R‚serv‚ au gouraud {ADD(tracer_param_tab%,24)}=0 ! R‚serv‚ au gouraud ' -------------------- ParamŠtres de tramage divers -------------------------- CARD{tracer_trame_tab%}=&HFFFF ! Masque de dessin (32 octets) CARD{ADD(tracer_trame_tab%,2)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,4)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,6)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,8)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,10)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,12)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,14)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,16)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,18)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,20)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,22)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,24)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,26)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,28)}=&HFFFF ! CARD{ADD(tracer_trame_tab%,30)}=&HFFFF ! ' -------------------- ParamŠtres de tramage des jauges ---------------------- CARD{tracer_trame_jauge%}=&HFFF8 ! Masque de dessin (32 octets) CARD{ADD(tracer_trame_jauge%,2)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,4)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,6)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,8)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,10)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,12)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,14)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,16)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,18)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,20)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,22)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,24)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,26)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,28)}=&HFFF8 ! CARD{ADD(tracer_trame_jauge%,30)}=&HFFF8 ! ' -------------------- ParamŠtres de trac‚ des axes -------------------------- IF true_color! BYTE{ADD(tracer_param_axe%,1)}=0 ! Noir en TRUE COLOR BYTE{ADD(tracer_param_axe%,2)}=0 ! pour l'encre BYTE{ADD(tracer_param_axe%,3)}=0 ELSE {tracer_param_axe%}=noir& ENDIF IF true_color! BYTE{ADD(tracer_param_axe%,5)}=0 ! Noir en TRUE COLOR BYTE{ADD(tracer_param_axe%,6)}=0 ! pour le contour BYTE{ADD(tracer_param_axe%,7)}=0 ELSE {ADD(tracer_param_axe%,4)}=noir& ENDIF INT{ADD(tracer_param_axe%,8)}=0 ! contour actif INT{ADD(tracer_param_axe%,10)}=1 ! masque de dessin activ‚ {ADD(tracer_param_axe%,12)}=tracer_trame_axe% ! Adresse de la trame {ADD(tracer_param_axe%,16)}=0 ! R‚serv‚ au gouraud {ADD(tracer_param_axe%,20)}=0 ! R‚serv‚ au gouraud {ADD(tracer_param_axe%,24)}=0 ! R‚serv‚ au gouraud ' -------------------- ParamŠtres de tramage des axes ------------------------ CARD{tracer_trame_axe%}=&HFF18 ! Masque de dessin ' RETURN ' > FUNCTION chargement_des_ressources(pr&,presentex&,presentey&) LOCAL taille_totale% ' ' On commence par r‚cup‚rer la langue choisie pour EB Model 3. ' En cas d'absence du fichier, le Fran‡ais sera pris par d‚faut. charger_langage ' CHAR{commande%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+CHR$(0) CHAR{commande%}=CHAR{commande%}+"sys\rsc\"+CHAR{nom_mouvement%}+"\"+CHR$(0) ' ' ********************* Chargement des boŒtes d'alertes ********************** IF pr& CHAR{mem_nom%}=" Chargement des boŒtes d'alertes... "+CHR$(0) ligne_d_init(presentex&,presentey&) ENDIF CHAR{mem_che%}=CHAR{commande%}+"alertes.dat"+CHR$(0) minuscule(mem_che%) OPEN "i",#1,CHAR{mem_che%} taille_totale%=LOF(#1) les_alertes%=@prendre(taille_totale%,TRUE,3) ' adr_quitter%=les_alertes% lire_une_alerte(adr_quitter%) adr_memoire%=ADD(adr_quitter%,SUCC(LEN(CHAR{adr_quitter%}))) lire_une_alerte(adr_memoire%) adr_nomonochrome%=ADD(adr_memoire%,SUCC(LEN(CHAR{adr_memoire%}))) lire_une_alerte(adr_nomonochrome%) adr_danger%=ADD(adr_nomonochrome%,SUCC(LEN(CHAR{adr_nomonochrome%}))) lire_une_alerte(adr_danger%) adr_limite%=ADD(adr_danger%,SUCC(LEN(CHAR{adr_danger%}))) lire_une_alerte(adr_limite%) adr_mauvaise_version%=ADD(adr_limite%,SUCC(LEN(CHAR{adr_limite%}))) lire_une_alerte(adr_mauvaise_version%) adr_nofenetre%=ADD(adr_mauvaise_version%,SUCC(LEN(CHAR{adr_mauvaise_version%}))) lire_une_alerte(adr_nofenetre%) adr_existe%=ADD(adr_nofenetre%,SUCC(LEN(CHAR{adr_nofenetre%}))) lire_une_alerte(adr_existe%) adr_vide%=ADD(adr_existe%,SUCC(LEN(CHAR{adr_existe%}))) lire_une_alerte(adr_vide%) adr_movl1%=ADD(adr_vide%,SUCC(LEN(CHAR{adr_vide%}))) lire_une_alerte(adr_movl1%) ' //\\ adr_racctrou%=ADD(adr_movl1%,SUCC(LEN(CHAR{adr_movl1%}))) lire_une_alerte(adr_racctrou%) ' \\// adr_ficinclu%=ADD(adr_racctrou%,SUCC(LEN(CHAR{adr_racctrou%}))) lire_une_alerte(adr_ficinclu%) adr_no3d2%=ADD(adr_ficinclu%,SUCC(LEN(CHAR{adr_ficinclu%}))) lire_une_alerte(adr_no3d2%) adr_pov_def%=ADD(adr_no3d2%,SUCC(LEN(CHAR{adr_no3d2%}))) lire_une_alerte(adr_pov_def%) adr_nomimage%=ADD(adr_pov_def%,SUCC(LEN(CHAR{adr_pov_def%}))) lire_une_alerte(adr_nomimage%) adr_depasse%=ADD(adr_nomimage%,SUCC(LEN(CHAR{adr_nomimage%}))) lire_une_alerte(adr_depasse%) adr_imprimante%=ADD(adr_depasse%,SUCC(LEN(CHAR{adr_depasse%}))) lire_une_alerte(adr_imprimante%) adr_memoire_visu%=ADD(adr_imprimante%,SUCC(LEN(CHAR{adr_imprimante%}))) lire_une_alerte(adr_memoire_visu%) adr_notrouve%=ADD(adr_memoire_visu%,SUCC(LEN(CHAR{adr_memoire_visu%}))) lire_une_alerte(adr_notrouve%) CLOSE #1 ' IF ((xmax&<639) OR (ymax&<399)) AND (NOT @test_touche_morte(FALSE,FALSE,FALSE,TRUE)) ~@afficher_alerte(adr_limite%) RETURN FALSE ENDIF ' CHAR{commande%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+CHR$(0) IF icone_couleur! CHAR{commande%}=CHAR{commande%}+"sys\rsc\"+CHAR{nom_mouvement%}+"\couleurs\"+CHR$(0) ELSE CHAR{commande%}=CHAR{commande%}+"sys\rsc\"+CHAR{nom_mouvement%}+"\"+CHR$(0) ENDIF ' ' ******************** Chargement des ressources ***************************** IF pr& CHAR{mem_nom%}=" Chargement du ressource 1... "+CHR$(0) ligne_d_init(presentex&,presentey&) ENDIF CHAR{mem_che%}=CHAR{commande%}+"rsc_1.rsc"+CHR$(0) IF @xrsrc_load(mem_che%)=0 CHAR{mem_che%}="[3][|RSC_1.RSC non charg‚|RSC_1.RSC not loaded|][ Ok ]"+CHR$(0) ~@afficher_alerte(mem_che%) RETURN FALSE ELSE initialiser_ressource_1 ENDIF IF pr& CHAR{mem_nom%}=" Chargement du ressource 2... "+CHR$(0) ligne_d_init(presentex&,presentey&) ENDIF CHAR{mem_che%}=CHAR{commande%}+"rsc_2.rsc"+CHR$(0) IF @xrsrc_load(mem_che%)=0 CHAR{mem_che%}="[3][|RSC_2.RSC non charg‚|RSC_2.RSC not loaded|][ Ok ]"+CHR$(0) ~@afficher_alerte(mem_che%) RETURN FALSE ELSE initialiser_ressource_2 ENDIF IF pr& CHAR{mem_nom%}=" Chargement du ressource 3... "+CHR$(0) ligne_d_init(presentex&,presentey&) ENDIF CHAR{mem_che%}=CHAR{commande%}+"rsc_3.rsc"+CHR$(0) IF @xrsrc_load(mem_che%)=0 CHAR{mem_che%}="[3][|RSC_3.RSC non charg‚|RSC_3.RSC not loaded|][ Ok ]"+CHR$(0) ~@afficher_alerte(mem_che%) RETURN FALSE ELSE initialiser_ressource_3 ENDIF IF pr& CHAR{mem_nom%}=" Chargement du ressource 4... "+CHR$(0) ligne_d_init(presentex&,presentey&) ENDIF CHAR{mem_che%}=CHAR{commande%}+"rsc_4.rsc"+CHR$(0) IF @xrsrc_load(mem_che%)=0 CHAR{mem_che%}="[3][|RSC_4.RSC non charg‚|RSC_4.RSC not loaded|][ Ok ]"+CHR$(0) ~@afficher_alerte(mem_che%) RETURN FALSE ELSE initialiser_ressource_4 ENDIF IF pr& CHAR{mem_nom%}=" Chargement du ressource 5... "+CHR$(0) ligne_d_init(presentex&,presentey&) ENDIF CHAR{mem_che%}=CHAR{commande%}+"rsc_5.rsc"+CHR$(0) IF @xrsrc_load(mem_che%)=0 CHAR{mem_che%}="[3][|RSC_5.RSC non charg‚|RSC_5.RSC not loaded|][ Ok ]"+CHR$(0) ~@afficher_alerte(mem_che%) RETURN FALSE ELSE initialiser_ressource_5 ENDIF IF pr& CHAR{mem_nom%}=" Chargement du ressource 6... "+CHR$(0) ligne_d_init(presentex&,presentey&) ENDIF CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"sys\rsc\"+CHAR{nom_mouvement%}+"\rsc_6.rsc"+CHR$(0) IF @xrsrc_load(mem_che%)=0 inf_param!=FALSE ELSE inf_param!=TRUE initialiser_ressource_6 ENDIF adr_menu%={ress%} ! 1 adr_info%={ADD(ress%,4)} ! 2 ' ! 3 adr_outils%={ADD(ress%,12)} ! 4 adr_modifier%={ADD(ress%,16)} ! 5 adr_saisie%={ADD(ress%,20)} ! 6 adr_info_objet%={ADD(ress%,24)} ! 7 adr_parametre_tos2gem%={ADD(ress%,28)} ! 8 adr_inf_param%={ADD(ress%,32)} ! 9 ' {ADD(ress%,36)} inutilis‚ ! 10 adr_lumieres%={ADD(ress%,40)} ! 11 adr_aide%={ADD(ress%,44)} ! 12 adr_fonctions%={ADD(ress%,48)} ! 13 adr_stat%={ADD(ress%,52)} ! 14 adr_animation%={ADD(ress%,56)} ! 15 adr_merci%={ADD(ress%,60)} ! 16 adr_camera%={ADD(ress%,64)} ! 17 adr_lanceur%={ADD(ress%,68)} ! 18 adr_parametres%={ADD(ress%,72)} ! 19 adr_bicubics%={ADD(ress%,76)} ! 20 adr_copier%={ADD(ress%,80)} ! 21 adr_popup_divers%={ADD(ress%,84)} ! 22 ' ! 23 ' ! 24 ' ! 25 ' ! 26 adr_predefinie%={ADD(ress%,104)} ! 27 adr_divers%={ADD(ress%,108)} ! 28 adr_popup_autre0%={ADD(ress%,112)} ! 29 ' ! 30 ' ! 31 ' ! 32 ' ! 33 adr_messages%={ADD(ress%,132)} ! 34 ' ! 35 adr_calage%={ADD(ress%,140)} ! 36 adr_anajauge%={ADD(ress%,144)} ! 37 adr_stat_par_objet%={ADD(ress%,148)} ! 38 ' ! 39 adr_popup_parametres%={ADD(ress%,156)} ! 40 adr_quartic%={ADD(ress%,160)} ! 41 adr_quadric%={ADD(ress%,164)} ! 42 adr_temps_passe%={ADD(ress%,168)} ! 43 adr_fenetre%={ADD(ress%,172)} ! 44 adr_bibliotheque%={ADD(ress%,176)} ! 45 adr_chemin_include%={ADD(ress%,180)} ! 46 adr_modules%={ADD(ress%,184)} ! 47 adr_vue_fine%={ADD(ress%,188)} ! 48 adr_jauge_session%={ADD(ress%,192)} ! 49 adr_auteur%={ADD(ress%,196)} ! 50 adr_vue_subjective%={ADD(ress%,200)} ! 51 ' ! 52 adr_calques%={ADD(ress%,208)} ! 53 adr_selec_mult%={ADD(ress%,212)} ! 54 adr_image_fond%={ADD(ress%,216)} ! 55 adr_hierarchie%={ADD(ress%,220)} ! 56 adr_popup_autre1%={ADD(ress%,224)} ! 57 adr_popup_autre2%={ADD(ress%,228)} ! 58 adr_popup_autre3%={ADD(ress%,232)} ! 59 ' ++SYM max_res&=59 ' ++SYM ' ============================================================================ ' Si jamais BUBBLE GEM est en m‚moire, alors, on charge les messages pour les ' bulles d'aide. ATTENTION...Beaucoup de m‚moire ‚xig‚e ' ============================================================================ IF bubble_gem! IF pr& CHAR{mem_nom%}=" Chargement des bulles d'aide... "+CHR$(0) ligne_d_init(presentex&,presentey&) ENDIF CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\bubbles\bubbles.rsc"+CHR$(0) IF @xrsrc_load(mem_che%)=0 ' Pas de ressource pour BUBBLE GEM, c'est dommage, il ‚tait en m‚moire ELSE initialiser_les_bulles ENDIF ENDIF CHAR{{OB_SPEC(adr_parametres%,SUB(chelangu&,2))}}=CHAR{nom_mouvement%} RETURN TRUE ENDFUNC > PROCEDURE contenu_ressources_par_defaut LOCAL tos%,obspec%,i% LOCAL i&,a& ' OB_X(adr_outils%,sousout2&)=OB_X(adr_outils%,sousout1&) OB_Y(adr_outils%,sousout2&)=OB_Y(adr_outils%,sousout1&) OB_X(adr_outils%,sousout3&)=OB_X(adr_outils%,sousout1&) OB_Y(adr_outils%,sousout3&)=OB_Y(adr_outils%,sousout1&) OB_W(adr_outils%,0)=105 OB_W(adr_outils%,1)=PRED(OB_W(adr_outils%,0)) @selection_outils(0) ' CHAR{{OB_SPEC(adr_vue_subjective%,possubx&)}}=STR$(0,10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possuby&)}}=STR$(0,10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possubz&)}}=STR$(0,10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversx&)}}=STR$(0,10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversy&)}}=STR$(0,10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversz&)}}=STR$(0,10,3) CHAR{{OB_SPEC(adr_lumieres%,nom_src&)}}="" CHAR{{OB_SPEC(adr_lumieres%,radius&)}}=" 35" CHAR{{OB_SPEC(adr_lumieres%,falloff&)}}=" 45" position_curseur_tightness(adr_lumieres%,peretigh&,filstigh&,10,FALSE) CHAR{{OB_SPEC(adr_quartic%,nomquart&)}}="" FOR i&=valquar0& TO valquar1& CHAR{{OB_SPEC(adr_quartic%,i&)}}=STR$(0,9,3) NEXT i& CHAR{{OB_SPEC(adr_quadric%,nomquadr&)}}="" FOR i&=valquad0& TO valquad1& CHAR{{OB_SPEC(adr_quadric%,i&)}}=STR$(0,9,3) NEXT i& FOR i&=somx01& TO somz16& CHAR{{OB_SPEC(adr_bicubics%,i&)}}=STR$(0,10,3) NEXT i& OB_X(adr_modifier%,modforbl&)=OB_X(adr_modifier%,modthrbl&) OB_Y(adr_modifier%,modforbl&)=OB_Y(adr_modifier%,modthrbl&) ' **** Mise … la taille et en position des ‚l‚ments de la fenˆtre AIDE OB_X(adr_aide%,aidesous&)=OB_X(adr_aide%,clavier&) OB_Y(adr_aide%,aidesous&)=OB_Y(adr_aide%,clavier&) OB_H(adr_aide%,0)=294 OB_H(adr_aide%,1)=PRED(OB_H(adr_aide%,0)) ob_flags(adr_aide%,aidesous&,aes_hidetree&,FALSE) ob_flags(adr_aide%,clavier&,aes_hidetree&,TRUE) ob_state(adr_aide%,infsupp&,aes_selected&,TRUE) form_center(adr_aide%,x&,y&,w&,h&) ' **** Mise … la taille et en position des ‚l‚ments de la fenˆtre FONCTIONS OB_X(adr_fonctions%,souslist&)=OB_X(adr_fonctions%,soustout&) OB_Y(adr_fonctions%,souslist&)=OB_Y(adr_fonctions%,soustout&) OB_X(adr_fonctions%,souseffa&)=OB_X(adr_fonctions%,souscsg0&) OB_Y(adr_fonctions%,souseffa&)=OB_Y(adr_fonctions%,souscsg0&) OB_W(adr_fonctions%,0)=411 OB_H(adr_fonctions%,0)=329 OB_W(adr_fonctions%,1)=410 OB_H(adr_fonctions%,1)=PRED(OB_H(adr_fonctions%,0)) ob_state(adr_fonctions%,titrcsg&,aes_hidetree&,TRUE) ob_state(adr_fonctions%,titrblob&,aes_hidetree&,TRUE) ob_state(adr_fonctions%,titreinv&,aes_hidetree&,TRUE) ob_state(adr_fonctions%,titreffa&,aes_hidetree&,TRUE) ob_flags(adr_fonctions%,boutblob&,aes_hidetree&,TRUE) form_center(adr_fonctions%,x&,y&,w&,h&) ' **** Mise … la taille et en position des ‚l‚ments de la fenˆtre INFORMATIONS OB_X(adr_info%,souinf1&)=OB_X(adr_info%,souinf0&) OB_Y(adr_info%,souinf1&)=OB_Y(adr_info%,souinf0&) OB_X(adr_info%,souinf2&)=OB_X(adr_info%,souinf0&) OB_Y(adr_info%,souinf2&)=OB_Y(adr_info%,souinf0&) OB_H(adr_info%,0)=224 OB_H(adr_info%,1)=PRED(OB_H(adr_info%,0)) ob_flags(adr_info%,souinf0&,aes_hidetree&,FALSE) ob_flags(adr_info%,souinf1&,aes_hidetree&,TRUE) ob_flags(adr_info%,souinf2&,aes_hidetree&,TRUE) ob_state(adr_info%,infgener&,aes_selected&,TRUE) form_center(adr_info%,x&,y&,w&,h&) ob_flags(adr_info%,souinf0&,aes_hidetree&,FALSE) ob_flags(adr_info%,souinf1&,aes_hidetree&,TRUE) ob_flags(adr_info%,souinf2&,aes_hidetree&,TRUE) ob_state(adr_info%,infsyste&,aes_selected&,FALSE) ob_state(adr_info%,sharewar&,aes_selected&,FALSE) ' ---------------------------------------------------------------------------- ' ---- Pour m‚moire les zone … remplir font au maximum 20 caractŠres ---- ' ---------------------------------------------------------------------------- tos%=LPEEK(&H4F2) CHAR{{OB_SPEC(adr_info%,systos&)}}=HEX$(DPEEK(ADD(tos%,2))) CHAR{{OB_SPEC(adr_info%,sysgem&)}}=HEX$(WORD{{ADD(GB,4)}}) CHAR{{OB_SPEC(adr_info%,sysgedo&)}}=HEX$(GEMDOS(&H30)) $S|,S> SELECT machine| CASE 0 ! STf CHAR{{OB_SPEC(adr_info%,sysmachi&)}}=CHAR{OB_SPEC(adr_divers%,lin40&)} CASE 1 ! STe CHAR{{OB_SPEC(adr_info%,sysmachi&)}}=CHAR{OB_SPEC(adr_divers%,lin46&)} CASE 2 ! ST Book CHAR{{OB_SPEC(adr_info%,sysmachi&)}}=CHAR{OB_SPEC(adr_divers%,lin42&)} CASE 3 ! STE avec IDE CHAR{{OB_SPEC(adr_info%,sysmachi&)}}=CHAR{OB_SPEC(adr_divers%,lin41&)} CASE 4 ! Mega STE CHAR{{OB_SPEC(adr_info%,sysmachi&)}}=CHAR{OB_SPEC(adr_divers%,lin45&)} CASE 5 ! Falcon CHAR{{OB_SPEC(adr_info%,sysmachi&)}}=CHAR{OB_SPEC(adr_divers%,lin43&)} CASE 6 ! TT030 CHAR{{OB_SPEC(adr_info%,sysmachi&)}}=CHAR{OB_SPEC(adr_divers%,lin44&)} CASE 7 ! MILAN CHAR{{OB_SPEC(adr_info%,sysmachi&)}}=CHAR{OB_SPEC(adr_divers%,lin76&)} CASE 8 ! HADES CHAR{{OB_SPEC(adr_info%,sysmachi&)}}=CHAR{OB_SPEC(adr_divers%,lin47&)} CASE 9 ! ARANYM CHAR{{OB_SPEC(adr_info%,sysmachi&)}}=CHAR{OB_SPEC(adr_divers%,lin78&)} DEFAULT ! STf par d‚faut CHAR{{OB_SPEC(adr_info%,sysmachi&)}}=CHAR{OB_SPEC(adr_divers%,lin40&)} ENDSELECT $S|,S> SELECT pro| CASE 0 CHAR{{OB_SPEC(adr_info%,sysproce&)}}=CHAR{OB_SPEC(adr_divers%,lin49&)} CASE 1 CHAR{{OB_SPEC(adr_info%,sysproce&)}}=CHAR{OB_SPEC(adr_divers%,lin50&)} CASE 2 CHAR{{OB_SPEC(adr_info%,sysproce&)}}=CHAR{OB_SPEC(adr_divers%,lin51&)} CASE 3 CHAR{{OB_SPEC(adr_info%,sysproce&)}}=CHAR{OB_SPEC(adr_divers%,lin52&)} CASE 4 CHAR{{OB_SPEC(adr_info%,sysproce&)}}=CHAR{OB_SPEC(adr_divers%,lin53&)} CASE 5 CHAR{{OB_SPEC(adr_info%,sysproce&)}}=CHAR{OB_SPEC(adr_divers%,lin54&)} DEFAULT CHAR{{OB_SPEC(adr_info%,sysproce&)}}=CHAR{OB_SPEC(adr_divers%,lin55&)} ENDSELECT $S|,S> SELECT copro| CASE 0 CHAR{{OB_SPEC(adr_info%,syscopro&)}}=CHAR{OB_SPEC(adr_divers%,lin56&)} CASE 1 CHAR{{OB_SPEC(adr_info%,syscopro&)}}=CHAR{OB_SPEC(adr_divers%,lin57&)} CASE 2 CHAR{{OB_SPEC(adr_info%,syscopro&)}}=CHAR{OB_SPEC(adr_divers%,lin58&)} CASE 3 CHAR{{OB_SPEC(adr_info%,syscopro&)}}=CHAR{OB_SPEC(adr_divers%,lin59&)} CASE 4 CHAR{{OB_SPEC(adr_info%,syscopro&)}}=CHAR{OB_SPEC(adr_divers%,lin60&)} CASE 5 CHAR{{OB_SPEC(adr_info%,syscopro&)}}=CHAR{OB_SPEC(adr_divers%,lin61&)} CASE 6 CHAR{{OB_SPEC(adr_info%,syscopro&)}}=CHAR{OB_SPEC(adr_divers%,lin48&)} CASE 7 CHAR{{OB_SPEC(adr_info%,syscopro&)}}=CHAR{OB_SPEC(adr_divers%,lin48_1&)} CASE 8 CHAR{{OB_SPEC(adr_info%,syscopro&)}}=CHAR{OB_SPEC(adr_divers%,lin48_2&)} CASE 9 CHAR{{OB_SPEC(adr_info%,syscopro&)}}=CHAR{OB_SPEC(adr_divers%,lin48_3&)} DEFAULT CHAR{{OB_SPEC(adr_info%,syscopro&)}}=CHAR{OB_SPEC(adr_divers%,lin56&)} ENDSELECT $S|,S> SELECT video| CASE 0 CHAR{{OB_SPEC(adr_info%,sysvideo&)}}=CHAR{OB_SPEC(adr_divers%,lin62&)} CASE 1 CHAR{{OB_SPEC(adr_info%,sysvideo&)}}=CHAR{OB_SPEC(adr_divers%,lin63&)} CASE 2 CHAR{{OB_SPEC(adr_info%,sysvideo&)}}=CHAR{OB_SPEC(adr_divers%,lin64&)} CASE 3 CHAR{{OB_SPEC(adr_info%,sysvideo&)}}=CHAR{OB_SPEC(adr_divers%,lin65&)} CASE 4 CHAR{{OB_SPEC(adr_info%,sysvideo&)}}=CHAR{OB_SPEC(adr_divers%,lin66&)} CASE 5 CHAR{{OB_SPEC(adr_info%,sysvideo&)}}=CHAR{OB_SPEC(adr_divers%,lin67&)} DEFAULT CHAR{{OB_SPEC(adr_info%,sysvideo&)}}=CHAR{OB_SPEC(adr_divers%,lin62&)} ENDSELECT IF plan_systeme&=>24 CHAR{{OB_SPEC(adr_info%,sysnbrco&)}}="16M"+CHR$(0) ELSE IF plan_systeme&=16 CHAR{{OB_SPEC(adr_info%,sysnbrco&)}}="65K"+CHR$(0) ELSE IF plan_systeme&=16 CHAR{{OB_SPEC(adr_info%,sysnbrco&)}}="32K"+CHR$(0) ELSE CHAR{{OB_SPEC(adr_info%,sysnbrco&)}}=STR$(2^plan_systeme&)+CHR$(0) ENDIF IF mode_entrelace! CHAR{{OB_SPEC(adr_info%,sysnbrco&)}}=CHAR{{OB_SPEC(adr_info%,sysnbrco&)}}+CHAR{OB_SPEC(adr_divers%,lin25&)} ELSE CHAR{{OB_SPEC(adr_info%,sysnbrco&)}}=CHAR{{OB_SPEC(adr_info%,sysnbrco&)}}+CHAR{OB_SPEC(adr_divers%,lin26&)} ENDIF CHAR{{OB_SPEC(adr_info%,systaill&)}}=LEFT$(STR$(SUCC(xmax&))+"x"+STR$(SUCC(ymax&))+SPACE$(20),20) $S|,$S> SELECT son| CASE 0 CHAR{{OB_SPEC(adr_info%,sysson&)}}=CHAR{OB_SPEC(adr_divers%,lin68&)} CASE 1 CHAR{{OB_SPEC(adr_info%,sysson&)}}=CHAR{OB_SPEC(adr_divers%,lin69&)} CASE 2 CHAR{{OB_SPEC(adr_info%,sysson&)}}=CHAR{OB_SPEC(adr_divers%,lin70&)} CASE 3 CHAR{{OB_SPEC(adr_info%,sysson&)}}=CHAR{OB_SPEC(adr_divers%,lin71&)} CASE 4 CHAR{{OB_SPEC(adr_info%,sysson&)}}=CHAR{OB_SPEC(adr_divers%,lin72&)} CASE 5 CHAR{{OB_SPEC(adr_info%,sysson&)}}=CHAR{OB_SPEC(adr_divers%,lin73&)}+" Version "+STR$(psound0|)+"."+RIGHT$("00"+STR$(psound1|),2) ENDSELECT IF mode_nvdi! obspec%={OB_SPEC(adr_info%,sysnvdi&)} CHAR{obspec%}="V." CHAR{obspec%}=CHAR{obspec%}+RIGHT$("00"+STR$(ver_nvdi1|),2)+"." CHAR{obspec%}=CHAR{obspec%}+RIGHT$("00"+STR$(ver_nvdi2|),2)+" (" CHAR{obspec%}=CHAR{obspec%}+RIGHT$("00"+STR$(dat_nvdi1|),2)+"/" CHAR{obspec%}=CHAR{obspec%}+RIGHT$("00"+STR$(dat_nvdi2|),2)+"/" CHAR{obspec%}=CHAR{obspec%}+RIGHT$("0000"+STR$(dat_nvdi3&),4)+")" ELSE CHAR{{OB_SPEC(adr_info%,sysnvdi&)}}=CHAR{OB_SPEC(adr_divers%,lin24&)} ENDIF IF open_gl! CHAR{{OB_SPEC(adr_info%,syswinx&)}}=CHAR{OB_SPEC(adr_divers%,lin23&)} ELSE CHAR{{OB_SPEC(adr_info%,syswinx&)}}=CHAR{OB_SPEC(adr_divers%,lin24&)} ENDIF IF bubble_gem! CHAR{{OB_SPEC(adr_info%,sysmint&)}}="Release "+RIGHT$("00"+STR$(bubble_release%),2) ELSE CHAR{{OB_SPEC(adr_info%,sysmint&)}}=CHAR{OB_SPEC(adr_divers%,lin24&)} ENDIF IF magic! i%={OB_SPEC(adr_info%,sysmagic&)+4} ! Le masque {i%}=&H4D616769 ! Magi {ADD(i%,4)}=&H43202020 ! C... {ADD(i%,8)}=&H20202020 ! .... obspec%={OB_SPEC(adr_info%,sysmagic&)} CHAR{obspec%}="V. " CHAR{obspec%}=CHAR{obspec%}+LEFT$(HEX$(magic_version&,3),1)+"." CHAR{obspec%}=CHAR{obspec%}+RIGHT$(HEX$(magic_version&,3),2)+" (" CHAR{obspec%}=CHAR{obspec%}+LEFT$(HEX$(magic_date%,8),2)+"/" CHAR{obspec%}=CHAR{obspec%}+MID$(HEX$(magic_date%,8),3,2)+"/" CHAR{obspec%}=CHAR{obspec%}+RIGHT$(HEX$(magic_date%,8),4)+")" ELSE IF mode_naes! i%={OB_SPEC(adr_info%,sysmagic&)+4} ! Le masque {i%}=&H4E204145 ! N AE {ADD(i%,4)}=&H53202020 ! S... {ADD(i%,8)}=&H20202020 ! .... obspec%={OB_SPEC(adr_info%,sysmagic&)} CHAR{obspec%}="V." CHAR{obspec%}=CHAR{obspec%}+RIGHT$("00"+STR$(ver_naes1|),2)+"." CHAR{obspec%}=CHAR{obspec%}+RIGHT$("00"+STR$(ver_naes2|),2)+"." CHAR{obspec%}=CHAR{obspec%}+RIGHT$("00"+STR$(ver_naes3|),2)+" (" CHAR{obspec%}=CHAR{obspec%}+RIGHT$("00"+STR$(dat_naes1|),2)+"/" CHAR{obspec%}=CHAR{obspec%}+RIGHT$("00"+STR$(dat_naes2|),2)+"/" CHAR{obspec%}=CHAR{obspec%}+RIGHT$("0000"+STR$(dat_naes3&),2) ELSE IF geneva! i%={OB_SPEC(adr_info%,sysmagic&)+4} ! Le masque {i%}=&H47656E65 ! Gene {ADD(i%,4)}=&H76612020 ! va.. {ADD(i%,8)}=&H20202020 ! .... CHAR{{OB_SPEC(adr_info%,sysmagic&)}}=CHAR{OB_SPEC(adr_divers%,lin23&)} ELSE IF mint! i%={OB_SPEC(adr_info%,sysmagic&)+4} ! Le masque {i%}=&H4D694E54 ! MiNT {ADD(i%,4)}=&H20202020 ! .... {ADD(i%,8)}=&H20202020 ! .... CHAR{{OB_SPEC(adr_info%,sysmagic&)}}=CHAR{OB_SPEC(adr_divers%,lin23&)} ELSE CHAR{{OB_SPEC(adr_info%,sysmagic&)}}=CHAR{OB_SPEC(adr_divers%,lin24&)} ENDIF IF tos2gem! a&=INT{adresse_tos2gem%} CHAR{{OB_SPEC(adr_info%,systos2g&)}}="Version "+STR$(a& AND &X11111,2)+"."+STR$(ROR&(a&,5) AND &X1111,2)+"."+STR$(ADD(1980,ROR&(a&,9) AND &X1111111),4) ELSE CHAR{{OB_SPEC(adr_info%,systos2g&)}}=CHAR{OB_SPEC(adr_divers%,lin24&)} ENDIF ' IF mode_myaes! i%={OB_SPEC(adr_info%,sysxtos&)+4} ! Le masque {i%}=&H4D794145 ! MyAE {ADD(i%,4)}=&H53202020 ! S... {ADD(i%,8)}=&H20202020 ! .... CHAR{{OB_SPEC(adr_info%,sysxtos&)}}="MyAES Chouette!" ENDIF CHAR{{OB_SPEC(adr_parametres%,limites&)}}=STR$(limite_des_objets&,5) CHAR{{OB_SPEC(adr_copier%,conombr&)}}="9" CHAR{{OB_SPEC(adr_copier%,comdistx&)}}="100" CHAR{{OB_SPEC(adr_copier%,comdisty&)}}="100" CHAR{{OB_SPEC(adr_copier%,comdistz&)}}="100" CHAR{{OB_SPEC(adr_copier%,codegrex&)}}="0" CHAR{{OB_SPEC(adr_copier%,codegrey&)}}="0" CHAR{{OB_SPEC(adr_copier%,codegrez&)}}="0" CHAR{{OB_SPEC(adr_copier%,coptauxx&)}}="100" CHAR{{OB_SPEC(adr_copier%,coptauxy&)}}="100" CHAR{{OB_SPEC(adr_copier%,coptauxz&)}}="100" CHAR{{OB_SPEC(adr_copier%,coalea0x&)}}="0" CHAR{{OB_SPEC(adr_copier%,coalea0y&)}}="0" CHAR{{OB_SPEC(adr_copier%,coalea0z&)}}="0" CHAR{{OB_SPEC(adr_copier%,coalea1x&)}}="0" CHAR{{OB_SPEC(adr_copier%,coalea1y&)}}="0" CHAR{{OB_SPEC(adr_copier%,coalea1z&)}}="0" CHAR{{OB_SPEC(adr_copier%,coalea2x&)}}="0" CHAR{{OB_SPEC(adr_copier%,coalea2y&)}}="0" CHAR{{OB_SPEC(adr_copier%,coalea2z&)}}="0" CHAR{{OB_SPEC(adr_copier%,coinitia&)}}="0" IF maxcol&<15 fond_ecran&=blanc& ELSE fond_ecran&=gris_fonce& ENDIF ' date_et_version CHAR{{OB_SPEC(adr_info%,bartit01&)}}=CHAR{version%} CHAR{{OB_SPEC(adr_parametres%,bartit03&)}}=CHAR{version%} ' preparer_fenetre_remerciement ' RETURN > PROCEDURE selection_outils(type|) ' ob_flags(adr_outils%,sousout1&,aes_hidetree&,NOT (type|=0)) ob_flags(adr_outils%,sousout2&,aes_hidetree&,NOT (type|=1)) ob_flags(adr_outils%,sousout3&,aes_hidetree&,NOT (type|=2)) ob_state(adr_outils%,ioutil01&,aes_selected&,type|=0) ob_state(adr_outils%,ioutil02&,aes_selected&,type|=1) ob_state(adr_outils%,ioutil03&,aes_selected&,type|=2) ' RETURN > PROCEDURE date_et_version version%=OB_SPEC(adr_divers%,version&) date%={OB_SPEC(adr_info%,bardev&)} CHAR{date%}="20/02/2006" ! La date de compilation CHAR{version%}=STR$(3.61,4,2)+"f F‚v. 2006" ! Le num‚ro de version RETURN > PROCEDURE ligne_d_init(presentex&,presentey&) text(presentex&,presentey&,mem_nom%) RETURN > PROCEDURE changer_les_boutons ! Oh! les jolis boutons LOCAL obspec% ' obspec%=OB_SPEC(adr_parametres%,ADD(chebou01&,type_de_bouton|)) ' ' +++++++++++++++++++++++++++++++++++++ Fenˆtre des Carreaux de B‚zier OB_SPEC(adr_bicubics%,fraopt&)=obspec% ' +++++++++++++++++++++++++++++++++++++ Fenˆtre de Modification OB_SPEC(adr_modifier%,modtaide&)=obspec% ' +++++++++++++++++++++++++++++++++++++ Fenˆtre de Copie OB_SPEC(adr_copier%,distri0x&)=obspec% OB_SPEC(adr_copier%,distri0y&)=obspec% OB_SPEC(adr_copier%,distri0z&)=obspec% OB_SPEC(adr_copier%,distri1x&)=obspec% OB_SPEC(adr_copier%,distri1y&)=obspec% OB_SPEC(adr_copier%,distri1z&)=obspec% ' +++++++++++++++++++++++++++++++++++++ Fenˆtre de LumiŠre OB_SPEC(adr_lumieres%,surfjitt&)=obspec% OB_SPEC(adr_lumieres%,surcylin&)=obspec% OB_SPEC(adr_lumieres%,suratmos&)=obspec% OB_SPEC(adr_lumieres%,surombre&)=obspec% OB_SPEC(adr_lumieres%,surinter&)=obspec% ' +++++++++++++++++++++++++++++++++++++ Fenˆtre du Lanceur de POV OB_SPEC(adr_lanceur%,povcont&)=obspec% OB_SPEC(adr_lanceur%,antionof&)=obspec% OB_SPEC(adr_lanceur%,povlafa&)=obspec% OB_SPEC(adr_lanceur%,jittonof&)=obspec% OB_SPEC(adr_lanceur%,povgene&)=obspec% OB_SPEC(adr_lanceur%,povaffi&)=obspec% OB_SPEC(adr_lanceur%,povatte&)=obspec% OB_SPEC(adr_lanceur%,povater&)=obspec% OB_SPEC(adr_lanceur%,povutsl&)=obspec% OB_SPEC(adr_lanceur%,povmosai&)=obspec% OB_SPEC(adr_lanceur%,povnume&)=obspec% OB_SPEC(adr_lanceur%,buffonof&)=obspec% OB_SPEC(adr_lanceur%,pov_ul&)=obspec% OB_SPEC(adr_lanceur%,pov_uv&)=obspec% OB_SPEC(adr_lanceur%,pov_ur&)=obspec% OB_SPEC(adr_lanceur%,pov_su&)=obspec% OB_SPEC(adr_lanceur%,pov_ua&)=obspec% OB_SPEC(adr_lanceur%,pov_ga&)=obspec% OB_SPEC(adr_lanceur%,pov_gd&)=obspec% OB_SPEC(adr_lanceur%,pov_gf&)=obspec% OB_SPEC(adr_lanceur%,pov_gr&)=obspec% OB_SPEC(adr_lanceur%,pov_gs&)=obspec% OB_SPEC(adr_lanceur%,pov_gw&)=obspec% ' +++++++++++++++++++++++++++++++++++++ Fenˆtre de Calques OB_SPEC(adr_calques%,cavion01&)=obspec% OB_SPEC(adr_calques%,cavion02&)=obspec% OB_SPEC(adr_calques%,cavion03&)=obspec% OB_SPEC(adr_calques%,cavion04&)=obspec% OB_SPEC(adr_calques%,cavion05&)=obspec% OB_SPEC(adr_calques%,cavion06&)=obspec% OB_SPEC(adr_calques%,cavion07&)=obspec% OB_SPEC(adr_calques%,cavion08&)=obspec% OB_SPEC(adr_calques%,cavion09&)=obspec% OB_SPEC(adr_calques%,cavion10&)=obspec% OB_SPEC(adr_calques%,caviof01&)=obspec% OB_SPEC(adr_calques%,caviof02&)=obspec% OB_SPEC(adr_calques%,caviof03&)=obspec% OB_SPEC(adr_calques%,caviof04&)=obspec% OB_SPEC(adr_calques%,caviof05&)=obspec% OB_SPEC(adr_calques%,caviof06&)=obspec% OB_SPEC(adr_calques%,caviof07&)=obspec% OB_SPEC(adr_calques%,caviof08&)=obspec% OB_SPEC(adr_calques%,caviof09&)=obspec% OB_SPEC(adr_calques%,caviof10&)=obspec% ' +++++++++++++++++++++++++++++++++++++ Fenˆtre de TOS 2 GEM OB_SPEC(adr_parametre_tos2gem%,t2gfo4&)=obspec% OB_SPEC(adr_parametre_tos2gem%,t2gfo6&)=obspec% OB_SPEC(adr_parametre_tos2gem%,t2gfo13&)=obspec% OB_SPEC(adr_parametre_tos2gem%,t2gpbuf&)=obspec% OB_SPEC(adr_parametre_tos2gem%,t2ggbuf&)=obspec% OB_SPEC(adr_parametre_tos2gem%,t2glbuf&)=obspec% OB_SPEC(adr_parametre_tos2gem%,t2gpal0&)=obspec% OB_SPEC(adr_parametre_tos2gem%,t2gpal1&)=obspec% OB_SPEC(adr_parametre_tos2gem%,t2gpal2&)=obspec% ' +++++++++++++++++++++++++++++++++++++ Fenˆtre de Include OB_SPEC(adr_chemin_include%,cheinca1&)=obspec% OB_SPEC(adr_chemin_include%,cheinca2&)=obspec% OB_SPEC(adr_chemin_include%,cheinca3&)=obspec% OB_SPEC(adr_chemin_include%,cheinca4&)=obspec% OB_SPEC(adr_chemin_include%,cheinca5&)=obspec% OB_SPEC(adr_chemin_include%,cheinca6&)=obspec% OB_SPEC(adr_chemin_include%,cheinca7&)=obspec% OB_SPEC(adr_chemin_include%,cheinca8&)=obspec% OB_SPEC(adr_chemin_include%,cheinca9&)=obspec% ' +++++++++++++++++++++++++++++++++++++ Fenˆtre de parametrage OB_SPEC(adr_parametres%,act_opengl&)=obspec% ' redraw_force(idx_info&,idx_animation&) ' RETURN > PROCEDURE mise_a_jour_ovl_texture ! Des textures en preview LOCAL taille_idx%,taille_ovl%,nb_par_idx&,adr_int% LOCAL anc_taille_loc&,taille_loc&,nb_par_ovl&,nb_tot& ' taille_loc&=taille_texture& ADD taille_loc&,taille_pigment& ADD taille_loc&,taille_normal& ADD taille_loc&,taille_finish& ADD taille_loc&,taille_interior& ' CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_textu.idx"+CHR$(0) IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} taille_idx%=LOF(#1) CLOSE #1 nb_par_idx&=DIV(taille_idx%,22) CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_textu.ovl"+CHR$(0) IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} taille_ovl%=LOF(#1) CLOSE #1 nb_par_ovl&=DIV(taille_ovl%,taille_loc&) IF nb_par_ovl&<>nb_par_idx& anc_taille_loc&=taille_texture& ADD anc_taille_loc&,taille_pigment& ADD anc_taille_loc&,taille_normal& ADD anc_taille_loc&,taille_finish& ADD anc_taille_loc&,76 ' CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_textu.ovl"+CHR$(0) CHAR{mem_nom%}=CHAR{eb_temp%}+"\textures\eb_nouve.ovl"+CHR$(0) ' OPEN "i",#1,CHAR{mem_che%} ! Le vieux fichier OPEN "o",#2,CHAR{mem_nom%} ! Le nouveaux fichier ' adr_int%=coord_polygon% ADD adr_int%,taille_texture& ADD adr_int%,taille_pigment& ADD adr_int%,taille_normal& ADD adr_int%,taille_finish& CLR nb_tot& DO ' BGET #1,coord_polygon%,anc_taille_loc& membfill(adr_int%,taille_interior&,0) BYTE{ADD(adr_int%,66)}=24 BYTE{ADD(adr_int%,48)}=BSET(BYTE{ADD(adr_int%,48)},5) BPUT #2,coord_polygon%,taille_loc& ' INC nb_tot& LOOP WHILE nb_tot& PROCEDURE lire_la_ligne_de_commande(l0%,l1%) ~@shel_read(l0%,l1%) RETURN > PROCEDURE remplir_fenetre_lanceur LOCAL o! ' $S|,$S> SELECT marqueur| CASE 1 OB_SPEC(adr_parametres%,chemarq&)=OB_SPEC(adr_popup_divers%,marq01&) CASE 2 OB_SPEC(adr_parametres%,chemarq&)=OB_SPEC(adr_popup_divers%,SUCC(marq01&)) CASE 3 OB_SPEC(adr_parametres%,chemarq&)=OB_SPEC(adr_popup_divers%,ADD(marq01&,2)) CASE 5 OB_SPEC(adr_parametres%,chemarq&)=OB_SPEC(adr_popup_divers%,ADD(marq01&,3)) ENDSELECT ' ob_state(adr_lanceur%,povcont&,aes_disable&,TRUE) position_curseur_aliasing(adr_lanceur%,povpere&,povfils&,alias&,FALSE) position_curseur_aliasing(adr_lanceur%,jittpere&,jittfils&,jittering&,FALSE) ' o!=BTST(OB_STATE(adr_lanceur%,jittonof&),aes_selected&) ob_state(adr_lanceur%,jittonof&,aes_disable&,NOT o!) ob_state(adr_lanceur%,PRED(jittpere&),aes_disable&,NOT o!) ob_state(adr_lanceur%,bjittfil&,aes_disable&,NOT o!) ' o!=BTST(OB_STATE(adr_lanceur%,antionof&),aes_selected&) ob_state(adr_lanceur%,PRED(povpere&),aes_disable&,NOT o!) ob_state(adr_lanceur%,bpovfil&,aes_disable&,NOT o!) ob_state(adr_lanceur%,povlafa&,aes_disable&,o!) FOR i&=povmat01& TO povmat09& ob_state(adr_lanceur%,i&,aes_disable&,NOT o!) NEXT i& ob_state(adr_lanceur%,jittonof&,aes_disable&,NOT o!) ob_state(adr_lanceur%,PRED(jittpere&),aes_disable&,NOT o!) ob_state(adr_lanceur%,bjittfil&,aes_disable&,NOT o!) ' CHAR{{OB_SPEC(adr_lanceur%,povlarge&)}}=STR$(largeur_par_defaut&,5) CHAR{{OB_SPEC(adr_lanceur%,povhaute&)}}=STR$(hauteur_par_defaut&,5) CHAR{{OB_SPEC(adr_lanceur%,cpovdebu&)}}=" 1" CHAR{{OB_SPEC(adr_lanceur%,cpovfin&)}}=STR$(largeur_par_defaut&,5) CHAR{{OB_SPEC(adr_lanceur%,rpovdebu&)}}=" 1" CHAR{{OB_SPEC(adr_lanceur%,rpovfin&)}}=STR$(hauteur_par_defaut&,5) image_deja_presente(FALSE,FALSE) ob_state(adr_lanceur%,povlafa&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,antionof&),aes_selected&))) IF BTST(OB_STATE(adr_lanceur%,povaffi&),aes_selected&) ob_state(adr_lanceur%,povnume&,aes_selected&,FALSE) ob_state(adr_lanceur%,povnume&,aes_disable&,TRUE) ob_state(adr_lanceur%,povmosai&,aes_disable&,FALSE) ELSE ob_state(adr_lanceur%,povnume&,aes_disable&,FALSE) ob_state(adr_lanceur%,povmosai&,aes_selected&,FALSE) ob_state(adr_lanceur%,povmosai&,aes_disable&,TRUE) ENDIF IF BTST(OB_STATE(adr_lanceur%,povmosai&),aes_selected&) ob_state(adr_lanceur%,mosadebu&,aes_disable&,FALSE) ob_state(adr_lanceur%,mosafin&,aes_disable&,FALSE) ELSE ob_state(adr_lanceur%,mosadebu&,aes_disable&,TRUE) ob_state(adr_lanceur%,mosafin&,aes_disable&,TRUE) ENDIF RETURN > FUNCTION lire_table_d_index(VAR tota&) LOCAL taille%,zone_memoire% IF @s_exist(mem_che%)=TRUE OPEN "i",#1,CHAR{mem_che%} taille%=LOF(#1) zone_memoire%=@prendre(taille%,TRUE,3) BGET #1,zone_memoire%,taille% CLOSE #1 tota&=DIV(taille%,22) ELSE tota&=1 zone_memoire%=@prendre(22,TRUE,3) CHAR{zone_memoire%}="Non pr‚d‚finie " ENDIF RETURN zone_memoire% ENDFUNC > PROCEDURE init_table_d_index(zone_mem%,tota&) LOCAL ad%,fin_b% fin_b%=ADD(zone_mem%,MUL(tota&,22)) ad%=zone_mem% DO BYTE{ADD(ad%,21)}=0 ADD ad%,22 LOOP WHILE ad% FUNCTION alerte_session_precedente ! Chargement de l'ancienne session LOCAL fx&,fy&,fw&,fh&,rep&,tmer%,tmp&,atmp&,evnt& LOCAL jx&,jy&,jw&,jh&,pr_f& ' form_center(adr_jauge_session%,fx&,fy&,fw&,fh&) fx&=SHL(SHR(fx&,4),4) OB_X(adr_jauge_session%,0)=fx& form_dial(0,fx&,fy&,fw&,fh&,fx&,fy&,fw&,fh&) ' videsouris ' pr_f&=@wind_create(0,fx&,fy&,fw&,fh&) IF pr_f&>-1 wind_open(pr_f&,fx&,fy&,fw&,fh&) ENDIF ' CHAR{{OB_SPEC(adr_jauge_session%,oldsessi&)}}=LEFT$(RIGHT$(CHAR{titre_en_cours%},SUB(LEN(CHAR{titre_en_cours%}),LEN(LEFT$(CHAR{titre_en_cours%},RINSTR(CHAR{titre_en_cours%},"\")))))+SPACE$(12),12) objc_draw(adr_jauge_session%,0,12,fx&,fy&,fw&,fh&,-1) ' objc_offset(adr_jauge_session%,courjaug&,jx&,jy&) jw&=OB_W(adr_jauge_session%,courjaug&) jh&=OB_H(adr_jauge_session%,courjaug&) set_remplissage(4,0,rouge&,tracer_trame_jauge%) set_fill_perimeter_visibility(0) set_writing_mode(mode_transparent|) atmp&=-1 tmer%=TIMER CLR rep& DO ' Appel fonction xform_do() juste pour la jauge en alerte evnt&=@xform_do(&X110011,adr_jauge_session%,0) IF BTST(evnt&,0) ! EVENEMENT CLAVIER IF key&=&H720D OR key&=&H1C0D ' RETRUN ou ENTER objc_change(adr_jauge_session%,ouicours&) rep&=1 objc_change(adr_jauge_session%,ouicours&) ELSE IF key&=&H11B ' ESC objc_change(adr_jauge_session%,noncours&) rep&=2 objc_change(adr_jauge_session%,noncours&) ENDIF CLR evnt& ENDIF IF BTST(evnt&,1) ! EVENEMENT DE CLIC SOURIS SELECT objet& CASE ouicours& objc_change(adr_jauge_session%,objet&) rep&=1 CASE noncours& objc_change(adr_jauge_session%,objet&) rep&=2 ENDSELECT CLR evnt& ENDIF tmp&=ROUND((TIMER-tmer%)/200) IF atmp&<>tmp& graf_mouse(m_off&,0) vdi_11(1,jx&,jy&,jx&+(tmp&*(jw&/4)),PRED(ADD(jy&,jh&)),0,0,0,0) graf_mouse(m_on&,0) atmp&=tmp& ENDIF EXIT IF tmp&=4 OR rep&>0 LOOP set_writing_mode(mode_remplace|) set_fill_perimeter_visibility(1) ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' IF rep&=0 RETURN 1 ELSE RETURN rep& ENDIF ENDFUNC > FUNCTION mode_entrelace_256 ! 256 couleurs, ‚cran entrelac‚ ou pas ? ' Mettre le premier octet de l'‚cran … 0 BYTE{XBIOS(2)}=0 ' Choisir une couleur sans d‚calage VDI (la 4 par exemple) set_remplissage(2,8,4,-1) ' Faire un point sur le premier pixel de l'‚cran graf_mouse(m_off&,0) vdi_11(1,0,0,0,0,0,0,0,0) graf_mouse(m_on&,0) ' Lire le premier octet de l'‚cran en acc‚s direct ' Si le contenu est ‚gale … la couleur, l'‚cran n'est pas entrelac‚ ' et par cons‚quent, nous nous trouvons sur une carte graphique RETURN (BYTE{XBIOS(2)}<>4) ENDFUNC > FUNCTION mode_entrelace_16 ! 256 couleurs, ‚cran entrelac‚ ou pas ? ' Mettre le premier octet de l'‚cran … 0 BYTE{XBIOS(2)}=0 ' Choisir une couleur sans d‚calage VDI (la 4 par exemple) set_remplissage(2,8,4,-1) ' Faire un point sur le premier pixel de l'‚cran graf_mouse(m_off&,0) vdi_11(1,0,0,0,0,0,0,0,0) graf_mouse(m_on&,0) ' Lire le premier octet de l'‚cran en acc‚s direct ' Si le contenu des 4 bit de gauche ‚gale … la couleur, l'‚cran n'est pas ' entrelac‚ et par cons‚quent, nous nous trouvons sur une carte graphique RETURN (BYTE{XBIOS(2)}<>64) ENDFUNC ' ------------------------------------------------------------------------------ > PROCEDURE lancer_un_programme(che0&,che1&,lin0%,lin1%,n%) LOCAL v%,l%,fer! CHAR{masque%}="*"+CHR$(0) ' IF @s_exist({OB_SPEC(adr_parametres%,che0&)}) definition_fichier(adr_parametres%,che0&,nom_mouvement%,TRUE,FALSE,lin0%) ELSE definition_fichier(adr_parametres%,che0&,nom_mouvement%,TRUE,TRUE,lin0%) CHAR{{OB_SPEC(adr_parametres%,che0&)}}=CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%}+CHR$(0) ENDIF ' ' R‚cupŠre le nom du programme … lancer CHAR{commande%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%}+CHR$(0) minuscule(commande%) fer!=(INSTR("TTPTOSttptos",RIGHT$(CHAR{commande%},3))=0) ' chemin_en_cours(disque%,path%) ' IF che0&=chevis& CHAR{masque%}=LEFT$(TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}}),3)+CHR$(0) definition_fichier(adr_parametres%,che1&,nom_mouvement%,FALSE,FALSE,lin1%) CHAR{nom_mouvement%}=CHAR{{n%}}+CHR$(0) minuscule(nom_mouvement%) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%}+CHR$(0) IF NOT @s_exist(mem_che%) definition_fichier(adr_parametres%,che1&,nom_mouvement%,TRUE,TRUE,lin1%) CHAR{{OB_SPEC(adr_parametres%,che1&)}}=CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%}+CHR$(0) ENDIF v%=LEN(CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%}+CHR$(0)) CHAR{mem_che%}=CHR$(v%)+CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%}+CHR$(0) ELSE IF che0&=chetxt& CHAR{masque%}="pov"+CHR$(0) definition_fichier(adr_parametres%,che1&,nom_mouvement%,FALSE,FALSE,lin1%) IF INSTR(CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}},".") CHAR{path%}=CHAR{path%}+LEFT$(CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}},PRED(INSTR(CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}},".")))+"\"+CHR$(0) ELSE CHAR{path%}=CHAR{path%}+CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}}+"\"+CHR$(0) ENDIF minuscule(path%) CHAR{nom_mouvement%}=CHAR{{n%}}+CHR$(0) minuscule(nom_mouvement%) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%}+CHR$(0) IF NOT @s_exist(mem_che%) definition_fichier(adr_parametres%,che1&,nom_mouvement%,TRUE,TRUE,lin1%) CHAR{{OB_SPEC(adr_parametres%,che1&)}}=CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%}+CHR$(0) ENDIF v%=LEN(CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%}+CHR$(0)) CHAR{mem_che%}=CHR$(v%)+CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%}+CHR$(0) minuscule(mem_che%) ENDIF ' CHAR{mem_num%}=CHR$(0) ' Lancement du programme IF multitache! ' ' L…, c'est sous du multitƒche, donc par SHEL_WRITE, c'est mieux ' IF NOT fer! ' Ah! si TOS2GEM est l…, autant l'utiliser non ? IF tos2gem! IF che0&=cheext& lancer_un_tos_par_tos2gem(commande%,mem_num%,mem_num%,FALSE) ELSE lancer_un_tos_par_tos2gem(commande%,mem_che%,mem_num%,FALSE) ENDIF ELSE IF che0&=cheext& ~@shel_write(1,0,shw_parallel&,commande%,mem_num%) ELSE ~@shel_write(1,0,shw_parallel&,commande%,mem_che%) ENDIF ENDIF ELSE IF che0&=cheext& ~@shel_write(1,1,shw_parallel&,commande%,mem_num%) ELSE ~@shel_write(1,1,shw_parallel&,commande%,mem_che%) ENDIF ENDIF ELSE ' ' L…, c'est du monotƒche, donc, c'est classique, sauf pour les TTP ou TOS ' qui seront en fenˆtre grƒce … IGOR DUCHALSKI ou TOS2GEM ' IF NOT fer! ' PremiŠrement, v‚rifier si TOS2GEM est install‚. Si c'est le cas, ' l'utiliser...Sinon, utiliser la routine ASM de Gregor DUCHALSKY IF tos2gem! IF che0&=cheext& lancer_un_tos_par_tos2gem(commande%,mem_num%,mem_num%,FALSE) ELSE lancer_un_tos_par_tos2gem(commande%,mem_che%,mem_num%,FALSE) ENDIF ELSE IF che0&=cheext& ~GEMDOS(&H4B,shw_load_go&,L:commande%,L:mem_num%,L:mem_num%) ELSE ~GEMDOS(&H4B,shw_load_go&,L:commande%,L:mem_che%,L:mem_num%) ENDIF ENDIF ELSE fermeture_des_fenetres_temporaire form_dial(0,0,0,xmax&,ymax&,0,0,xmax&,ymax&) griser_barre_de_menu(TRUE) ' IF che0&=cheext& ~GEMDOS(&H4B,shw_load_go&,L:commande%,L:mem_num%,L:mem_num%) ELSE ~GEMDOS(&H4B,shw_load_go&,L:commande%,L:mem_che%,L:mem_num%) ENDIF ' griser_barre_de_menu(FALSE) reouverture_des_fenetres ENDIF ENDIF chemin_systeme RETURN ' ------------------------------------------------------------------------------ ' Lancement des TTP/TOS en fenˆtre selon deux m‚thodes. ' ------------------------------------------------------------------------------ > PROCEDURE lancer_un_tos_par_tos2gem(com%,par%,v%,w!) LOCAL t2g_date&,t2g_reserve%,t2g_init%,t2g_deinit%,t2g_switch_output% LOCAL t2g_text_buffer%,t2g_max_lines%,t2g_x_size%,t2g_y_size%,d&,vdih% LOCAL t2g_x_vis%,t2g_y_vis%,t2g_x_off%,t2g_y_off%,t2g_char_w%,t2g_char_h% LOCAL t2g_vdi_handle%,t2g_y_offset%,t2g_text_offset%,t2g_cursor_handle% LOCAL t2g_buffer_output%,t2g_color%,t2g_reserved%,t2g_reserved_size% LOCAL x1&,y1&,x2&,y2&,x3&,y3&,x4&,y4&,wi_kind&,i%,wglobal_hf&,a%,lar&,hau& LOCAL dx&,dy&,dw&,dh&,wx&,wy&,ww&,wh&,fx&,fy&,fw&,fh& ' ' Drapeau pour la fenˆtre. D'aprŠs les paramŠtrages CLR wi_kind& IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gclose&),aes_selected&) wi_kind&=BSET(wi_kind&,1) ! CLOSE ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gmove&),aes_selected&) wi_kind&=BSET(wi_kind&,0) ! NAME wi_kind&=BSET(wi_kind&,3) ! MOVE ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gfulle&),aes_selected&) wi_kind&=BSET(wi_kind&,2) ! FULLED ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gvert&),aes_selected&) wi_kind&=BSET(wi_kind&,6) ! UPARROW wi_kind&=BSET(wi_kind&,7) ! DNARROW wi_kind&=BSET(wi_kind&,8) ! VSLIDE ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gsize&),aes_selected&) wi_kind&=BSET(wi_kind&,5) ! SIZE ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2ghori&),aes_selected&) wi_kind&=BSET(wi_kind&,9) ! LFARROW wi_kind&=BSET(wi_kind&,10) ! RTARROW wi_kind&=BSET(wi_kind&,11) ! HSLIDE ENDIF ' ====================================================================== t2g_date&=INT{adresse_tos2gem%} ! Date t2g_reserve%={ADD(adresse_tos2gem%,2)} ! R‚serve t2g_init%={ADD(adresse_tos2gem%,6)} ! Init t2g_deinit%={ADD(adresse_tos2gem%,10)} ! D‚init t2g_switch_output%={ADD(adresse_tos2gem%,14)} ! Switch_output t2g_text_buffer%=ADD(adresse_tos2gem%,18) ! Text_buffer t2g_max_lines%=ADD(adresse_tos2gem%,22) ! Max_lines t2g_x_size%=ADD(adresse_tos2gem%,24) ! X_size t2g_y_size%=ADD(adresse_tos2gem%,26) ! Y_size t2g_x_vis%=ADD(adresse_tos2gem%,28) ! X_vis t2g_y_vis%=ADD(adresse_tos2gem%,30) ! Y_vis t2g_x_off%=ADD(adresse_tos2gem%,32) ! X_off t2g_y_off%=ADD(adresse_tos2gem%,34) ! Y_off t2g_char_w%=ADD(adresse_tos2gem%,36) ! Char_w t2g_char_h%=ADD(adresse_tos2gem%,38) ! Char_h t2g_vdi_handle%=ADD(adresse_tos2gem%,40) ! Vdi_handle t2g_y_offset%=ADD(adresse_tos2gem%,42) ! Y_offset t2g_text_offset%=ADD(adresse_tos2gem%,44) ! Text_offset t2g_cursor_handle%=ADD(adresse_tos2gem%,46) ! Cursor_handle t2g_buffer_output%=ADD(adresse_tos2gem%,48) ! Buffer_output t2g_color%=ADD(adresse_tos2gem%,50) ! Couleur t2g_reserved%=ADD(adresse_tos2gem%,52) ! Reserv‚ ' Le nombre d'‚l‚ments dans le champ 'Reserv‚' t2g_reserved_size%=7 ' ====================================================================== ' Lancer le r‚serve de TOS2GEM. Le 'AND 65535' est n‚cessaire car la ' valeur retourn‚e par TOS2GEM n'est cod‚e que sur un mot, par contre ' la fonction C: du GFA Basic re‡ois toujours un LONG IF (C:t2g_reserve%() AND 65535)=0 ' [React suitably if TOS2GEM cannot be reserved] ELSE ' Ouvrir une station VDI virtuel de travail pour TOS2GEM. vdih%=@open_virtuel_screen_workstation(@graf_handle(d&,d&,d&,d&)) IF vdih%=0 ' [React suitably if no workstation can be opened] ELSE ' Pour ˆtre sur de ne jamais d‚border de l'‚cran, on v‚rifie ' et on r‚duit les tailles de la fenˆtre si il y a lieu lar&=VAL(CHAR{{OB_SPEC(adr_parametres%,consxpov&)}}) hau&=VAL(CHAR{{OB_SPEC(adr_parametres%,consypov&)}}) WHILE lar&>global_wb& DEC lar& WEND WHILE hau&>global_hb& DEC hau& WEND CHAR{{OB_SPEC(adr_parametres%,consxpov&)}}=STR$(lar&,3) CHAR{{OB_SPEC(adr_parametres%,consypov&)}}=STR$(hau&,3) ' Ce paramŠtrage utilise la taille d‚finie dans EB_MODEL INT{t2g_x_size%}=lar& INT{t2g_y_size%}=hau& ' ATTENTION suivant *JAMAIS* … z‚ro! IF VAL(CHAR{{OB_SPEC(adr_parametres%,consypov&)}})=0 INT{t2g_max_lines%}=1 ELSE INT{t2g_max_lines%}=VAL(CHAR{{OB_SPEC(adr_parametres%,consypov&)}}) ENDIF ' R‚serv‚ la m‚moire du buffer de texte. {t2g_text_buffer%}=@prendre(MUL(INT{t2g_max_lines%},SUCC(INT{t2g_x_size%})),TRUE,3) IF {t2g_text_buffer%}=0 ' [React suitably if insufficient memory is available] ELSE ' Fixer les attributs de fonte et ‚crire sa taille dans le Cookie IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gfo4&),aes_selected&) set_text_mode(1,0,0,4,-1,vdih%) ELSE IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gfo6&),aes_selected&) set_text_mode(1,0,0,6,-1,vdih%) ELSE IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gfo13&),aes_selected&) set_text_mode(1,0,0,13,-1,vdih%) ENDIF CHAR{mem_num%}=" "+CHR$(0) inquire_text_extend(mem_num%,vdih%,x1&,y1&,x2&,y2&,x3&,y3&,x4&,y4&) INT{t2g_char_w%}=SUB(x2&,x1&) INT{t2g_char_h%}=SUB(y4&,y1&) ' Registre du handle VDI pour TOS2GEM. INT{t2g_vdi_handle%}=vdih% ' Pas de curseur sp‚cial, donc, on ‚crit z‚ro. INT{t2g_cursor_handle%}=0 ' Calcul des valeurs de 'x_vis' et 'y_vis'. ~@wind_get(0,wf_workxywh&,dx&,dy&,dw&,dh&) wind_calc(1,wi_kind&,dx&,dy&,dw&,dh&,wx&,wy&,ww&,wh&) INT{t2g_x_vis%}=ww& DIV INT{t2g_char_w%} INT{t2g_y_vis%}=wh& DIV INT{t2g_char_h%} IF INT{t2g_x_vis%}>INT{t2g_x_size%} INT{t2g_x_vis%}=INT{t2g_x_size%} ENDIF IF INT{t2g_y_vis%}>INT{t2g_y_size%} INT{t2g_y_vis%}=INT{t2g_y_size%} ENDIF ww&=MUL(INT{t2g_x_vis%},INT{t2g_char_w%}) wh&=MUL(INT{t2g_y_vis%},INT{t2g_char_h%}) wind_calc(0,wi_kind&,wx&,wy&,ww&,wh&,fx&,fy&,fw&,fh&) ' ' 'wx&', 'wy&', 'ww&' et 'wh&' contienent maintenant les ' coordonn‚es et les dimensions de l'‚cran TOS2GEM ' (La portion de travail de la fenˆtre), ' 'fx&', 'fy&', 'fw&' et 'fh&' d‚crivent la zone de la fenˆtre. ' Avant d'activer la redirection pour la premiŠre fois, une ' fenˆtre de cette taille doit ˆtre cr‚e et ouverte. ' wglobal_hf&=@wind_create(wi_kind&,fx&,fy&,fw&,fh&) IF w! a%=OB_SPEC(adr_divers%,lin4&) ! ...Titre fenˆtre ELSE a%=com% ENDIF wind_set(wglobal_hf&,wf_name&,WORD(SWAP(a%)),WORD(a%),0,0) wind_open(wglobal_hf&,fx&,fy&,fw&,fh&) ' ' Les coordonn‚es x et y sont maintenant copi‚es dans les zones ' 'x_off' et 'y_off' du Cookie. INT{t2g_x_off%}=wx& INT{t2g_y_off%}=wy& ' Pas de buffer de sortie, pas du support de la couleur. IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gpbuf&),aes_selected&) INT{t2g_buffer_output%}=0 ELSE IF BTST(OB_STATE(adr_parametre_tos2gem%,t2ggbuf&),aes_selected&) INT{t2g_buffer_output%}=462 ELSE IF BTST(OB_STATE(adr_parametre_tos2gem%,t2glbuf&),aes_selected&) INT{t2g_buffer_output%}=DIV(VAL(CHAR{{OB_SPEC(adr_parametre_tos2gem%,t2gbuff&)}}),-5) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gpal0&),aes_selected&) INT{t2g_color%}=0 ELSE IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gpal1&),aes_selected&) INT{t2g_color%}=1 ELSE IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gpal2&),aes_selected&) INT{t2g_color%}=2 ENDIF INT{t2g_text_offset%}=1 ' Pour finir, vider le champ 'reserved'. *A NE JAMAIS OUBLIER! * CLR i% DO INT{ADD(t2g_reserved%,SHL(i%,1))}=0 INC i% LOOP WHILE i%0 ! Si la fenˆtre est ouverte wind_close(wglobal_hf&) wind_delete(wglobal_hf&) ! ...Fermeture de la fenˆtre ENDIF ' ====================================================================== redraw_force(idx_info&,idx_animation&) ENDIF ENDIF ENDIF RETURN ' ------------------------------------------------------------------------------ > PROCEDURE bulles_d_aide ! Des aides en bulle LOCAL bubble_id&,handle_win&,mo_x&,mo_y&,mo_k&,nuf&,ob&,adr_li%,bubble%,arb_b% LOCAL arb_b%,c%,pc%,pcf% ' ' On commence par v‚rifier si BUBBLE GEM est accessible... ' CHAR{mem_che%}="BUBBLE "+CHR$(0) bubble_id&=@appl_find(mem_che%) ' IF bubble_id&>0 AND adr_bub%>0 ' ' On r‚cupŠre les informations n‚cessaire … l'appel de BUBBLE GEM ' mo_x&=INT{ADD(buf%,8)} mo_y&=INT{ADD(buf%,10)} nuf&=@numero_fenetre(@wind_find(mo_x&,mo_y&)) ' adr_li%={ADD(adr_bub%,SHL(nuf&,2))} IF adr_li%>0 ! Si la zone m‚moire existe ' arb_b%=@arbre_ressource(nuf&) ! Arbre des messages ' ob&=@objc_find(arb_b%,0,7,mo_x&,mo_y&) ' pc%=OB_TAIL(arb_b%,0) ! Combien d'enfants ?? WHILE pc%<>-1 ! Recherche du dernier enfant pcf%=pc% ! Mise en m‚moire du compteur pc%=OB_TAIL(arb_b%,pcf%) ! Objet suivant ? WEND ! Ok on est au dernier INC pcf% ' IF ob&0 ! Si l'objet est dans l'arbre ' IF LEFT$(CHAR{OB_SPEC(adr_li%,ob&)},1)<>"." ! Si le message existe bubble%=OB_SPEC(adr_li%,ob&) ' ' Puis, on effectue l'appel proprement dit ' INT{buf%}=bubblegem_show& ! Affichage demand‚ INT{ADD(buf%,2)}=ap_id& ! ap_id de EB Model INT{ADD(buf%,4)}=0 ! Toujours … 0 INT{ADD(buf%,6)}=mo_x& ! coords X du curseur souris INT{ADD(buf%,8)}=mo_y& ! Coords Y du curseur souris {ADD(buf%,10)}=bubble% ! adresse du buffer message INT{ADD(buf%,14)}=0 ! Toujours … 0 appl_write(bubble_id&,16,buf%) ! L'appel par APPL_WRITE ' ENDIF ENDIF ENDIF ENDIF RETURN ' ------------------------------------------------------------------------------ > PROCEDURE initialiser_ressource_1 ! Mettre en m‚moire adresses ressource 1 LOCAL adr% LOCAL x&,y&,w&,h& ~@xrsrc_gaddr(0,menu&,adr%) {ress%}=adr% ~@xrsrc_gaddr(0,info&,adr%) {ADD(ress%,4)}=adr% ' {ADD(ress%,8)} repporter dans Ressource Nø5 ~@xrsrc_gaddr(0,outils&,adr%) {ADD(ress%,12)}=adr% ~@xrsrc_gaddr(0,modifier&,adr%) {ADD(ress%,16)}=adr% ~@xrsrc_gaddr(0,moditail&,adr%) {ADD(ress%,20)}=adr% ' {ADD(ress%,24)} repporter dans Ressource Nø4 ' {ADD(ress%,28)} repporter dans Ressource Nø4 ' {ADD(ress%,32)} repporter dans Ressource Nø6 ' {ADD(ress%,36)} repporter dans Ressource Nø5 ~@xrsrc_gaddr(0,lumieres&,adr%) {ADD(ress%,40)}=adr% ~@xrsrc_gaddr(0,aide&,adr%) {ADD(ress%,44)}=adr% ~@xrsrc_gaddr(0,fonction&,adr%) {ADD(ress%,48)}=adr% ~@xrsrc_gaddr(0,statisti&,adr%) {ADD(ress%,52)}=adr% ~@xrsrc_gaddr(0,animatio&,adr%) {ADD(ress%,56)}=adr% ~@xrsrc_gaddr(0,arbmerci&,adr%) {ADD(ress%,60)}=adr% ~@xrsrc_gaddr(0,posecame&,adr%) {ADD(ress%,64)}=adr% ' form_center({ADD(ress%,12)},x&,y&,w&,h&) form_center({ADD(ress%,16)},x&,y&,w&,h&) form_center({ADD(ress%,20)},x&,y&,w&,h&) form_center({ADD(ress%,40)},x&,y&,w&,h&) form_center({ADD(ress%,52)},x&,y&,w&,h&) form_center({ADD(ress%,56)},x&,y&,w&,h&) form_center({ADD(ress%,64)},x&,y&,w&,h&) RETURN > PROCEDURE initialiser_ressource_2 ! Mettre en m‚moire adresses ressource 2 LOCAL adr% LOCAL x&,y&,w&,h& ~@xrsrc_gaddr(0,lancepov&,adr%) {ADD(ress%,68)}=adr% ~@xrsrc_gaddr(0,chemintr&,adr%) {ADD(ress%,72)}=adr% ~@xrsrc_gaddr(0,bicubics&,adr%) {ADD(ress%,76)}=adr% ~@xrsrc_gaddr(0,copier&,adr%) {ADD(ress%,80)}=adr% ~@xrsrc_gaddr(0,popupdiv&,adr%) {ADD(ress%,84)}=adr% ' {ADD(ress%,88)} inutilis‚ ' form_center({ADD(ress%,68)},x&,y&,w&,h&) form_center({ADD(ress%,72)},x&,y&,w&,h&) form_center({ADD(ress%,76)},x&,y&,w&,h&) form_center({ADD(ress%,80)},x&,y&,w&,h&) RETURN > PROCEDURE initialiser_ressource_3 ! Mettre en m‚moire adresses ressource 3 LOCAL adr% LOCAL x&,y&,w&,h& ' {ADD(ress%,92)} inutilis‚ ' {ADD(ress%,96)} inutilis‚ ' {ADD(ress%,100)} inutilis‚ ~@xrsrc_gaddr(0,divpopu0&,adr%) {ADD(ress%,112)}=adr% ~@xrsrc_gaddr(0,divpopu1&,adr%) {ADD(ress%,224)}=adr% ~@xrsrc_gaddr(0,divpopu2&,adr%) {ADD(ress%,228)}=adr% ~@xrsrc_gaddr(0,divpopu3&,adr%) {ADD(ress%,232)}=adr% ' {ADD(ress%,116)} inutilis‚ ' {ADD(ress%,120)} inutilis‚ ' {ADD(ress%,124)} inutilis‚ ' {ADD(ress%,128)} repporter dans Ressource Nø5 ~@xrsrc_gaddr(0,messages&,adr%) {ADD(ress%,132)}=adr% ~@xrsrc_gaddr(0,transfor&,adr%) {ADD(ress%,136)}=adr% ~@xrsrc_gaddr(0,predefini&,adr%) {ADD(ress%,104)}=adr% ' form_center({ADD(ress%,104)},x&,y&,w&,h&) form_center({ADD(ress%,136)},x&,y&,w&,h&) RETURN > PROCEDURE initialiser_ressource_4 ! Mettre en m‚moire adresses ressource 4 LOCAL adr% LOCAL x&,y&,w&,h& ~@xrsrc_gaddr(0,les_calq&,adr%) {ADD(ress%,140)}=adr% ~@xrsrc_gaddr(0,anajauge&,adr%) {ADD(ress%,144)}=adr% ~@xrsrc_gaddr(0,statobje&,adr%) {ADD(ress%,148)}=adr% ' {ADD(ress%,152)} repporter dans Ressource Nø5 ~@xrsrc_gaddr(0,popupara&,adr%) {ADD(ress%,156)}=adr% ~@xrsrc_gaddr(0,quartic&,adr%) {ADD(ress%,160)}=adr% ~@xrsrc_gaddr(0,quadric&,adr%) {ADD(ress%,164)}=adr% ~@xrsrc_gaddr(0,fen_vue&,adr%) {ADD(ress%,172)}=adr% ~@xrsrc_gaddr(0,biblio&,adr%) {ADD(ress%,176)}=adr% ~@xrsrc_gaddr(0,popincl&,adr%) {ADD(ress%,180)}=adr% ~@xrsrc_gaddr(0,modules&,adr%) {ADD(ress%,184)}=adr% ~@xrsrc_gaddr(0,vue_fine&,adr%) {ADD(ress%,188)}=adr% ~@xrsrc_gaddr(0,jaugcour&,adr%) {ADD(ress%,192)}=adr% ' {ADD(ress%,196)} repporter dans Ressource Nø5 ' {ADD(ress%,200)} repporter dans Ressource Nø5 ' {ADD(ress%,204)} inutilis‚ ~@xrsrc_gaddr(0,calques&,adr%) {ADD(ress%,208)}=adr% ~@xrsrc_gaddr(0,inftemps&,adr%) {ADD(ress%,168)}=adr% ~@xrsrc_gaddr(0,infobjet&,adr%) {ADD(ress%,24)}=adr% ~@xrsrc_gaddr(0,par_t2g&,adr%) {ADD(ress%,28)}=adr% ' form_center({ADD(ress%,24)},x&,y&,w&,h&) form_center({ADD(ress%,28)},x&,y&,w&,h&) form_center({ADD(ress%,140)},x&,y&,w&,h&) form_center({ADD(ress%,144)},x&,y&,w&,h&) form_center({ADD(ress%,148)},x&,y&,w&,h&) form_center({ADD(ress%,160)},x&,y&,w&,h&) form_center({ADD(ress%,164)},x&,y&,w&,h&) form_center({ADD(ress%,168)},x&,y&,w&,h&) form_center({ADD(ress%,176)},x&,y&,w&,h&) form_center({ADD(ress%,180)},x&,y&,w&,h&) form_center({ADD(ress%,184)},x&,y&,w&,h&) form_center({ADD(ress%,188)},x&,y&,w&,h&) form_center({ADD(ress%,192)},x&,y&,w&,h&) form_center({ADD(ress%,208)},x&,y&,w&,h&) RETURN > PROCEDURE initialiser_ressource_5 ! Mettre en m‚moire adresses ressource 5 LOCAL adr% LOCAL x&,y&,w&,h& ~@xrsrc_gaddr(0,multsele&,adr%) {ADD(ress%,212)}=adr% ' {ADD(ress%,128)} inutilis‚ ' {ADD(ress%,8)} inutilis‚ ' {ADD(ress%,36)} inutilis‚ ' {ADD(ress%,152)} inutilis‚ ~@xrsrc_gaddr(0,subjecti&,adr%) {ADD(ress%,200)}=adr% ~@xrsrc_gaddr(0,divers&,adr%) {ADD(ress%,108)}=adr% ~@xrsrc_gaddr(0,lauteur&,adr%) {ADD(ress%,196)}=adr% ~@xrsrc_gaddr(0,image_fond&,adr%) {ADD(ress%,216)}=adr% ~@xrsrc_gaddr(0,hierarchie&,adr%) {ADD(ress%,220)}=adr% ' form_center({ADD(ress%,212)},x&,y&,w&,h&) form_center({ADD(ress%,200)},x&,y&,w&,h&) form_center({ADD(ress%,196)},x&,y&,w&,h&) form_center({ADD(ress%,216)},x&,y&,w&,h&) form_center({ADD(ress%,220)},x&,y&,w&,h&) RETURN > PROCEDURE initialiser_ressource_6 ! Mettre en m‚moire adresses ressource 6 LOCAL adr% ' ~@xrsrc_gaddr(0,infmotif&,adr%) {ADD(ress%,32)}=adr% ' RETURN > PROCEDURE initialiser_les_bulles ! Mettre en m‚moire adresse des bulles. LOCAL adr% ~@xrsrc_gaddr(0,bgem_000&,adr%) {adr_bub%}=adr% ~@xrsrc_gaddr(0,bgem_001&,adr%) {ADD(adr_bub%,4)}=adr% ~@xrsrc_gaddr(0,bgem_002&,adr%) {ADD(adr_bub%,8)}=adr% ~@xrsrc_gaddr(0,bgem_003&,adr%) {ADD(adr_bub%,12)}=adr% ~@xrsrc_gaddr(0,bgem_004&,adr%) {ADD(adr_bub%,16)}=adr% ~@xrsrc_gaddr(0,bgem_005&,adr%) {ADD(adr_bub%,20)}=adr% ~@xrsrc_gaddr(0,bgem_006&,adr%) {ADD(adr_bub%,24)}=adr% ~@xrsrc_gaddr(0,bgem_007&,adr%) {ADD(adr_bub%,28)}=adr% ~@xrsrc_gaddr(0,bgem_008&,adr%) {ADD(adr_bub%,32)}=adr% ~@xrsrc_gaddr(0,bgem_009&,adr%) {ADD(adr_bub%,36)}=adr% ~@xrsrc_gaddr(0,bgem_010&,adr%) {ADD(adr_bub%,40)}=adr% ~@xrsrc_gaddr(0,bgem_011&,adr%) {ADD(adr_bub%,44)}=adr% ~@xrsrc_gaddr(0,bgem_012&,adr%) {ADD(adr_bub%,48)}=adr% ~@xrsrc_gaddr(0,bgem_013&,adr%) {ADD(adr_bub%,52)}=adr% ~@xrsrc_gaddr(0,bgem_014&,adr%) {ADD(adr_bub%,56)}=adr% ~@xrsrc_gaddr(0,bgem_015&,adr%) {ADD(adr_bub%,60)}=adr% ~@xrsrc_gaddr(0,bgem_016&,adr%) {ADD(adr_bub%,64)}=adr% ~@xrsrc_gaddr(0,bgem_017&,adr%) {ADD(adr_bub%,68)}=adr% ~@xrsrc_gaddr(0,bgem_018&,adr%) {ADD(adr_bub%,72)}=adr% ~@xrsrc_gaddr(0,bgem_019&,adr%) {ADD(adr_bub%,76)}=adr% ~@xrsrc_gaddr(0,bgem_020&,adr%) {ADD(adr_bub%,80)}=adr% ~@xrsrc_gaddr(0,bgem_021&,adr%) {ADD(adr_bub%,84)}=adr% ~@xrsrc_gaddr(0,bgem_022&,adr%) {ADD(adr_bub%,88)}=adr% ~@xrsrc_gaddr(0,bgem_023&,adr%) {ADD(adr_bub%,92)}=adr% ~@xrsrc_gaddr(0,bgem_024&,adr%) {ADD(adr_bub%,96)}=adr% ~@xrsrc_gaddr(0,bgem_025&,adr%) {ADD(adr_bub%,100)}=adr% ~@xrsrc_gaddr(0,bgem_026&,adr%) {ADD(adr_bub%,104)}=adr% ~@xrsrc_gaddr(0,bgem_027&,adr%) {ADD(adr_bub%,108)}=adr% ~@xrsrc_gaddr(0,bgem_028&,adr%) {ADD(adr_bub%,112)}=adr% ~@xrsrc_gaddr(0,bgem_029&,adr%) {ADD(adr_bub%,116)}=adr% RETURN > PROCEDURE definition_des_souris ! Quelques formes pour la souris LOCAL i&,zz%,zo_m%,fin_zo_m%,mot%,num& zo_m%=form_mouse% fin_zo_m%=ADD(zo_m%,814) CLR num& DO CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\curseur\"+STR$(num&)+".dat"+CHR$(0) IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} BGET #1,zo_m%,74 CLOSE #1 ELSE RESTORE donnees_reticule zz%=zo_m% CLR i& DO READ mot% CARD{zz%}=mot% ADD zz%,2 INC i& LOOP WHILE i&<37 ENDIF ADD zo_m%,74 INC num& LOOP WHILE zo_m% PROCEDURE parametrage_de_tos2gem ! On change un peu l'aspet de la console LOCAL fx&,fy&,fw&,fh&,evnt&,sor!,uni%,reponse& LOCAL temp&,top&,ad_f%,pr_f&,mem_t2g_fen&,mem_t2g_buf& ' sor!=FALSE ' **************************************************************************** ' Tout d'abord, sauvegarder la configuration pour pouvoir annuler ' Pour gagner de la place, puisqu'il y a 15 possibilit‚, on garde ' le tout dans les 15 premiers bits d'un mot de 16 bits. ' **************************************************************************** CLR mem_t2g_fen& IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gclose&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,0) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gmove&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,1) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gfulle&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,2) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gvert&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,3) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gsize&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,4) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2ghori&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,5) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gfo4&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,6) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gfo6&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,7) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gfo13&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,8) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gpbuf&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,9) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2ggbuf&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,10) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2glbuf&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,11) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gpal0&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,12) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gpal1&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,13) ENDIF IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gpal2&),aes_selected&) mem_t2g_fen&=BSET(mem_t2g_fen&,14) ENDIF mem_t2g_buf&=VAL(CHAR{{OB_SPEC(adr_parametre_tos2gem%,t2gbuff&)}}) ' **************************************************************************** form_center(adr_parametre_tos2gem%,fx&,fy&,fw&,fh&) form_dial(0,fx&,fy&,ADD(fw&,4),ADD(fh&,4),fx&,fy&,ADD(fw&,4),ADD(fh&,4)) ' videsouris ' pr_f&=@wind_create(0,fx&,fy&,fw&,fh&) IF pr_f&>-1 wind_open(pr_f&,fx&,fy&,fw&,fh&) ENDIF objc_draw(adr_parametre_tos2gem%,0,12,fx&,fy&,fw&,fh&,-1) ' DO ' Appel fonction xform_do() juste pour la fenˆtre concern‚e evnt&=@xform_do(&X110011,adr_parametre_tos2gem%,0) IF BTST(evnt&,0) ! EVENEMENT CLAVIER IF key&=&H11B ' ESC objc_change(adr_parametre_tos2gem%,annut2g&) videsouris objc_change(adr_parametre_tos2gem%,annut2g&) ' ob_state(adr_parametre_tos2gem%,t2gclose&,aes_selected&,BTST(mem_t2g_fen&,0)) ob_state(adr_parametre_tos2gem%,t2gmove&,aes_selected&,BTST(mem_t2g_fen&,1)) ob_state(adr_parametre_tos2gem%,t2gfulle&,aes_selected&,BTST(mem_t2g_fen&,2)) ob_state(adr_parametre_tos2gem%,t2gvert&,aes_selected&,BTST(mem_t2g_fen&,3)) ob_state(adr_parametre_tos2gem%,t2gsize&,aes_selected&,BTST(mem_t2g_fen&,4)) ob_state(adr_parametre_tos2gem%,t2ghori&,aes_selected&,BTST(mem_t2g_fen&,5)) ob_state(adr_parametre_tos2gem%,t2gfo4&,aes_selected&,BTST(mem_t2g_fen&,6)) ob_state(adr_parametre_tos2gem%,t2gfo6&,aes_selected&,BTST(mem_t2g_fen&,7)) ob_state(adr_parametre_tos2gem%,t2gfo13&,aes_selected&,BTST(mem_t2g_fen&,8)) ob_state(adr_parametre_tos2gem%,t2gpbuf&,aes_selected&,BTST(mem_t2g_fen&,9)) ob_state(adr_parametre_tos2gem%,t2ggbuf&,aes_selected&,BTST(mem_t2g_fen&,10)) ob_state(adr_parametre_tos2gem%,t2glbuf&,aes_selected&,BTST(mem_t2g_fen&,11)) ob_state(adr_parametre_tos2gem%,t2gpal0&,aes_selected&,BTST(mem_t2g_fen&,12)) ob_state(adr_parametre_tos2gem%,t2gpal1&,aes_selected&,BTST(mem_t2g_fen&,13)) ob_state(adr_parametre_tos2gem%,t2gpal2&,aes_selected&,BTST(mem_t2g_fen&,14)) CHAR{{OB_SPEC(adr_parametre_tos2gem%,t2gbuff&)}}=STR$(mem_t2g_buf&,3) sor!=TRUE ENDIF ENDIF IF BTST(evnt&,1) $S&,$S> SELECT objet& CASE t2gclose&,t2gmove&,t2gfulle&,t2gvert&,t2gsize&,t2ghori& videsouris CASE annut2g& objc_change(adr_parametre_tos2gem%,objet&) ' ob_state(adr_parametre_tos2gem%,t2gclose&,aes_selected&,BTST(mem_t2g_fen&,0)) ob_state(adr_parametre_tos2gem%,t2gmove&,aes_selected&,BTST(mem_t2g_fen&,1)) ob_state(adr_parametre_tos2gem%,t2gfulle&,aes_selected&,BTST(mem_t2g_fen&,2)) ob_state(adr_parametre_tos2gem%,t2gvert&,aes_selected&,BTST(mem_t2g_fen&,3)) ob_state(adr_parametre_tos2gem%,t2gsize&,aes_selected&,BTST(mem_t2g_fen&,4)) ob_state(adr_parametre_tos2gem%,t2ghori&,aes_selected&,BTST(mem_t2g_fen&,5)) ob_state(adr_parametre_tos2gem%,t2gfo4&,aes_selected&,BTST(mem_t2g_fen&,6)) ob_state(adr_parametre_tos2gem%,t2gfo6&,aes_selected&,BTST(mem_t2g_fen&,7)) ob_state(adr_parametre_tos2gem%,t2gfo13&,aes_selected&,BTST(mem_t2g_fen&,8)) ob_state(adr_parametre_tos2gem%,t2gpbuf&,aes_selected&,BTST(mem_t2g_fen&,9)) ob_state(adr_parametre_tos2gem%,t2ggbuf&,aes_selected&,BTST(mem_t2g_fen&,10)) ob_state(adr_parametre_tos2gem%,t2glbuf&,aes_selected&,BTST(mem_t2g_fen&,11)) ob_state(adr_parametre_tos2gem%,t2gpal0&,aes_selected&,BTST(mem_t2g_fen&,12)) ob_state(adr_parametre_tos2gem%,t2gpal1&,aes_selected&,BTST(mem_t2g_fen&,13)) ob_state(adr_parametre_tos2gem%,t2gpal2&,aes_selected&,BTST(mem_t2g_fen&,14)) CHAR{{OB_SPEC(adr_parametre_tos2gem%,t2gbuff&)}}=STR$(mem_t2g_buf&,3) sor!=TRUE CASE valit2g& objc_change(adr_parametre_tos2gem%,objet&) sor!=TRUE ENDSELECT ENDIF EXIT IF sor! LOOP form_dial(3,fx&,fy&,ADD(fw&,4),ADD(fh&,4),fx&,fy&,ADD(fw&,4),ADD(fh&,4)) videsouris ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' RETURN > PROCEDURE effectuer_le_calage ! Allez, la on cale les objets LOCAL bouge&,reference& LOCAL auniv%,buniv% LOCAL apx,apy,apz LOCAL atx,aty,atz LOCAL arx,ary,arz LOCAL bpx,bpy,bpz LOCAL btx,bty,btz LOCAL brx,bry,brz LOCAL bx,by,bz bouge&=PRED(VAL(CHAR{{OB_SPEC(adr_calage%,SUB(numacale&,2))}})) auniv%=@adresse_objet(bouge&) atx=ROUND(SINGLE{ADD(auniv%,14)}/2,3) aty=ROUND(SINGLE{ADD(auniv%,18)}/2,3) atz=ROUND(SINGLE{ADD(auniv%,22)}/2,3) arx=ROUND(SINGLE{ADD(auniv%,26)},3) ary=ROUND(SINGLE{ADD(auniv%,30)},3) arz=ROUND(SINGLE{ADD(auniv%,34)},3) IF BTST(OB_STATE(adr_calage%,refex1&),aes_disable&) bx=VAL(CHAR{{OB_SPEC(adr_calage%,refx&)}}) by=VAL(CHAR{{OB_SPEC(adr_calage%,refy&)}}) bz=VAL(CHAR{{OB_SPEC(adr_calage%,refz&)}}) CLR btx,bty,btz,brx,bry,brz ELSE reference&=PRED(VAL(CHAR{{OB_SPEC(adr_calage%,SUB(numrefe&,2))}})) buniv%=@adresse_objet(reference&) bpx=ROUND(SINGLE{ADD(buniv%,2)},3) bpy=ROUND(SINGLE{ADD(buniv%,6)},3) bpz=ROUND(SINGLE{ADD(buniv%,10)},3) btx=ROUND(SINGLE{ADD(buniv%,14)}/2,3) bty=ROUND(SINGLE{ADD(buniv%,18)}/2,3) btz=ROUND(SINGLE{ADD(buniv%,22)}/2,3) brx=ROUND(SINGLE{ADD(buniv%,26)},3) bry=ROUND(SINGLE{ADD(buniv%,30)},3) brz=ROUND(SINGLE{ADD(buniv%,34)},3) IF BTST(OB_STATE(adr_calage%,refex1&),aes_selected&) bx=bpx ELSE IF BTST(OB_STATE(adr_calage%,refex2&),aes_selected&) bx=bpx-btx ELSE IF BTST(OB_STATE(adr_calage%,refex3&),aes_selected&) bx=bpx+btx ENDIF IF BTST(OB_STATE(adr_calage%,refey1&),aes_selected&) by=bpy ELSE IF BTST(OB_STATE(adr_calage%,refey2&),aes_selected&) by=bpy+bty ELSE IF BTST(OB_STATE(adr_calage%,refey3&),aes_selected&) by=bpy-bty ENDIF IF BTST(OB_STATE(adr_calage%,refez1&),aes_selected&) bz=bpz ELSE IF BTST(OB_STATE(adr_calage%,refez2&),aes_selected&) bz=bpz-btz ELSE IF BTST(OB_STATE(adr_calage%,refez3&),aes_selected&) bz=bpz+btz ENDIF ENDIF IF BTST(OB_STATE(adr_calage%,acalerx1&),aes_selected&) apx=bx ELSE IF BTST(OB_STATE(adr_calage%,acalerx2&),aes_selected&) apx=bx+atx ELSE IF BTST(OB_STATE(adr_calage%,acalerx3&),aes_selected&) apx=bx-atx ENDIF IF BTST(OB_STATE(adr_calage%,acalery1&),aes_selected&) apy=by ELSE IF BTST(OB_STATE(adr_calage%,acalery2&),aes_selected&) apy=by-aty ELSE IF BTST(OB_STATE(adr_calage%,acalery3&),aes_selected&) apy=by+aty ENDIF IF BTST(OB_STATE(adr_calage%,acalerz1&),aes_selected&) apz=bz ELSE IF BTST(OB_STATE(adr_calage%,acalerz2&),aes_selected&) apz=bz+atz ELSE IF BTST(OB_STATE(adr_calage%,acalerz3&),aes_selected&) apz=bz-atz ENDIF SINGLE{ADD(auniv%,2)}=apx SINGLE{ADD(auniv%,6)}=apy SINGLE{ADD(auniv%,10)}=apz objet_actif&=bouge& modif_normale!=FALSE recalcul_2d_pour_l_ecran(physique%,auniv%,TRUE) RETURN ' > PROCEDURE place_le_clipping(xcl&,ycl&,wcl&,hcl&,VAR mecrx&,mecry&) ' IF clip_actif! set_clipping_rectangle(0,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) clip_actif!=FALSE ENDIF ' calcul_la_zone_clippe(xcl&,ycl&,wcl&,hcl&,mecrx&,mecry&) ' set_clipping_rectangle(1,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) clip_actif!=TRUE ' RETURN > PROCEDURE enleve_le_clipping(xcl&,ycl&,wcl&,hcl&,VAR mecrx&,mecry&) ' IF clip_actif! set_clipping_rectangle(0,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) clip_actif!=FALSE ENDIF ' calcul_la_zone_clippe(xcl&,ycl&,wcl&,hcl&,mecrx&,mecry&) ' RETURN > PROCEDURE calcul_la_zone_clippe(xcl&,ycl&,wcl&,hcl&,VAR mecrx&,mecry&) ' global_xf&=xcl& global_yf&=ycl& global_wf&=wcl& global_hf&=hcl& mecrx&=ADD(global_xf&,DIV(global_wf&,2)) mecry&=ADD(global_yf&,DIV(global_hf&,2)) global_xf2&=PRED(ADD(global_xf&,global_wf&)) global_yf2&=PRED(ADD(global_yf&,global_hf&)) IF global_xf2&>xmax& global_wf&=SUB(global_wf&,SUB(global_xf2&,xmax&)) ENDIF IF global_yf2&>ymax& global_hf&=SUB(global_hf&,SUB(global_yf2&,ymax&)) ENDIF global_xf2&=PRED(ADD(global_xf&,global_wf&)) global_yf2&=PRED(ADD(global_yf&,global_hf&)) ' RETURN ' ***************************** Gestion des COOKIEs **************************** > PROCEDURE etude_du_systeme ! Mais quelle machine est ce donc ? LOCAL super%,adr%,type%,slot%,long%,magic_cookie% son|=255 pro|=255 copro|=255 video|=255 machine|=255 magic!=FALSE mint!=FALSE geneva!=FALSE mode_winx!=FALSE mode_nvdi!=FALSE bubble_gem!=FALSE mode_naes!=FALSE mode_myaes!=FALSE tos2gem!=FALSE mode_fvdi!=FALSE CLR magic_version& gdos!=FALSE super%=GEMDOS(&H20,L:0) ! Passage en mode SUPERVISEUR adr%={&H5A0} ! Pointeur sur le premier COOKIE IF adr%=0 ' Il n'y a aucun COOKIEs en m‚moire ' Il est donc impossible de d‚terminer le type d'ATARI sur lequel ' on se trouve par le systŠme des COOKIEs son|=0 pro|=0 copro|=0 video|=0 machine|=0 ELSE CLR slot% WHILE {ADD(adr%,SHL(slot%,3))}<>0 long%={ADD(ADD(adr%,SHL(slot%,3)),4)} $S%,$S> SELECT LEFT$(CHAR{ADD(adr%,SHL(slot%,3))},4) CASE "_MCH" IF machine|=255 SELECT INT(SWAP(long%)) ! Mot de poid fort CASE 0 ! STf machine|=0 CASE 1 SELECT INT(long%) ! Mot de poid faible CASE 0 ! STe machine|=1 CASE 1 ! ST Book machine|=2 CASE 8 ! STE avec IDE machine|=3 CASE 16 ! Mega STE machine|=4 CASE 256 ! Falcon machine|=5 ENDSELECT CASE 2 ! TT machine|=6 CASE 3 ! Falcon machine|=5 CASE 4 ! MILAN machine|=7 CASE 5 ! ARANYM l'‚mulateur ultime machine|=9 DEFAULT ! Inconnu (par d‚faut STf) machine|=0 ENDSELECT ENDIF CASE "_MIL" ! Ah! tiens! un MILAN machine|=7 CASE "hade" ! Oh! un HADES machine|=8 CASE "_CPU" SELECT long% CASE 0 ! 68000 pro|=0 CASE 10 ! 68010 pro|=1 CASE 20 ! 68020 pro|=2 CASE 30 ! 68030 pro|=3 CASE 40 ! 68040 pro|=4 CASE 60 ! 68060 pro|=5 DEFAULT ! Inconnue (68000 par d‚faut) pro|=0 ENDSELECT CASE "_FPU" SELECT INT(SWAP(long%)) ! Mot de poid fort CASE 0 ! Pas de copro copro|=0 CASE 1 ! SFP004 copro|=1 CASE 2 ! 68881 ou 68882 copro|=2 CASE 3 ! 68881 ou 68882 et SFP004 copro|=3 CASE 4 ! 68881 copro|=4 CASE 5 ! 68881 et SFP004 copro|=5 CASE 6 ! 68882 copro|=6 CASE 7 ! 68882 et SFP004 copro|=7 CASE 8 ! 68040 copro|=8 CASE 9 ! 68040 et SFP004 copro|=9 DEFAULT ! par d‚faut pas de copro copro|=0 ENDSELECT CASE "_VDO" SELECT INT(SWAP(long%)) ! Mot de poid fort CASE 0 ! STf video|=0 CASE 1 SELECT INT(long%) ! Mot de poid faible CASE 0 ! STe Scroll hard video|=1 CASE 1 ! ST Book video|=2 ENDSELECT CASE 2 ! TT video|=3 CASE 3 ! FALCON video|=4 CASE 4 ! Carte PCI video|=5 DEFAULT ! video|=0 ENDSELECT CASE "_SWI" ' Etat des switch avec INT(long%) ' mot de poid faible. CASE "_SND" IF BTST(long%,0) ! PSG pr‚sent son|=0 ENDIF IF BTST(long%,1) ! 8 Bit DMA pr‚sent son|=1 ! (STe, TT et FALCON) ENDIF IF BTST(long%,2) ! 16 Bit CODEC pr‚sent (FALCON) son|=2 ENDIF IF BTST(long%,3) ! DSP pr‚sent (FALCON) son|=3 ENDIF IF BTST(long%,4) ! MATRIX pr‚sent (FALCON) son|=4 ENDIF CASE "MagX" ! Multitƒche avec MagiC magic_cookie%=long% magic_version&=INT{ADD({ADD(magic_cookie%,8)},48)} magic_date%={ADD({ADD(magic_cookie%,8)},16)} magic!=TRUE CASE "Gnva" ! Multitƒche avec Geneva geneva!=TRUE CASE "MiNT" ! Multitƒche avec MiNT mint!=TRUE CASE "nAES" ! N AES mode_naes!=TRUE ver_naes1|=VAL(MID$(HEX$(INT{long%},4),2,1)) ver_naes2|=VAL(MID$(HEX$(INT{long%},4),2,1)) ver_naes3|=VAL(RIGHT$(HEX$(INT{long%},4),1)) dat_naes1|=VAL("%"+RIGHT$(BIN$(INT{ADD(long%,2)},16),5)) dat_naes2|=VAL("%"+MID$(BIN$(INT{ADD(long%,2)},16),8,4)) dat_naes3&=ADD(1980,VAL("%"+LEFT$(BIN$(INT{ADD(long%,2)},16),7))) CASE "_MAS" mode_myaes!=TRUE CASE "PSND" ! PSOUND de Loic SEBALD son|=5 psound_fnct%=VAL("&H"+LEFT$(HEX$(long%),4)) psound0|=VAL("$"+MID$(HEX$(long%),5,2)) psound1|=VAL("$"+RIGHT$(HEX$(long%),2)) CASE "BGEM" ! BUBBLEGEM bubble_gem!=TRUE bubble_release%=CARD{ADD(long%,8)} CASE "NVDI" ! NVDI mode_nvdi!=TRUE ver_nvdi1|=VAL(LEFT$(HEX$(CARD{long%},4),2)) ver_nvdi2|=VAL(RIGHT$(HEX$(CARD{long%},4),2)) dat_nvdi1|=VAL(LEFT$(HEX$({ADD(long%,2)},8),2)) dat_nvdi2|=VAL(MID$(HEX$({ADD(long%,2)},8),3,2)) dat_nvdi3&=VAL(RIGHT$(HEX$({ADD(long%,2)},8),4)) CASE "LDGM" ldg_gl%=long% ldg_version%=WORD{ldg_gl%} ldg_path%=ADD(ldg_gl%,2) ldg_garbage%=WORD{ADD(ldg_gl%,130)} ldg_idle%=WORD{ADD(ldg_gl%,132)} ldg_libexec%={ADD(ldg_gl%,134)} ldg_libterm%={ADD(ldg_gl%,138)} ldg_find%={ADD(ldg_gl%,142)} ldg_libexec_evnt%={ADD(ldg_gl%,146)} ldg_error%={ADD(ldg_gl%,150)} CASE "_FDC" ' CHAR{long%} CASE "_JPD" ' "D‚codeur JPEG pr‚sent" CASE "_AFM" ' "Audio Fun Machine pr‚sent" CASE "WINX" mode_winx!=TRUE CASE "T2GM" tos2gem!=TRUE adresse_tos2gem%=long% CASE "FSMC" IF CHAR{long%}="_FSM" ! "FSM GDOS pr‚sent" speedogdos!=TRUE ELSE IF CHAR{long%}="_SPD" ! "SPEEDO GDOS pr‚sent" speedogdos!=TRUE ENDIF CASE "fVDI" mode_fvdi!=TRUE ENDSELECT INC slot% WEND ENDIF ~GEMDOS(&H20,L:super%) ! Retour en mode UTILISATEUR pro|=0*(pro|=255)-pro|*(pro|<>0) copro|=0*(copro|=255)-copro|*(copro|<>0) video|=0*(video|=255)-video|*(video|<>0) machine|=0*(machine|=255)-machine|*(machine|<>0) IF NOT speedogdos! ! Si SPEEDOGDOS ou FSMGDOS gdos!=GDOS? ! est absent alors on test ENDIF ! le bon vieux GDOS nombre_de_fontes%=1 ! est disponible pour ‚crire ' CLR winx_version& IF @wind_get(0,wf_return&,d&,d&,d&,d&)=0 IF @wind_get(0,wf_winx&,winx_version&,d&,d&,d&)=wf_winx& winx_beta&=VAL("%"+LEFT$(BIN$(winx_version&,16),4)) winx_major&=VAL("%"+MID$(BIN$(winx_version&,16),5,4)) winx_minor&=VAL("%"+MID$(BIN$(winx_version&,16),9,4)) winx_ident&=VAL("%"+RIGHT$(BIN$(winx_version&,16),4)) ELSE CLR winx_version& ENDIF ENDIF IF INT{{ADD(GB,4)}}=>&H400 OR magic_version&=>&H200 OR winx_version&=>&H210 OR APPL_FIND("AGI?")=0 INT{ADD(GCONTRL,2)}=1 INT{ADD(GCONTRL,4)}=5 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=0 GEMSYS 130 ' gout1&=INT{ADD(GINTOUT,2)} ' gout2&=INT{ADD(GINTOUT,4)} ' gout3&=INT{ADD(GINTOUT,6)} ' gout4&=INT{ADD(GINTOUT,8)} ' RETURN INT{GINTOUT} ENDIF RETURN ' *********************** Modification des RESSOURCES ************************** > PROCEDURE environnement_mono ! La, le ressource est monochrome LOCAL i&,adr% FOR i&=0 TO max_res& adr%={ADD(ress%,SHL(i&,2))} IF adr%>0 IF fond_gris! rsrc_color(adr%,noir&,4) ELSE rsrc_color(adr%,blanc&,0) ENDIF ENDIF NEXT i& RETURN > PROCEDURE environnement_coul ! Ah ! la, il est en couleurs LOCAL i&,adr% FOR i&=0 TO max_res& adr%={ADD(ress%,SHL(i&,2))} IF adr%>0 IF fond_gris! rsrc_color(adr%,gris_clair&,7) ELSE rsrc_color(adr%,blanc&,0) ENDIF ENDIF NEXT i& RETURN > PROCEDURE rsrc_color(arb%,coul&,tram_des&) LOCAL c%,type&,type_suivant&,pc%,ob_spec%,te_color&,acoul& ' acoul&=coul& pc%=OB_TAIL(arb%,0) ! Combien d'enfants ?? WHILE pc%<>-1 ! Recherche du dernier enfant pcf%=pc% pc%=OB_TAIL(arb%,pcf%) WEND ! Ok on est au dernier INC pcf% CLR c% DO IF (arb%=adr_fenetre%) AND ((c%=fenvue07&) OR (c%=fenvue27&) OR (c%=fenvue37&) OR (c%=fenvue47&)) IF fond_gris! ' ' Alors l…, c'est le gag. Sur FALCON (ou tout autre AES > 3.40) ' le GEM considŠre les flags AES_FOND et AES_INDICATEUR prioritaires ' sur la couleur de l'objet. Donc, il ne faut pas que l'objet contienne ' l'un de ces deux flags. C'est ici qu'on le marque pour pouvoir colorer ' la fenˆtre, aprŠs on l'enlŠve pour que le l'AES ne change pas sa ' couleur en cours d'affichage. Voil…, voil… mon petit Fran‡ois. ' Bien sur, ceci n'est utile que parce que la couleur de fond de mes ' fenˆtres de vue est grise fonc‚e. Alors que dans l'AES, c'est le ' gris clair qui est utilis‚. ob_flags(arb%,c%,aes_fond&,TRUE) ' IF (coul&=gris_clair&) OR ((coul&=blanc&) AND (magic! OR mode_myaes!) AND (maxcol&>3)) coul&=gris_fonce& ELSE IF coul&=noir& coul&=blanc& ENDIF ELSE coul&=acoul& ENDIF ELSE coul&=acoul& ENDIF type&=OB_TYPE(arb%,c%) ! Recherche du type de l'‚l‚ment ' -------------------------------------------------------------------------- ' L…, j'ai enfin compris pourquoi sous MagiC! la 3D de mes ressources ' n'‚tait pas bonne. En fait, si un objet est s‚lectionn‚ avec l'un des ' flags 3D activ‚, alors, il est consid‚r‚ par MagiC! comme un objet 3D ' invers‚. Et ‡a ! EB_MODEL n'aime pas du tout. Il me faut donc enlever ' les flags de s‚lection des deux objets formant la 3D de EB_MODEL, mais ' cela uniquement sous MagiC! (et MyAES si cookie _MAS present.) IF magic! ! OR mode_myaes! IF c% SELECT arb% CASE adr_popup_divers% ob_state(arb%,chxprimi&,aes_selected&,FALSE) ob_state(arb%,chxfnct&,aes_selected&,FALSE) ob_state(arb%,chxcoul&,aes_selected&,FALSE) ob_state(arb%,chxcalqu&,aes_selected&,FALSE) ob_state(arb%,chxrendu&,aes_selected&,FALSE) ob_state(arb%,chxoutfi&,aes_selected&,FALSE) ob_state(arb%,chxtrace&,aes_selected&,FALSE) ob_state(arb%,chxhalde&,aes_selected&,FALSE) ob_state(arb%,chxhalty&,aes_selected&,FALSE) ob_state(arb%,chxmosai&,aes_selected&,FALSE) ob_state(arb%,chxbicub&,aes_selected&,FALSE) ob_state(arb%,chxstep&,aes_selected&,FALSE) ob_state(arb%,chxflatn&,aes_selected&,FALSE) ob_state(arb%,chxmarq&,aes_selected&,FALSE) ob_state(arb%,chxface&,aes_selected&,FALSE) ob_state(arb%,chxancsc&,aes_selected&,FALSE) DEFAULT ob_state(arb%,SUCC(c%),aes_selected&,FALSE) ENDSELECT ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ' -------------------------------------------------------------------------- ob_spec%=OB_SPEC(arb%,c%) $S&,S> SELECT type& CASE g_box&,g_ibox&,g_boxchar& IF BTST(OB_FLAGS(arb%,c%),aes_indicateur&) OR BTST(OB_FLAGS(arb%,c%),aes_fond&) IF (NOT @un_flacon) OR (arb%=adr_fenetre% AND ((c%=fenvue07&) OR (c%=fenvue27&) OR (c%=fenvue37&) OR (c%=fenvue47&))) OR (maxcol&<4) ob_spec%=ob_spec% AND -128 ob_spec%=ob_spec% OR SHL(tram_des&,4) ! Nouvelle trame ob_spec%=ob_spec% OR coul& ! Nouvelle couleur OB_SPEC(arb%,c%)=ob_spec% ENDIF IF (arb%=adr_fenetre%) AND ((c%=fenvue07&) OR (c%=fenvue27&) OR (c%=fenvue37&) OR (c%=fenvue47&)) ' ' Comme dit plus haut, l…, il faut enlever le flag que l'on a forcer. ob_flags(arb%,c%,aes_fond&,FALSE) ' ENDIF ENDIF CASE g_text&,g_boxtext&,g_fboxtext& IF BTST(OB_FLAGS(arb%,c%),aes_indicateur&) OR BTST(OB_FLAGS(arb%,c%),aes_fond&) IF (NOT @un_flacon) OR (maxcol&<4) te_color&=INT{ADD(ob_spec%,18)} te_color&=te_color& AND -128 te_color&=te_color& OR SHL(tram_des&,4) ! Nouvelle trame te_color&=te_color& OR coul& ! Nouvelle couleur INT{ADD(ob_spec%,18)}=te_color& ENDIF ENDIF ENDSELECT INC c% LOOP WHILE c% FUNCTION un_flacon IF machine|=5 RETURN TRUE ENDIF RETURN FALSE ENDFUNC ' ****************************************************************************** > PROCEDURE definir_variables ! Quelques variables globales index_ressource_1 index_ressource_2 index_ressource_3 index_ressource_4 index_ressource_5 index_ressource_6 index_ressource_bubble_gem variables_reservees_au_gem variables_pour_eb_model variables_pour_mesa_gl variables_special_ldg_mesa variables_indexs_fenetres ' ++SYM blanc&=0 noir&=1 rouge&=2 vert&=3 bleu&=4 cyan&=5 jaune&=6 violet&=7 gris_clair&=8 gris_fonce&=9 rouge_pal&=10 vert_pal&=11 bleu_pal&=12 cyan_pal&=13 jaune_pal&=14 violet_pal&=15 ' ++SYM RETURN > PROCEDURE variables_reservees_au_gem ! Celles la, elles sont pour le GEM ' ++SYM ' ---- Constantes concernant les ‚vŠnements MESSAGE ---- mn_selected&=10 ! S‚lection d'un menu wm_redraw&=20 ! Demande de redessin d'‚cran wm_topped&=21 ! R‚activation d'un fenˆtre par clic wm_closed&=22 ! Fermeture d'une fenˆtre wm_fulled&=23 ! Mise en plein ‚cran d'une fenˆtre wm_arrowed&=24 ! Clic sur un des uatres champs fl‚ch‚s wm_hslid&=25 ! Changement de position du poussoir horizontal wm_vslid&=26 ! Changement de position du poussoir vertical wm_sized&=27 ! Changement de taille d'une fenˆtre wm_moved&=28 ! D‚placement d'une fenˆtre wm_newtop&=29 ! R‚activation d'une fenˆtre par femeture d'une autre wm_zero&=9999 ! Mise … z‚ro des messages ac_open&=40 ! Ouverture d'un acc‚ssoire ac_close&=41 ! Fermeture d'un accessoire ' Ajouter par moi mˆme pour la gestion des ‚l‚ments non GEM d'une fenˆtre wm_xmenu&=9 ! Bouton d'ouverture du popup de gestion fenˆtre wm_xcrossed&=10 ! Bouton valid‚ avec une croix wm_xfulled&=11 ! Bouton en pseudo 3D (plein ‚cran ou non) wm_xbutton&=12 ! Bouton en pseudo 3D (redessin par 2 objets avant) wm_xreducted&=13 ! R‚duction d'une fenˆtre wm_xmoved&=14 ! D‚placement d'une fenˆtre wm_xclosed&=15 ! Fermeture d'une fenˆtre ' ---- Constantes concernant les ‚vŠnements FENETRE ---- wf_kind&=1 ! Fixe de nouvelles parties de fenˆtre wf_name&=2 ! Fixe un nom de fenˆtre wf_info&=3 ! Fixe une nouvelle info de fenˆtre wf_workxywh&=4 ! Coordonn‚es de la zone de travail de fenˆtre wf_currxywh&=5 ! Coordonnees de la zone total de fenˆtre wf_prevxywh&=6 ! Taille globale fenˆtre pr‚c‚dente wf_fullxywh&=7 ! Taille globale fenˆtre plein ‚cran wf_hslide&=8 ! Position poussoir horizontal wf_vslide&=9 ! Position poussoir vertical wf_top&=10 ! Code de fenˆtre active wf_firstxywh&=11 ! Premier rectangle de la liste des rectangles wf_nextxywh&=12 ! Prochain rectangle de la liste des rectangles wf_newdesk&=14 ! Fixe un nouvel arbre pour le bureau wf_hslsize&=15 ! Fixe taille poussoir horizontal wf_vslsize&=16 ! Fixe taille poussoir vertical wf_color&=18 ! wf_dcolor&=19 ! wf_return&=1 ! Fonction WINX wf_owner&=20 ! Fonction WINX wf_bevent&=24 ! Fonction WINX wf_bottom&=25 ! Fonction WINX wf_untopped&=30 ! Fonction WINX wf_ontop&=31 ! Fonction WINX wf_bottemed&=33 ! Fonction WINX wf_winx&=22360 ! Fonction WINX (appl_getinfo) wf_winxcfg&=22361 ! Fonction WINX ' ---- Constantes concernant les touches mortes du clavier cl_shift_droit&=0 cl_shift_gauche&=1 cl_control&=2 cl_alternate&=3 ' ---- Constantes concernant les modes graphiques -------- mode_remplace|=1 mode_transparent|=2 mode_xor|=3 mode_inverse_transparent|=4 ' ---- Constantes concernant les types d'objets RSC ------ g_box&=20 g_text&=21 g_boxtext&=22 g_image&=23 g_userdef&=24 g_ibox&=25 g_button&=26 g_boxchar&=27 g_string&=28 g_ftext&=29 g_fboxtext&=30 g_icon&=31 g_title&=32 g_cicon&=33 ' ---- Constantes concernant l'AES ----------------------- ' ................................ OB FLAGS aes_selectable&=0 aes_default&=1 aes_exit&=2 aes_editable&=3 aes_rbutton&=4 aes_lastob&=5 aes_touchexit&=6 aes_hidetree&=7 aes_indirect&=8 ' ................................ OB STATE aes_selected&=0 aes_crossed&=1 aes_checked&=2 aes_disable&=3 aes_outlined&=4 aes_shadowed&=5 ' end_update&=0 beg_update&=1 end_mctrl&=2 beg_mctrl&=3 ' ---- Pour le nouveau GEM en pseudo 3D ----------------------- aes_indicateur&=9 aes_fond&=10 aes_flags11|=11 ' ---- Les formes de souris et l'activation/d‚sactivation du rongeur ----- fleche&=0 trait_vertical&=1 abeille&=2 main_pointee&=3 main_a_plat&=4 reticule_mince&=5 reticule_epais&=6 contour_de_reticule&=7 user_def&=255 m_off&=256 m_on&=257 ' ---- Les deux modes de travail des fonction VDI ------------------------ request&=1 sample&=2 ' ---- Pour la gestion AV START ------------------------------------------ va_start&=&H4711 ! Protocol AV-START av_start&=&H4738 av_startprog&=&H4722 av_protokoll&=&H4700 va_protostatus&=&H4701 ' ---- Pour la gestion Drag n' Drop -------------------------------------- ap_dragdrop&=&H3F ' ---- Pour les bulles d'aide de BUBBLE GEM ------------------------------ bubblegem_request&=-17734 bubblegem_show&=-17733 ' ------------------------------------------------------------------------ screnmgr&=1 ! MAG!C... smc_unfreeze&=4 sm_m_special&=101 shut_down&=&H32 ' -------------------- Mode de lancement de PEXEC ------------------------ shw_load_go&=0 shw_load&=3 shw_go&=4 shw_parallel&=100 shw_single&=101 ' ---- Pour les accés disque via GEMDOS ---------- gemdos_read%=0 gemdos_write%=1 gemdos_read_write%=2 ' ++SYM RETURN > PROCEDURE variables_pour_eb_model ! Celles la, c'est pour le modeleur ' ++SYM ' *-------------------- Num‚ro d'indes des primitives de bases primitive_segment&=0 primitive_boite&=1 primitive_sphere&=2 primitive_prisme&=3 primitive_triangle&=4 primitive_tronc_de_cone&=5 primitive_hemisphere&=6 primitive_boite_arrondie&=7 primitive_disque&=8 primitive_pyramide&=9 primitive_colonne&=10 primitive_plan&=11 primitive_tore&=12 ' *-------------------- Les tailles importantes des zones de m‚moire taille_objet&=84 taille_texture&=90 taille_pigment&=102 taille_normal&=90 taille_finish&=48 taille_interior&=160 taille_media&=28 taille_scattering&=18 taille_density&=96 taille_couleur&=4 taille_camera&=142 taille_atmosphere&=94 taille_projection&=22 taille_color_map&=1024 taille_slop_map&=1536 taille_source&=84 ' *-------------------- Quelques offsets et tailles importants offset_couleur&=38 offset_csg_type&=40 offset_relation_csg&=42 offset_nom_objet&=44 offset_calque&=66 offset_rapport&=67 offset_nom_montagne&=68 offset_pere&=78 offset_force_blob&=80 ' *-------------------- Offset de d‚calage des drapeaux sp‚ciaux offset_drapeau0&=76 offset_drapeau1&=77 ' *-------------------- Les bits utiles au premier octet bit_ombre|=0 bit_masque|=1 bit_ouvert|=2 bit_biblio|=3 bit_bicubic|=4 bit_montagne|=5 bit_facette|=6 bit_in_out|=7 ' *-------------------- Les bits utiles au deuxiŠme octet bit_quadric|=0 bit_quartic|=1 bit_4d_julia|=2 bit_lathe|=3 bit_sor|=4 bit_prisme|=5 bit_texte|=6 bit_smooth|=7 ' offset_defaut&=21 bit_defaut|=6 ' *-------------------- Les bits utiles a l'offset pr‚c‚dent bit_spot|=0 bit_surface|=1 bit_objet_lie|=2 bit_cylindre|=3 bit_attenuation|=4 bit_shadowless|=5 bit_atmosphere|=6 ' *-------------------- Drapeau des vues vue_de_face|=0 vue_de_dos|=1 vue_de_gauche|=2 vue_de_droite|=3 vue_de_dessus|=4 vue_de_dessous|=5 vue_en_3d|=6 vue_en_3d_cache|=7 vue_en_bouknight|=8 vue_en_gouraud|=9 vue_en_phong|=10 vue_en_subjectif|=11 vue_multiple|=12 ' *-------------------- Pour choisir les objet … d‚placer type_camera&=0 type_lumiere&=1 type_objet&=2 type_poignees&=3 type_rotation&=4 ' *-------------------- Les poign‚es de modification d'objet poignee_haut_gauche|=0 poignee_haut_milieu|=1 poignee_haut_droite|=2 poignee_milieu_gauche|=3 poignee_milieu_droite|=4 poignee_bas_gauche|=5 poignee_bas_milieu|=6 poignee_bas_droite|=7 poignee_deplacement|=8 poignee_rotation|=9 ' *-------------------- Les différentes images de fond image_fond_face|=0 image_fond_dos|=1 image_fond_droite|=2 image_fond_gauche|=3 image_fond_dessus|=4 image_fond_dessous|=5 ' ++SYM ' *-------------------- Choix entre TEXBASSE et TEXHAUTE haute_resolution!=FALSE ' RETURN > PROCEDURE variables_pour_mesa_gl ! C'est tout pour mesa l… ! ' ++SYM ' Toutes ces variables sont des constantes tir‚es de GL_LDG.H ' R‚vision 1.0 du 24/02/1999 de Olivier Landemarre pour le C ' R‚vision 1.1 du 09/10/1999 de Emmanuel Baranger pour le GFA ' ' Boolean values LET gl_false%=0 LET gl_true%=1 ' ' Data types LET gl_byte%=&H1400 LET gl_unsigned_byte%=&H1401 LET gl_short%=&H1402 LET gl_unsigned_short%=&H1403 LET gl_int%=&H1404 LET gl_unsigned_int%=&H1405 LET gl_float%=&H1406 LET gl_double%=&H140A LET gl_2_bytes%=&H1407 LET gl_3_bytes%=&H1408 LET gl_4_bytes%=&H1409 ' ' Primitives LET gl_lines%=&H1 LET gl_points%=&H0 LET gl_line_strip%=&H3 LET gl_line_loop%=&H2 LET gl_triangles%=&H4 LET gl_triangle_strip%=&H5 LET gl_triangle_fan%=&H6 LET gl_quads%=&H7 LET gl_quad_strip%=&H8 LET gl_polygon%=&H9 LET gl_edge_flag%=&HB43 ' ' Vertex Arrays LET gl_vertex_array%=&H8074 LET gl_normal_array%=&H8075 LET gl_color_array%=&H8076 LET gl_index_array%=&H8077 LET gl_texture_coord_array%=&H8078 LET gl_edge_flag_array%=&H8079 LET gl_vertex_array_size%=&H807A LET gl_vertex_array_type%=&H807B LET gl_vertex_array_stride%=&H807C LET gl_normal_array_type%=&H807E LET gl_normal_array_stride%=&H807F LET gl_color_array_size%=&H8081 LET gl_color_array_type%=&H8082 LET gl_color_array_stride%=&H8083 LET gl_index_array_type%=&H8085 LET gl_index_array_stride%=&H8086 LET gl_texture_coord_array_size%=&H8088 LET gl_texture_coord_array_type%=&H8089 LET gl_texture_coord_array_stride%=&H808A LET gl_edge_flag_array_stride%=&H808C LET gl_vertex_array_pointer%=&H808E LET gl_normal_array_pointer%=&H808F LET gl_color_array_pointer%=&H8090 LET gl_index_array_pointer%=&H8091 LET gl_texture_coord_array_pointer%=&H8092 LET gl_edge_flag_array_pointer%=&H8093 LET gl_v2f%=&H2A20 LET gl_v3f%=&H2A21 LET gl_c4ub_v2f%=&H2A22 LET gl_c4ub_v3f%=&H2A23 LET gl_c3f_v3f%=&H2A24 LET gl_n3f_v3f%=&H2A25 LET gl_c4f_n3f_v3f%=&H2A26 LET gl_t2f_v3f%=&H2A27 LET gl_t4f_v4f%=&H2A28 LET gl_t2f_c4ub_v3f%=&H2A29 LET gl_t2f_c3f_v3f%=&H2A2A LET gl_t2f_n3f_v3f%=&H2A2B LET gl_t2f_c4f_n3f_v3f%=&H2A2C LET gl_t4f_c4f_n3f_v4f%=&H2A2D ' ' Matrix Mode LET gl_matrix_mode%=&HBA0 LET gl_modelview%=&H1700 LET gl_projection%=&H1701 LET gl_texture%=&H1702 ' ' Points LET gl_point_smooth%=&HB10 LET gl_point_size%=&HB11 LET gl_point_size_granularity%=&HB13 LET gl_point_size_range%=&HB12 ' ' Lines LET gl_line_smooth%=&HB20 LET gl_line_stipple%=&HB24 LET gl_line_stipple_pattern%=&HB25 LET gl_line_stipple_repeat%=&HB26 LET gl_line_width%=&HB21 LET gl_line_width_granularity%=&HB23 LET gl_line_width_range%=&HB22 ' ' Polygons LET gl_point%=&H1B00 LET gl_line%=&H1B01 LET gl_fill%=&H1B02 LET gl_ccw%=&H901 LET gl_cw%=&H900 LET gl_front%=&H404 LET gl_back%=&H405 LET gl_cull_face%=&HB44 LET gl_cull_face_mode%=&HB45 LET gl_polygon_smooth%=&HB41 LET gl_polygon_stipple%=&HB42 LET gl_front_face%=&HB46 LET gl_polygon_mode%=&HB40 LET gl_polygon_offset_factor%=&H8038 LET gl_polygon_offset_units%=&H2A00 LET gl_polygon_offset_point%=&H2A01 LET gl_polygon_offset_line%=&H2A02 LET gl_polygon_offset_fill%=&H8037 ' ' Display Lists LET gl_compile%=&H1300 LET gl_compile_and_execute%=&H1301 LET gl_list_base%=&HB32 LET gl_list_index%=&HB33 LET gl_list_mode%=&HB30 ' ' Depth buffer LET gl_never%=&H200 LET gl_less%=&H201 LET gl_gequal%=&H206 LET gl_lequal%=&H203 LET gl_greater%=&H204 LET gl_notequal%=&H205 LET gl_equal%=&H202 LET gl_always%=&H207 LET gl_depth_test%=&HB71 LET gl_depth_bits%=&HD56 LET gl_depth_clear_value%=&HB73 LET gl_depth_func%=&HB74 LET gl_depth_range%=&HB70 LET gl_depth_writemask%=&HB72 LET gl_depth_component%=&H1902 ' ' Lighting LET gl_lighting%=&HB50 LET gl_light0%=&H4000 LET gl_light1%=&H4001 LET gl_light2%=&H4002 LET gl_light3%=&H4003 LET gl_light4%=&H4004 LET gl_light5%=&H4005 LET gl_light6%=&H4006 LET gl_light7%=&H4007 LET gl_light8%=&H4008 LET gl_light9%=&H4009 LET gl_spot_exponent%=&H1205 LET gl_spot_cutoff%=&H1206 LET gl_constant_attenuation%=&H1207 LET gl_linear_attenuation%=&H1208 LET gl_quadratic_attenuation%=&H1209 LET gl_ambient%=&H1200 LET gl_diffuse%=&H1201 LET gl_specular%=&H1202 LET gl_shininess%=&H1601 LET gl_emission%=&H1600 LET gl_position%=&H1203 LET gl_spot_direction%=&H1204 LET gl_ambient_and_diffuse%=&H1602 LET gl_color_indexes%=&H1603 LET gl_light_model_two_side%=&HB52 LET gl_light_model_local_viewer%=&HB51 LET gl_light_model_ambient%=&HB53 LET gl_front_and_back%=&H408 LET gl_shade_model%=&HB54 LET gl_flat%=&H1D00 LET gl_smooth%=&H1D01 LET gl_color_material%=&HB57 LET gl_color_material_face%=&HB55 LET gl_color_material_parameter%=&HB56 LET gl_normalize%=&HBA1 ' ' User clipping planes LET gl_clip_plane0%=&H3000 LET gl_clip_plane1%=&H3001 LET gl_clip_plane2%=&H3002 LET gl_clip_plane3%=&H3003 LET gl_clip_plane4%=&H3004 LET gl_clip_plane5%=&H3005 ' ' Accumulation buffer LET gl_accum_red_bits%=&HD58 LET gl_accum_green_bits%=&HD59 LET gl_accum_blue_bits%=&HD5A LET gl_accum_alpha_bits%=&HD5B LET gl_accum_clear_value%=&HB80 LET gl_accum%=&H100 LET gl_add%=&H104 LET gl_load%=&H101 LET gl_mult%=&H103 LET gl_return%=&H102 ' ' Alpha testing LET gl_alpha_test%=&HBC0 LET gl_alpha_test_ref%=&HBC2 LET gl_alpha_test_func%=&HBC1 ' ' Blending LET gl_blend%=&HBE2 LET gl_blend_src%=&HBE1 LET gl_blend_dst%=&HBE0 LET gl_zero%=0 LET gl_one%=1 LET gl_src_color%=&H300 LET gl_one_minus_src_color%=&H301 LET gl_dst_color%=&H306 LET gl_one_minus_dst_color%=&H307 LET gl_src_alpha%=&H302 LET gl_one_minus_src_alpha%=&H303 LET gl_dst_alpha%=&H304 LET gl_one_minus_dst_alpha%=&H305 LET gl_src_alpha_saturate%=&H308 LET gl_constant_color%=&H8001 LET gl_one_minus_constant_color%=&H8002 LET gl_constant_alpha%=&H8003 LET gl_one_minus_constant_alpha%=&H8004 ' ' Render Mode LET gl_feedback%=&H1C01 LET gl_render%=&H1C00 LET gl_select%=&H1C02 ' ' Feedback LET gl_2d%=&H600 LET gl_3d%=&H601 LET gl_3d_color%=&H602 LET gl_3d_color_texture%=&H603 LET gl_4d_color_texture%=&H604 LET gl_point_token%=&H701 LET gl_line_token%=&H702 LET gl_line_reset_token%=&H707 LET gl_polygon_token%=&H703 LET gl_bitmap_token%=&H704 LET gl_draw_pixel_token%=&H705 LET gl_copy_pixel_token%=&H706 LET gl_pass_through_token%=&H700 LET gl_feedback_buffer_pointer%=&HDF0 LET gl_feedback_buffer_size%=&HDF1 LET gl_feedback_buffer_type%=&HDF2 ' ' Fog LET gl_fog%=&HB60 LET gl_fog_mode%=&HB65 LET gl_fog_density%=&HB62 LET gl_fog_color%=&HB66 LET gl_fog_index%=&HB61 LET gl_fog_start%=&HB63 LET gl_fog_end%=&HB64 LET gl_linear%=&H2601 LET gl_exp%=&H800 LET gl_exp2%=&H801 ' ' Logic Ops LET gl_logic_op%=&HBF1 LET gl_index_logic_op%=&HBF1 LET gl_color_logic_op%=&HBF2 LET gl_logic_op_mode%=&HBF0 LET gl_clear%=&H1500 LET gl_set%=&H150F LET gl_copy%=&H1503 LET gl_copy_inverted%=&H150C LET gl_noop%=&H1505 LET gl_invert%=&H150A LET gl_and%=&H1501 LET gl_nand%=&H150E LET gl_or%=&H1507 LET gl_nor%=&H1508 LET gl_xor%=&H1506 LET gl_equiv%=&H1509 LET gl_and_reverse%=&H1502 LET gl_and_inverted%=&H1504 LET gl_or_reverse%=&H150B LET gl_or_inverted%=&H150D ' ' Stencil LET gl_stencil_test%=&HB90 LET gl_stencil_writemask%=&HB98 LET gl_stencil_bits%=&HD57 LET gl_stencil_func%=&HB92 LET gl_stencil_value_mask%=&HB93 LET gl_stencil_ref%=&HB97 LET gl_stencil_fail%=&HB94 LET gl_stencil_pass_depth_pass%=&HB96 LET gl_stencil_pass_depth_fail%=&HB95 LET gl_stencil_clear_value%=&HB91 LET gl_stencil_index%=&H1901 LET gl_keep%=&H1E00 LET gl_replace%=&H1E01 LET gl_incr%=&H1E02 LET gl_decr%=&H1E03 ' ' Buffers Pixel Drawing/Reading LET gl_none%=0 LET gl_left%=&H406 LET gl_right%=&H407 LET gl_front_left%=&H400 LET gl_front_right%=&H401 LET gl_back_left%=&H402 LET gl_back_right%=&H403 LET gl_aux0%=&H409 LET gl_aux1%=&H40A LET gl_aux2%=&H40B LET gl_aux3%=&H40C LET gl_color_index%=&H1900 LET gl_red%=&H1903 LET gl_green%=&H1904 LET gl_blue%=&H1905 LET gl_alpha%=&H1906 LET gl_luminance%=&H1909 LET gl_luminance_alpha%=&H190A LET gl_alpha_bits%=&HD55 LET gl_red_bits%=&HD52 LET gl_green_bits%=&HD53 LET gl_blue_bits%=&HD54 LET gl_index_bits%=&HD51 LET gl_subpixel_bits%=&HD50 LET gl_aux_buffers%=&HC00 LET gl_read_buffer%=&HC02 LET gl_draw_buffer%=&HC01 LET gl_doublebuffer%=&HC32 LET gl_stereo%=&HC33 LET gl_bitmap%=&H1A00 LET gl_color%=&H1800 LET gl_depth%=&H1801 LET gl_stencil%=&H1802 LET gl_dither%=&HBD0 LET gl_rgb%=&H1907 LET gl_rgba%=&H1908 ' ' Implementation limits LET gl_max_list_nesting%=&HB31 LET gl_max_attrib_stack_depth%=&HD35 LET gl_max_modelview_stack_depth%=&HD36 LET gl_max_name_stack_depth%=&HD37 LET gl_max_projection_stack_depth%=&HD38 LET gl_max_texture_stack_depth%=&HD39 LET gl_max_eval_order%=&HD30 LET gl_max_lights%=&HD31 LET gl_max_clip_planes%=&HD32 LET gl_max_texture_size%=&HD33 LET gl_max_pixel_map_table%=&HD34 LET gl_max_viewport_dims%=&HD3A LET gl_max_client_attrib_stack_depth=&HD3B ' ' Gets LET gl_attrib_stack_depth%=&HBB0 LET gl_client_attrib_stack_depth%=&HBB1 LET gl_color_clear_value%=&HC22 LET gl_color_writemask%=&HC23 LET gl_current_index%=&HB01 LET gl_current_color%=&HB00 LET gl_current_normal%=&HB02 LET gl_current_raster_color%=&HB04 LET gl_current_raster_distance%=&HB09 LET gl_current_raster_index%=&HB05 LET gl_current_raster_position%=&HB07 LET gl_current_raster_texture_coords=&HB06 LET gl_current_raster_position_valid=&HB08 LET gl_current_texture_coords%=&HB03 LET gl_index_clear_value%=&HC20 LET gl_index_mode%=&HC30 LET gl_index_writemask%=&HC21 LET gl_modelview_matrix%=&HBA6 LET gl_modelview_stack_depth%=&HBA3 LET gl_name_stack_depth%=&HD70 LET gl_projection_matrix%=&HBA7 LET gl_projection_stack_depth%=&HBA4 LET gl_render_mode%=&HC40 LET gl_rgba_mode%=&HC31 LET gl_texture_matrix%=&HBA8 LET gl_texture_stack_depth%=&HBA5 LET gl_viewport%=&HBA2 ' ' Evaluators LET gl_auto_normal%=&HD80 LET gl_map1_color_4%=&HD90 LET gl_map1_grid_domain%=&HDD0 LET gl_map1_grid_segments%=&HDD1 LET gl_map1_index%=&HD91 LET gl_map1_normal%=&HD92 LET gl_map1_texture_coord_1%=&HD93 LET gl_map1_texture_coord_2%=&HD94 LET gl_map1_texture_coord_3%=&HD95 LET gl_map1_texture_coord_4%=&HD96 LET gl_map1_vertex_3%=&HD97 LET gl_map1_vertex_4%=&HD98 LET gl_map2_color_4%=&HDB0 LET gl_map2_grid_domain%=&HDD2 LET gl_map2_grid_segments%=&HDD3 LET gl_map2_index%=&HDB1 LET gl_map2_normal%=&HDB2 LET gl_map2_texture_coord_1%=&HDB3 LET gl_map2_texture_coord_2%=&HDB4 LET gl_map2_texture_coord_3%=&HDB5 LET gl_map2_texture_coord_4%=&HDB6 LET gl_map2_vertex_3%=&HDB7 LET gl_map2_vertex_4%=&HDB8 LET gl_coeff%=&HA00 LET gl_domain%=&HA02 LET gl_order%=&HA01 ' ' Hints LET gl_fog_hint%=&HC54 LET gl_line_smooth_hint%=&HC52 LET gl_perspective_correction_hint%=&HC50 LET gl_point_smooth_hint%=&HC51 LET gl_polygon_smooth_hint%=&HC53 LET gl_dont_care%=&H1100 LET gl_fastest%=&H1101 LET gl_nicest%=&H1102 ' ' Scissor box LET gl_scissor_test%=&HC11 LET gl_scissor_box%=&HC10 ' ' Pixel Mode / Transfer LET gl_map_color%=&HD10 LET gl_map_stencil%=&HD11 LET gl_index_shift%=&HD12 LET gl_index_offset%=&HD13 LET gl_red_scale%=&HD14 LET gl_red_bias%=&HD15 LET gl_green_scale%=&HD18 LET gl_green_bias%=&HD19 LET gl_blue_scale%=&HD1A LET gl_blue_bias%=&HD1B LET gl_alpha_scale%=&HD1C LET gl_alpha_bias%=&HD1D LET gl_depth_scale%=&HD1E LET gl_depth_bias%=&HD1F LET gl_pixel_map_s_to_s_size%=&HCB1 LET gl_pixel_map_i_to_i_size%=&HCB0 LET gl_pixel_map_i_to_r_size%=&HCB2 LET gl_pixel_map_i_to_g_size%=&HCB3 LET gl_pixel_map_i_to_b_size%=&HCB4 LET gl_pixel_map_i_to_a_size%=&HCB5 LET gl_pixel_map_r_to_r_size%=&HCB6 LET gl_pixel_map_g_to_g_size%=&HCB7 LET gl_pixel_map_b_to_b_size%=&HCB8 LET gl_pixel_map_a_to_a_size%=&HCB9 LET gl_pixel_map_s_to_s%=&HC71 LET gl_pixel_map_i_to_i%=&HC70 LET gl_pixel_map_i_to_r%=&HC72 LET gl_pixel_map_i_to_g%=&HC73 LET gl_pixel_map_i_to_b%=&HC74 LET gl_pixel_map_i_to_a%=&HC75 LET gl_pixel_map_r_to_r%=&HC76 LET gl_pixel_map_g_to_g%=&HC77 LET gl_pixel_map_b_to_b%=&HC78 LET gl_pixel_map_a_to_a%=&HC79 LET gl_pack_alignment%=&HD05 LET gl_pack_lsb_first%=&HD01 LET gl_pack_row_length%=&HD02 LET gl_pack_skip_pixels%=&HD04 LET gl_pack_skip_rows%=&HD03 LET gl_pack_swap_bytes%=&HD00 LET gl_unpack_alignment%=&HCF5 LET gl_unpack_lsb_first%=&HCF1 LET gl_unpack_row_length%=&HCF2 LET gl_unpack_skip_pixels%=&HCF4 LET gl_unpack_skip_rows%=&HCF3 LET gl_unpack_swap_bytes%=&HCF0 LET gl_zoom_x%=&HD16 LET gl_zoom_y%=&HD17 ' ' Texture mapping LET gl_texture_env%=&H2300 LET gl_texture_env_mode%=&H2200 LET gl_texture_1d%=&HDE0 LET gl_texture_2d%=&HDE1 LET gl_texture_wrap_s%=&H2802 LET gl_texture_wrap_t%=&H2803 LET gl_texture_max_filter%=&H2800 LET gl_texture_min_filter%=&H2801 LET gl_texture_env_color%=&H2201 LET gl_texture_gen_s%=&HC60 LET gl_texture_gen_t%=&HC61 LET gl_texture_gen_mode%=&H2500 LET gl_texture_border_color%=&H1004 LET gl_texture_width%=&H1000 LET gl_texture_height%=&H1001 LET gl_texture_border%=&H1005 LET gl_texture_components%=&H1003 LET gl_texture_red_size%=&H805C LET gl_texture_green_size%=&H805D LET gl_texture_blue_size%=&H805E LET gl_texture_alpha_size%=&H805F LET gl_texture_luminance_size%=&H8060 LET gl_texture_intensity_size%=&H8061 LET gl_nearest_mipmap_nearest%=&H2700 LET gl_nearest_mipmap_linear%=&H2702 LET gl_linear_mipmap_nearest%=&H2701 LET gl_linear_mipmap_linear%=&H2703 LET gl_object_linear%=&H2401 LET gl_object_plane%=&H2501 LET gl_eye_linear%=&H2400 LET gl_eye_plane%=&H2502 LET gl_sphere_map%=&H2402 LET gl_decal%=&H2101 LET gl_modulate%=&H2100 LET gl_nearest%=&H2600 LET gl_repeat%=&H2901 LET gl_clamp%=&H2900 LET gl_s%=&H2000 LET gl_t%=&H2001 LET gl_r%=&H2002 LET gl_q%=&H2003 LET gl_texture_gen_r%=&HC62 LET gl_texture_gen_q%=&HC63 LET gl_proxy_texture_1d%=&H8063 LET gl_proxy_texture_2d%=&H8064 LET gl_texture_priority%=&H8066 LET gl_texture_resident%=&H8067 LET gl_texture_binding_1d%=&H8068 LET gl_texture_binding_2d%=&H8069 ' ' Internal texture formats LET gl_alpha4%=&H803B LET gl_alpha8%=&H803C LET gl_alpha12%=&H803D LET gl_alpha16%=&H803E LET gl_luminance4%=&H803F LET gl_luminance8%=&H8040 LET gl_luminance12%=&H8041 LET gl_luminance16%=&H8042 LET gl_luminance4_alpha4%=&H8043 LET gl_luminance6_alpha2%=&H8044 LET gl_luminance8_alpha8%=&H8045 LET gl_luminance12_alpha4%=&H8046 LET gl_luminance12_alpha12%=&H8047 LET gl_luminance16_alpha16%=&H8048 LET gl_intensity%=&H8049 LET gl_intensity4%=&H804A LET gl_intensity8%=&H804B LET gl_intensity12%=&H804C LET gl_intensity16%=&H804D LET gl_r3_g3_b2%=&H2A10 LET gl_rgb4%=&H804F LET gl_rgb5%=&H8050 LET gl_rgb8%=&H8051 LET gl_rgb10%=&H8052 LET gl_rgb12%=&H8053 LET gl_rgb16%=&H8054 LET gl_rgba2%=&H8055 LET gl_rgba4%=&H8056 LET gl_rgb5_a1%=&H8057 LET gl_rgba8%=&H8058 LET gl_rgb10_a2%=&H8059 LET gl_rgba12%=&H805A LET gl_rgba16%=&H805B ' ' Utility LET gl_vendor%=&H1F00 LET gl_renderer%=&H1F01 LET gl_version%=&H1F02 LET gl_extensions%=&H1F03 ' ' Errors LET gl_invalid_value%=&H501 LET gl_invalid_enum%=&H500 LET gl_invalid_operation%=&H502 LET gl_stack_overflow%=&H503 LET gl_stack_underflow%=&H504 LET gl_out_of_memory%=&H505 ' ' 1.0 Extensions ' GL_EXT_blend_minmax and GL_EXT_blend_color LET gl_constant_color_ext%=&H8001 LET gl_one_minus_constant_color_ext%=&H8002 LET gl_constant_alpha_ext%=&H8003 LET gl_one_minus_constant_alpha_ext%=&H8004 LET gl_blend_equation_ext%=&H8009 LET gl_min_ext%=&H8007 LET gl_max_ext%=&H8008 LET gl_func_add_ext%=&H8006 LET gl_func_subtract_ext%=&H800A LET gl_func_reverse_subtract_ext%=&H800B LET gl_blend_color_ext%=&H8005 ' ' GL_EXT_polygon_offset LET gl_polygon_offset_ext=&H8037 LET gl_polygon_offset_factor_ext=&H8038 LET gl_polygon_offset_bias_ext=&H8039 ' ' GL_EXT_vertex_array LET gl_vertex_array_ext%=&H8074 LET gl_normal_array_ext%=&H8075 LET gl_color_array_ext%=&H8076 LET gl_index_array_ext%=&H8077 LET gl_texture_coord_array_ext%=&H8078 LET gl_edge_flag_array_ext%=&H8079 LET gl_vertex_array_size_ext%=&H807A LET gl_vertex_array_type_ext%=&H807B LET gl_vertex_array_stride_ext%=&H807C LET gl_vertex_array_count_ext%=&H807D LET gl_normal_array_type_ext%=&H807E LET gl_normal_array_stride_ext%=&H807F LET gl_normal_array_count_ext%=&H8080 LET gl_color_array_size_ext%=&H8081 LET gl_color_array_type_ext%=&H8082 LET gl_color_array_stride_ext%=&H8083 LET gl_color_array_count_ext%=&H8084 LET gl_index_array_type_ext%=&H8085 LET gl_index_array_stride_ext%=&H8086 LET gl_index_array_count_ext%=&H8087 LET gl_texture_coord_array_size_ext%=&H8088 LET gl_texture_coord_array_type_ext%=&H8089 LET gl_texture_coord_array_stride_ext%=&H808A LET gl_texture_coord_array_count_ext%=&H808B LET gl_edge_flag_array_stride_ext%=&H808C LET gl_edge_flag_array_count_ext%=&H808D LET gl_vertex_array_pointer_ext%=&H808E LET gl_normal_array_pointer_ext%=&H808F LET gl_color_array_pointer_ext%=&H8090 LET gl_index_array_pointer_ext%=&H8091 LET gl_texture_coord_array_pointer_ext%=&H8092 LET gl_edge_flag_array_pointer_ext%=&H8093 ' ' GL_EXT_texture_object LET gl_texture_priority_ext%=&H8066 LET gl_texture_resident_ext%=&H8067 LET gl_texture_1d_binding_ext%=&H8068 LET gl_texture_2d_binding_ext%=&H8069 ' ' GL_EXT_texture3D LET gl_pack_skip_images_ext%=&H806B LET gl_pack_image_height_ext%=&H806C LET gl_unpack_skip_images_ext%=&H806D LET gl_unpack_image_height_ext%=&H806E LET gl_texture_3d_ext%=&H806F LET gl_proxy_texture_3d_ext%=&H8070 LET gl_texture_depth_ext%=&H8071 LET gl_texture_wrap_r_ext%=&H8072 LET gl_max_3d_texture_size_ext%=&H8073 LET gl_texture_3d_binding_ext%=&H806A ' ' GL_EXT_paletted_texture LET gl_table_too_large_ext%=&H8031 LET gl_color_table_format_ext%=&H80D8 LET gl_color_table_width_ext%=&H80D9 LET gl_color_table_red_size_ext%=&H80DA LET gl_color_table_green_size_ext%=&H80DB LET gl_color_table_blue_size_ext%=&H80DC LET gl_color_table_alpha_size_ext%=&H80DD LET gl_color_table_luminance_size_ext%=&H80DE LET gl_color_table_intensity_size_ext%=&H80DF LET gl_texture_index_size_ext%=&H80E1 !XXX right value ? LET gl_color_index1_ext%=&H80E2 LET gl_color_index2_ext%=&H80E3 LET gl_color_index4_ext%=&H80E4 LET gl_color_index8_ext%=&H80E5 LET gl_color_index12_ext%=&H80E6 LET gl_color_index16_ext%=&H80E7 ' ' GL_EXT_shared_texture_palette LET gl_shared_texture_palette_ext%=&H81FB ' ' GL_SGIS_texture_lod LET gl_texture_min_lod_sgis%=&H813A LET gl_texture_max_lod_sgis%=&H813B LET gl_texture_base_level_sgis%=&H813C LET gl_texture_max_level_sgis%=&H813D ' ' GL_EXT_point_parameters LET gl_point_size_min_ext%=&H8126 LET gl_point_size_max_ext%=&H8127 LET gl_point_fade_threshold_size_ext%=&H8128 LET gl_distance_attenuation_ext%=&H8129 ' LET gl_current_bit%=&H1 LET gl_point_bit%=&H2 LET gl_line_bit%=&H4 LET gl_polygon_bit%=&H8 LET gl_polygon_stipple_bit%=&H10 LET gl_pixel_mode_bit%=&H20 LET gl_lighting_bit%=&H40 LET gl_fog_bit%=&H80 LET gl_depth_buffer_bit%=&H100 LET gl_accum_buffer_bit%=&H200 LET gl_stencil_buffer_bit%=&H400 LET gl_viewport_bit%=&H800 LET gl_transform_bit%=&H1000 LET gl_enable_bit%=&H2000 LET gl_color_buffer_bit%=&H4000 LET gl_hint_bit%=&H8000 LET gl_eval_bit%=&H10000 LET gl_list_bit%=&H20000 LET gl_texture_bit%=&H40000 LET gl_scissor_bit%=&H80000 LET gl_all_attrib_bits%=&HFFFFF ' ' enum LET gl_client_pixel_store_bit%=&H1 LET gl_client_vertex_array_bit%=&H2 LET gl_client_all_attrib_bits%=&HFFFF ' ' ++SYM RETURN > PROCEDURE variables_special_ldg_mesa ! C'est encore pour mesa ici ! ' ++SYM ' ' -------------- Definitions for MESA_GL.LDG -------------- ' LET osmesa_color_index%=gl_color_index% LET osmesa_rgba%=gl_rgba% LET osmesa_bgra%=&H1 LET osmesa_argb%=&H2 LET osmesa_rgb%=gl_rgb% LET osmesa_bgr%=&H4 LET vdi_rgb%=&HF ' ' -------------- Librairies Dynamiques GEM -------------- ' LET ldg_request%=&H4C45 LET ldg_term%=&H4C47 ' LET ldg_garbage%=&H4C48 LET ldg_error%=&H4C49 LET ldg_quit%=&H4C4A LET ldg_list%=&H4C4B ' LET ldg_cookie%=&H4C44474D LET flen%=&H128 ' LET ldg_not_shared%=&H1 ! La lib ne peut pas ˆtre partag‚e LET ldg_locked%=&H2 ! La lib est v‚rouill‚ LET ldg_resident%=&H3 ! La lib est r‚sidente en m‚moire ' LET ldg_lib_fulled%=-1 LET ldg_app_fulled%=-2 LET ldg_err_exec%=-3 LET ldg_bad_format%=-4 LET ldg_lib_locked%=-6 LET ldg_no_manager%=-7 LET ldg_not_found%=-8 LET ldg_bad_lib%=ldg_bad_format% ' ' ++SYM RETURN > PROCEDURE variables_indexs_fenetres ! Constantes globales pour les indexs de fenetres ' ++SYM ' ' ******************** Les indexs de base idx_info&=0 idx_outils&=1 idx_vue_subjective&=2 idx_modification&=3 idx_couleurs&=4 ' idx_lumieres&=6 idx_aide&=7 idx_fonctions&=8 idx_calques&=9 idx_statistiques&=10 idx_merci&=11 idx_camera&=12 idx_lanceur&=13 ' idx_parametrage&=15 ' idx_bicubic&=17 idx_auteur&=18 idx_vue_fine&=19 idx_temps_passe&=20 ' idx_vue&=24 idx_calage&=25 idx_info_objet&=26 idx_quartic&=27 idx_quadric&=28 idx_bibliotheque&=29 idx_hierarchie&=30 idx_animation&=31 ' ' ******************** Les indexs multipl‚s pas 2 idx_info_dbl&=0 idx_outils_dbl&=2 idx_vue_subjective_dbl&=4 idx_modification_dbl&=6 idx_couleurs_dbl&=8 ' idx_lumieres_dbl&=12 idx_aide_dbl&=14 idx_fonctions_dbl&=16 idx_calques_dbl&=18 idx_statistiques_dbl&=20 idx_merci_dbl&=22 idx_camera_dbl&=24 idx_lanceur_dbl&=26 ' idx_parametrage_dbl&=30 ' idx_bicubic_dbl&=34 idx_auteur_dbl&=36 idx_vue_fine_dbl&=38 idx_temps_passe_dbl&=40 ' idx_vue_dbl&=48 idx_calage_dbl&=50 idx_info_objet_dbl&=52 idx_quartic_dbl&=54 idx_quadric_dbl&=56 idx_bibliotheque_dbl&=58 idx_hierarchie_dbl&=60 idx_animation_dbl&=62 ' ' ++SYM RETURN > PROCEDURE index_ressource_1 ! Constantes globales du ressource nø1 ' ++SYM REM Resource file indices for RSC_1. ' LET menu&=0 ! Menu-tree LET mentitr1&=4 ! TITLE in tree MENU LET mentitr2&=5 ! TITLE in tree MENU LET mentitr3&=6 ! TITLE in tree MENU LET mentitr4&=7 ! TITLE in tree MENU LET mentitr5&=8 ! TITLE in tree MENU LET minfo&=11 ! STRING in tree MENU LET mnouvell&=20 ! STRING in tree MENU LET mcharges&=22 ! STRING in tree MENU LET msauvers&=23 ! STRING in tree MENU LET msauvnom&=24 ! STRING in tree MENU LET mimg&=26 ! STRING in tree MENU LET m3d2&=27 ! STRING in tree MENU LET msauverp&=28 ! STRING in tree MENU LET mimprime&=30 ! STRING in tree MENU LET medtexte&=32 ! STRING in tree MENU LET mvimage&=33 ! STRING in tree MENU LET mprogext&=34 ! STRING in tree MENU LET mlancpov&=36 ! STRING in tree MENU LET mquitter&=38 ! STRING in tree MENU LET mmodifie&=40 ! STRING in tree MENU LET meffacer&=41 ! STRING in tree MENU LET mcalques&=42 ! STRING in tree MENU LET mcaler&=43 ! STRING in tree MENU LET munion&=45 ! STRING in tree MENU LET mbibl&=47 ! STRING in tree MENU LET mtexture&=49 ! STRING in tree MENU LET mcopier&=51 ! STRING in tree MENU LET mstatist&=53 ! STRING in tree MENU LET mselmult&=55 ! STRING in tree MENU LET mseltout&=56 ! STRING in tree MENU LET msegment&=58 ! STRING in tree MENU LET mboite&=59 ! STRING in tree MENU LET mprisme&=60 ! STRING in tree MENU LET mtube&=61 ! STRING in tree MENU LET mplan&=62 ! STRING in tree MENU LET msphere&=63 ! STRING in tree MENU LET mhemisph&=64 ! STRING in tree MENU LET mtor&=65 ! STRING in tree MENU LET mpyramid&=66 ! STRING in tree MENU LET mcone&=67 ! STRING in tree MENU LET mtronc&=68 ! STRING in tree MENU LET mdisque&=69 ! STRING in tree MENU LET mquartic&=71 ! STRING in tree MENU LET mquadric&=72 ! STRING in tree MENU LET mcolonne&=73 ! STRING in tree MENU LET mblobs&=74 ! STRING in tree MENU LET mtouextr&=76 ! STRING in tree MENU LET mcamera&=78 ! STRING in tree MENU LET msource&=79 ! STRING in tree MENU LET mface&=81 ! STRING in tree MENU LET mdos&=82 ! STRING in tree MENU LET mdroite&=84 ! STRING in tree MENU LET mgauche&=85 ! STRING in tree MENU LET mdessus&=87 ! STRING in tree MENU LET mdessous&=88 ! STRING in tree MENU LET m3dfil&=90 ! STRING in tree MENU LET m3dcache&=91 ! STRING in tree MENU LET m3dlumi&=92 ! STRING in tree MENU LET mgouraud&=94 ! STRING in tree MENU LET mphong&=95 ! STRING in tree MENU LET msubject&=97 ! STRING in tree MENU LET m4vues&=99 ! STRING in tree MENU LET maide&=101 ! STRING in tree MENU LET mbicubic&=102 ! STRING in tree MENU LET mmontagn&=103 ! STRING in tree MENU LET manim&=104 ! STRING in tree MENU LET maffiout&=106 ! STRING in tree MENU LET mparamet&=108 ! STRING in tree MENU ' LET info&=1 ! Form/Dialog-box LET bartit01&=3 ! FBOXTEXT in tree INFO LET sharewar&=10 ! IBOX in tree INFO LET infsyste&=14 ! IBOX in tree INFO LET infgener&=18 ! IBOX in tree INFO LET souinf0&=19 ! IBOX in tree INFO LET infomem&=28 ! FTEXT in tree INFO LET infomemt&=29 ! FTEXT in tree INFO LET merci&=33 ! IBOX in tree INFO LET fininfo&=38 ! IBOX in tree INFO LET bardev&=41 ! FTEXT in tree INFO LET souinf1&=43 ! IBOX in tree INFO LET sysmachi&=45 ! FTEXT in tree INFO LET systaill&=46 ! FTEXT in tree INFO LET sysproce&=47 ! FTEXT in tree INFO LET sysson&=48 ! FTEXT in tree INFO LET syscopro&=49 ! FTEXT in tree INFO LET sysnvdi&=50 ! FTEXT in tree INFO LET systos&=51 ! FTEXT in tree INFO LET syswinx&=52 ! FTEXT in tree INFO LET sysgem&=53 ! FTEXT in tree INFO LET sysmint&=54 ! FTEXT in tree INFO LET sysgedo&=55 ! FTEXT in tree INFO LET sysmagic&=56 ! FTEXT in tree INFO LET sysvideo&=57 ! FTEXT in tree INFO LET systos2g&=58 ! FTEXT in tree INFO LET sysnbrco&=59 ! FTEXT in tree INFO LET sysxtos&=60 ! FTEXT in tree INFO LET souinf2&=61 ! IBOX in tree INFO LET icoinfo&=66 ! USERDEF in tree INFO ' LET outils&=2 ! Form/Dialog-box LET ioutil01&=6 ! USERDEF in tree OUTILS LET ioutil02&=7 ! USERDEF in tree OUTILS LET ioutil03&=8 ! USERDEF in tree OUTILS LET sousout1&=9 ! BOX in tree OUTILS LET icharger&=10 ! USERDEF in tree OUTILS LET isauver&=11 ! USERDEF in tree OUTILS LET iipov&=13 ! USERDEF in tree OUTILS LET ispov&=14 ! USERDEF in tree OUTILS LET iliste&=16 ! USERDEF in tree OUTILS LET istat&=17 ! USERDEF in tree OUTILS LET iinfo&=18 ! USERDEF in tree OUTILS LET sousout2&=19 ! BOX in tree OUTILS LET iplan&=20 ! USERDEF in tree OUTILS LET ifcone&=21 ! USERDEF in tree OUTILS LET idisque&=22 ! USERDEF in tree OUTILS LET iboite&=23 ! USERDEF in tree OUTILS LET iprisme&=24 ! USERDEF in tree OUTILS LET ipyramid&=25 ! USERDEF in tree OUTILS LET isphere&=26 ! USERDEF in tree OUTILS LET idemisph&=27 ! USERDEF in tree OUTILS LET itroncon&=28 ! USERDEF in tree OUTILS LET itor&=29 ! USERDEF in tree OUTILS LET itube&=30 ! USERDEF in tree OUTILS LET icolonne&=31 ! USERDEF in tree OUTILS LET itrait&=32 ! USERDEF in tree OUTILS LET icarreau&=33 ! USERDEF in tree OUTILS LET itaille&=34 ! USERDEF in tree OUTILS LET icsg&=35 ! USERDEF in tree OUTILS LET imont&=36 ! USERDEF in tree OUTILS LET itourext&=37 ! USERDEF in tree OUTILS LET sousout3&=38 ! BOX in tree OUTILS LET ireel&=39 ! USERDEF in tree OUTILS LET imodif&=40 ! USERDEF in tree OUTILS LET ioption&=41 ! USERDEF in tree OUTILS LET icamera&=42 ! USERDEF in tree OUTILS LET ilampe&=43 ! USERDEF in tree OUTILS LET itexture&=44 ! USERDEF in tree OUTILS LET iface&=45 ! USERDEF in tree OUTILS LET idroite&=46 ! USERDEF in tree OUTILS LET ihaut&=47 ! USERDEF in tree OUTILS LET idos&=48 ! USERDEF in tree OUTILS LET igauche&=49 ! USERDEF in tree OUTILS LET ibas&=50 ! USERDEF in tree OUTILS LET ifil&=51 ! USERDEF in tree OUTILS LET ifaces&=52 ! USERDEF in tree OUTILS LET iplein&=53 ! USERDEF in tree OUTILS LET izmoins&=54 ! USERDEF in tree OUTILS LET izplus&=55 ! USERDEF in tree OUTILS LET iimgfond&=56 ! USERDEF in tree OUTILS LET izsouris&=57 ! USERDEF in tree OUTILS LET iztotal&=58 ! USERDEF in tree OUTILS LET izcentre&=59 ! USERDEF in tree OUTILS LET izredraw&=60 ! USERDEF in tree OUTILS LET izoom&=61 ! FTEXT in tree OUTILS ' LET modifier&=3 ! Form/Dialog-box LET modnum&=8 ! FTEXT in tree MODIFIER LET nummod&=10 ! IBOX in tree MODIFIER LET modmoins&=14 ! IBOX in tree MODIFIER LET modplus&=18 ! IBOX in tree MODIFIER LET modtyp&=20 ! FTEXT in tree MODIFIER LET typmod&=22 ! IBOX in tree MODIFIER LET modicalq&=24 ! FTEXT in tree MODIFIER LET calqmodi&=26 ! IBOX in tree MODIFIER LET modifnom&=27 ! FBOXTEXT in tree MODIFIER LET souposob&=28 ! IBOX in tree MODIFIER LET modpx&=33 ! FTEXT in tree MODIFIER LET modpy&=34 ! FTEXT in tree MODIFIER LET modpz&=35 ! FTEXT in tree MODIFIER LET modtx&=36 ! FTEXT in tree MODIFIER LET modty&=37 ! FTEXT in tree MODIFIER LET modtz&=38 ! FTEXT in tree MODIFIER LET modrx&=39 ! FTEXT in tree MODIFIER LET modry&=40 ! FTEXT in tree MODIFIER LET modrz&=41 ! FTEXT in tree MODIFIER LET souediri&=42 ! IBOX in tree MODIFIER LET trisomx1&=43 ! FTEXT in tree MODIFIER LET trisomy1&=45 ! FTEXT in tree MODIFIER LET trisomz1&=46 ! FTEXT in tree MODIFIER LET trisomx2&=47 ! FTEXT in tree MODIFIER LET trisomy2&=49 ! FTEXT in tree MODIFIER LET trisomz2&=50 ! FTEXT in tree MODIFIER LET trisomx3&=51 ! FTEXT in tree MODIFIER LET trisomy3&=53 ! FTEXT in tree MODIFIER LET trisomz3&=54 ! FTEXT in tree MODIFIER LET modtaide&=55 ! USERDEF in tree MODIFIER LET modcoul&=56 ! FBOXTEXT in tree MODIFIER LET modbez&=60 ! IBOX in tree MODIFIER LET facinout&=61 ! USERDEF in tree MODIFIER LET modcsg&=65 ! IBOX in tree MODIFIER LET modquart&=69 ! IBOX in tree MODIFIER LET modquadr&=73 ! IBOX in tree MODIFIER LET rapptext&=74 ! TEXT in tree MODIFIER LET rappcone&=75 ! FTEXT in tree MODIFIER LET ouvert&=79 ! IBOX in tree MODIFIER LET encones&=83 ! IBOX in tree MODIFIER LET ensmooth&=87 ! IBOX in tree MODIFIER LET sousplus&=88 ! IBOX in tree MODIFIER LET modthrbl&=89 ! FTEXT in tree MODIFIER LET modforbl&=90 ! FTEXT in tree MODIFIER LET modtora1&=91 ! FTEXT in tree MODIFIER LET modtora2&=92 ! FTEXT in tree MODIFIER LET valmod&=97 ! IBOX in tree MODIFIER LET modipere&=101 ! IBOX in tree MODIFIER LET annupere&=105 ! IBOX in tree MODIFIER ' LET moditail&=4 ! Form/Dialog-box LET saisinom&=4 ! FBOXTEXT in tree MODITAIL LET annsais&=8 ! IBOX in tree MODITAIL LET valisais&=13 ! IBOX in tree MODITAIL ' LET lumieres&=5 ! Form/Dialog-box LET nbrsour&=8 ! FTEXT in tree LUMIERES LET sournbr&=10 ! IBOX in tree LUMIERES LET sourplus&=14 ! IBOX in tree LUMIERES LET sourmoin&=18 ! IBOX in tree LUMIERES LET nom_src&=19 ! FBOXTEXT in tree LUMIERES LET souscoul&=20 ! BOX in tree LUMIERES LET soleil&=21 ! USERDEF in tree LUMIERES LET projecte&=23 ! USERDEF in tree LUMIERES LET surface&=25 ! USERDEF in tree LUMIERES LET sourenx&=30 ! FTEXT in tree LUMIERES LET soureny&=31 ! FTEXT in tree LUMIERES LET sourenz&=32 ! FTEXT in tree LUMIERES LET posobjlu&=36 ! IBOX in tree LUMIERES LET viseenx&=40 ! FTEXT in tree LUMIERES LET viseeny&=41 ! FTEXT in tree LUMIERES LET viseenz&=42 ! FTEXT in tree LUMIERES LET posvislu&=46 ! IBOX in tree LUMIERES LET surflarg&=51 ! FTEXT in tree LUMIERES LET surflong&=52 ! FTEXT in tree LUMIERES LET surfrotx&=53 ! FTEXT in tree LUMIERES LET surfjitt&=57 ! USERDEF in tree LUMIERES LET surfroty&=58 ! FTEXT in tree LUMIERES LET surfadap&=59 ! FTEXT in tree LUMIERES LET objelumi&=60 ! USERDEF in tree LUMIERES LET txtetat&=63 ! TEXT in tree LUMIERES LET souretat&=65 ! IBOX in tree LUMIERES LET sourincl&=70 ! FTEXT in tree LUMIERES LET inclsour&=72 ! IBOX in tree LUMIERES LET surcylin&=74 ! USERDEF in tree LUMIERES LET suratmos&=77 ! USERDEF in tree LUMIERES LET radius&=79 ! FTEXT in tree LUMIERES LET surombre&=80 ! USERDEF in tree LUMIERES LET surinter&=83 ! USERDEF in tree LUMIERES LET falloff&=85 ! FTEXT in tree LUMIERES LET surfade1&=87 ! BOXTEXT in tree LUMIERES LET surfade2&=88 ! BOXTEXT in tree LUMIERES LET surdista&=90 ! FTEXT in tree LUMIERES LET valsour&=98 ! IBOX in tree LUMIERES LET annusour&=102 ! IBOX in tree LUMIERES LET peretigh&=104 ! IBOX in tree LUMIERES LET filstigh&=106 ! TEXT in tree LUMIERES LET bfilstig&=108 ! IBOX in tree LUMIERES ' LET aide&=6 ! Form/Dialog-box LET touches&=10 ! IBOX in tree AIDE LET infsupp&=14 ! IBOX in tree AIDE LET clavier&=15 ! IBOX in tree AIDE LET finaide&=34 ! IBOX in tree AIDE LET aidesous&=35 ! IBOX in tree AIDE ' LET fonction&=7 ! Form/Dialog-box LET titrfnct&=3 ! BOXTEXT in tree FONCTION LET titrcsg&=7 ! BOXTEXT in tree FONCTION LET soustout&=9 ! IBOX in tree FONCTION LET fnct01&=11 ! FTEXT in tree FONCTION LET fnct02&=27 ! FTEXT in tree FONCTION LET sousfnct&=28 ! IBOX in tree FONCTION LET fnctzero&=29 ! USERDEF in tree FONCTION LET fncthau&=30 ! USERDEF in tree FONCTION LET fnctbas&=31 ! USERDEF in tree FONCTION LET fnctmaxi&=32 ! USERDEF in tree FONCTION LET fnctpere&=33 ! IBOX in tree FONCTION LET fnctfils&=34 ! IBOX in tree FONCTION LET bfnctfil&=36 ! IBOX in tree FONCTION LET titrblob&=37 ! BOXTEXT in tree FONCTION LET souscsg0&=38 ! IBOX in tree FONCTION LET fncttout&=42 ! IBOX in tree FONCTION LET fnctrien&=46 ! IBOX in tree FONCTION LET union&=51 ! IBOX in tree FONCTION LET intersec&=56 ! IBOX in tree FONCTION LET differen&=61 ! IBOX in tree FONCTION LET merge&=66 ! IBOX in tree FONCTION LET souseffa&=67 ! IBOX in tree FONCTION LET etout&=71 ! IBOX in tree FONCTION LET erien&=75 ! IBOX in tree FONCTION LET icndemas&=79 ! IBOX in tree FONCTION LET icnefftx&=81 ! TEXT in tree FONCTION LET icneff&=83 ! IBOX in tree FONCTION LET boutblob&=84 ! TEXT in tree FONCTION LET blobtitr&=85 ! TEXT in tree FONCTION LET blobtres&=86 ! FTEXT in tree FONCTION LET titreinv&=87 ! BOXTEXT in tree FONCTION LET titreffa&=88 ! BOXTEXT in tree FONCTION LET valfnct&=93 ! IBOX in tree FONCTION LET souslist&=94 ! IBOX in tree FONCTION LET lte01&=96 ! FTEXT in tree FONCTION LET lte02&=112 ! FTEXT in tree FONCTION ' LET statisti&=8 ! Form/Dialog-box LET total&=9 ! FTEXT in tree STATISTI LET i0&=10 ! FTEXT in tree STATISTI LET ibe&=11 ! FTEXT in tree STATISTI LET i1&=12 ! FTEXT in tree STATISTI LET im3d2&=13 ! FTEXT in tree STATISTI LET i2&=14 ! FTEXT in tree STATISTI LET iau&=15 ! FTEXT in tree STATISTI LET i3&=16 ! FTEXT in tree STATISTI LET iquar&=17 ! FTEXT in tree STATISTI LET i4&=18 ! FTEXT in tree STATISTI LET iquad&=19 ! FTEXT in tree STATISTI LET i5&=20 ! FTEXT in tree STATISTI LET iu&=21 ! FTEXT in tree STATISTI LET i6&=22 ! FTEXT in tree STATISTI LET ii&=23 ! FTEXT in tree STATISTI LET i7&=24 ! FTEXT in tree STATISTI LET id&=25 ! FTEXT in tree STATISTI LET i8&=26 ! FTEXT in tree STATISTI LET imer&=27 ! FTEXT in tree STATISTI LET i9&=28 ! FTEXT in tree STATISTI LET iblob&=29 ! FTEXT in tree STATISTI LET i10&=30 ! FTEXT in tree STATISTI LET i11&=31 ! FTEXT in tree STATISTI LET i12&=32 ! FTEXT in tree STATISTI LET memoccup&=35 ! FTEXT in tree STATISTI LET memdispo&=36 ! FTEXT in tree STATISTI LET valstat&=41 ! IBOX in tree STATISTI ' LET animatio&=9 ! Form/Dialog-box LET anime018&=7 ! USERDEF in tree ANIMATIO LET anime019&=8 ! USERDEF in tree ANIMATIO LET anime011&=9 ! IBOX in tree ANIMATIO LET anime012&=10 ! USERDEF in tree ANIMATIO LET anime013&=11 ! USERDEF in tree ANIMATIO LET anime014&=12 ! USERDEF in tree ANIMATIO LET anime017&=13 ! USERDEF in tree ANIMATIO LET anime016&=14 ! USERDEF in tree ANIMATIO LET anime015&=15 ! USERDEF in tree ANIMATIO LET anime002&=16 ! IBOX in tree ANIMATIO LET anime003&=17 ! USERDEF in tree ANIMATIO LET anime001&=18 ! FTEXT in tree ANIMATIO LET anime004&=19 ! IBOX in tree ANIMATIO LET anime005&=20 ! IBOX in tree ANIMATIO LET anime006&=21 ! IBOX in tree ANIMATIO LET anime007&=22 ! IBOX in tree ANIMATIO LET anime008&=23 ! IBOX in tree ANIMATIO LET anime009&=24 ! IBOX in tree ANIMATIO LET anime010&=25 ! USERDEF in tree ANIMATIO ' LET arbmerci&=10 ! Form/Dialog-box LET inf_cadre&=8 ! IBOX in tree ARBMERCI LET inf_contenu&=9 ! BOX in tree ARBMERCI LET merci_txt_1&=10 ! TEXT in tree ARBMERCI LET merci_txt_2&=44 ! TEXT in tree ARBMERCI LET souscursrem&=45 ! IBOX in tree ARBMERCI LET popchozerem&=46 ! USERDEF in tree ARBMERCI LET popchoharem&=47 ! USERDEF in tree ARBMERCI LET popchobarem&=48 ! USERDEF in tree ARBMERCI LET popchofirem&=49 ! USERDEF in tree ARBMERCI LET popchoperem&=50 ! IBOX in tree ARBMERCI LET popchocarem&=51 ! IBOX in tree ARBMERCI LET bpopchocrem&=53 ! IBOX in tree ARBMERCI LET sousok_inf&=54 ! IBOX in tree ARBMERCI LET okmerci&=58 ! IBOX in tree ARBMERCI ' LET posecame&=11 ! Form/Dialog-box LET souscamc&=7 ! IBOX in tree POSECAME LET poscamx&=12 ! FTEXT in tree POSECAME LET posversx&=13 ! FTEXT in tree POSECAME LET poscamy&=14 ! FTEXT in tree POSECAME LET posversy&=15 ! FTEXT in tree POSECAME LET posangle&=16 ! FTEXT in tree POSECAME LET poscamz&=17 ! FTEXT in tree POSECAME LET posversz&=18 ! FTEXT in tree POSECAME LET camposob&=22 ! IBOX in tree POSECAME LET camvisob&=26 ! IBOX in tree POSECAME LET souscame&=27 ! IBOX in tree POSECAME LET camfocac&=29 ! USERDEF in tree POSECAME LET possampl&=33 ! FTEXT in tree POSECAME LET posapert&=35 ! FTEXT in tree POSECAME LET posfocax&=37 ! FTEXT in tree POSECAME LET posfocay&=38 ! FTEXT in tree POSECAME LET posfocaz&=39 ! FTEXT in tree POSECAME LET camfocob&=43 ! IBOX in tree POSECAME LET souscamp&=44 ! IBOX in tree POSECAME LET posper01&=49 ! IBOX in tree POSECAME LET posper02&=53 ! IBOX in tree POSECAME LET posper03&=57 ! IBOX in tree POSECAME LET posper04&=61 ! IBOX in tree POSECAME LET posper05&=65 ! IBOX in tree POSECAME LET posper06&=69 ! IBOX in tree POSECAME LET posper07&=73 ! IBOX in tree POSECAME LET postyp1&=77 ! IBOX in tree POSECAME LET postyp2&=81 ! IBOX in tree POSECAME LET postyp3&=85 ! IBOX in tree POSECAME LET postyp4&=89 ! IBOX in tree POSECAME LET souscamf&=95 ! IBOX in tree POSECAME LET posob50&=99 ! IBOX in tree POSECAME LET posob6&=103 ! IBOX in tree POSECAME LET posobdeg&=104 ! FTEXT in tree POSECAME LET posob135&=108 ! IBOX in tree POSECAME LET posob280&=112 ! IBOX in tree POSECAME LET posob400&=116 ! IBOX in tree POSECAME LET posobxxx&=120 ! IBOX in tree POSECAME LET posob35&=124 ! IBOX in tree POSECAME LET posob28&=128 ! IBOX in tree POSECAME LET posob24&=132 ! IBOX in tree POSECAME LET posob18&=136 ! IBOX in tree POSECAME LET posnorma&=143 ! IBOX in tree POSECAME LET okposcam&=148 ! IBOX in tree POSECAME LET anposcam&=152 ! IBOX in tree POSECAME ' ++SYM RETURN > PROCEDURE index_ressource_2 ! Constantes globales du ressource nø2 ' ++SYM REM Resource file indices for RSC_2. ' LET lancepov&=0 ! Form/Dialog-box LET povscrip&=8 ! FTEXT in tree LANCEPOV LET povforma&=12 ! IBOX in tree LANCEPOV LET povimage&=15 ! FTEXT in tree LANCEPOV LET povquali&=22 ! IBOX in tree LANCEPOV LET povradio&=26 ! IBOX in tree LANCEPOV LET povgene&=32 ! USERDEF in tree LANCEPOV LET povaffi&=34 ! USERDEF in tree LANCEPOV LET txtmode&=37 ! TEXT in tree LANCEPOV LET modeaffi&=39 ! IBOX in tree LANCEPOV LET povatte&=40 ! USERDEF in tree LANCEPOV LET povater&=42 ! USERDEF in tree LANCEPOV LET povutsl&=44 ! USERDEF in tree LANCEPOV LET povslabs&=46 ! FTEXT in tree LANCEPOV LET povmosai&=48 ! USERDEF in tree LANCEPOV LET mosadebu&=54 ! IBOX in tree LANCEPOV LET mosafin&=59 ! IBOX in tree LANCEPOV LET povnume&=60 ! USERDEF in tree LANCEPOV LET buffonof&=62 ! USERDEF in tree LANCEPOV LET povbuffe&=63 ! FTEXT in tree LANCEPOV LET pov_ga&=64 ! USERDEF in tree LANCEPOV LET pov_ul&=66 ! USERDEF in tree LANCEPOV LET pov_uv&=68 ! USERDEF in tree LANCEPOV LET pov_gd&=70 ! USERDEF in tree LANCEPOV LET pov_ur&=72 ! USERDEF in tree LANCEPOV LET pov_gf&=74 ! USERDEF in tree LANCEPOV LET pov_su&=76 ! USERDEF in tree LANCEPOV LET pov_gr&=78 ! USERDEF in tree LANCEPOV LET pov_ua&=80 ! USERDEF in tree LANCEPOV LET pov_gs&=82 ! USERDEF in tree LANCEPOV LET bpc&=84 ! FTEXT in tree LANCEPOV LET pov_gw&=85 ! USERDEF in tree LANCEPOV LET povlarge&=91 ! FTEXT in tree LANCEPOV LET povhaute&=92 ! FTEXT in tree LANCEPOV LET cpovdebu&=93 ! FTEXT in tree LANCEPOV LET rpovdebu&=94 ! FTEXT in tree LANCEPOV LET cpovfin&=95 ! FTEXT in tree LANCEPOV LET rpovfin&=96 ! FTEXT in tree LANCEPOV LET format0&=98 ! TEXT in tree LANCEPOV LET format1&=106 ! TEXT in tree LANCEPOV LET povcont&=107 ! USERDEF in tree LANCEPOV LET antionof&=109 ! USERDEF in tree LANCEPOV LET povlafa&=111 ! USERDEF in tree LANCEPOV LET povpere&=114 ! IBOX in tree LANCEPOV LET povfils&=116 ! FTEXT in tree LANCEPOV LET bpovfil&=118 ! IBOX in tree LANCEPOV LET povmat01&=120 ! BOXTEXT in tree LANCEPOV LET povmat09&=128 ! BOXTEXT in tree LANCEPOV LET jittonof&=129 ! USERDEF in tree LANCEPOV LET jittpere&=132 ! IBOX in tree LANCEPOV LET jittfils&=134 ! FTEXT in tree LANCEPOV LET bjittfil&=136 ! IBOX in tree LANCEPOV LET povok&=141 ! IBOX in tree LANCEPOV LET povsauv&=145 ! IBOX in tree LANCEPOV LET povannul&=149 ! IBOX in tree LANCEPOV ' LET chemintr&=1 ! Form/Dialog-box LET bartit03&=3 ! FBOXTEXT in tree CHEMINTR LET cheebs&=7 ! FTEXT in tree CHEMINTR LET chepov&=8 ! FTEXT in tree CHEMINTR LET cheimg&=9 ! FTEXT in tree CHEMINTR LET chettp&=10 ! FTEXT in tree CHEMINTR LET chetxt&=11 ! FTEXT in tree CHEMINTR LET chevis&=12 ! FTEXT in tree CHEMINTR LET cheund&=13 ! FTEXT in tree CHEMINTR LET cheinc&=14 ! FTEXT in tree CHEMINTR LET che3d2&=15 ! FTEXT in tree CHEMINTR LET cheext&=16 ! FTEXT in tree CHEMINTR LET def_x&=18 ! FTEXT in tree CHEMINTR LET def_y&=19 ! FTEXT in tree CHEMINTR LET def_z&=20 ! FTEXT in tree CHEMINTR LET limites&=22 ! FTEXT in tree CHEMINTR LET consxpov&=24 ! FTEXT in tree CHEMINTR LET consypov&=26 ! FTEXT in tree CHEMINTR LET tailgril&=28 ! FTEXT in tree CHEMINTR LET bot_opengl&=29 ! STRING in tree CHEMINTR LET act_opengl&=30 ! USERDEF in tree CHEMINTR LET cheundo&=32 ! FTEXT in tree CHEMINTR LET chelangu&=36 ! IBOX in tree CHEMINTR LET chebou00&=38 ! IBOX in tree CHEMINTR LET chebou01&=39 ! USERDEF in tree CHEMINTR LET chebou02&=40 ! USERDEF in tree CHEMINTR LET chebou03&=41 ! USERDEF in tree CHEMINTR LET chebou04&=42 ! USERDEF in tree CHEMINTR LET chebou05&=43 ! USERDEF in tree CHEMINTR LET chebou06&=44 ! USERDEF in tree CHEMINTR LET chemarq&=46 ! USERDEF in tree CHEMINTR LET chedetai&=48 ! FTEXT in tree CHEMINTR LET chet2g&=52 ! IBOX in tree CHEMINTR LET cheok&=57 ! IBOX in tree CHEMINTR LET chediver&=61 ! IBOX in tree CHEMINTR LET cheautre&=65 ! IBOX in tree CHEMINTR LET cheannul&=69 ! IBOX in tree CHEMINTR ' LET bicubics&=2 ! Form/Dialog-box LET fracha&=7 ! USERDEF in tree BICUBICS LET frasau&=8 ! USERDEF in tree BICUBICS LET frczero&=9 ! USERDEF in tree BICUBICS LET frchori&=10 ! USERDEF in tree BICUBICS LET frcvert&=11 ! USERDEF in tree BICUBICS LET frcprof&=12 ! USERDEF in tree BICUBICS LET senhori&=13 ! USERDEF in tree BICUBICS LET senvert&=14 ! USERDEF in tree BICUBICS LET senprof&=15 ! USERDEF in tree BICUBICS LET invefrac&=16 ! USERDEF in tree BICUBICS LET somx01&=23 ! FTEXT in tree BICUBICS LET somy01&=24 ! FTEXT in tree BICUBICS LET somz01&=25 ! FTEXT in tree BICUBICS LET somx02&=26 ! FTEXT in tree BICUBICS LET somy02&=27 ! FTEXT in tree BICUBICS LET somz02&=28 ! FTEXT in tree BICUBICS LET somx03&=29 ! FTEXT in tree BICUBICS LET somy03&=30 ! FTEXT in tree BICUBICS LET somz03&=31 ! FTEXT in tree BICUBICS LET somx04&=32 ! FTEXT in tree BICUBICS LET somy04&=33 ! FTEXT in tree BICUBICS LET somz04&=34 ! FTEXT in tree BICUBICS LET somx05&=35 ! FTEXT in tree BICUBICS LET somy05&=36 ! FTEXT in tree BICUBICS LET somz05&=37 ! FTEXT in tree BICUBICS LET somx06&=38 ! FTEXT in tree BICUBICS LET somy06&=39 ! FTEXT in tree BICUBICS LET somz06&=40 ! FTEXT in tree BICUBICS LET somx07&=41 ! FTEXT in tree BICUBICS LET somy07&=42 ! FTEXT in tree BICUBICS LET somz07&=43 ! FTEXT in tree BICUBICS LET somx08&=44 ! FTEXT in tree BICUBICS LET somy08&=45 ! FTEXT in tree BICUBICS LET somz08&=46 ! FTEXT in tree BICUBICS LET somx09&=47 ! FTEXT in tree BICUBICS LET somy09&=48 ! FTEXT in tree BICUBICS LET somz09&=49 ! FTEXT in tree BICUBICS LET somx10&=50 ! FTEXT in tree BICUBICS LET somy10&=51 ! FTEXT in tree BICUBICS LET somz10&=52 ! FTEXT in tree BICUBICS LET somx11&=53 ! FTEXT in tree BICUBICS LET somy11&=54 ! FTEXT in tree BICUBICS LET somz11&=55 ! FTEXT in tree BICUBICS LET somx12&=56 ! FTEXT in tree BICUBICS LET somy12&=57 ! FTEXT in tree BICUBICS LET somz12&=58 ! FTEXT in tree BICUBICS LET somx13&=59 ! FTEXT in tree BICUBICS LET somy13&=60 ! FTEXT in tree BICUBICS LET somz13&=61 ! FTEXT in tree BICUBICS LET somx14&=62 ! FTEXT in tree BICUBICS LET somy14&=63 ! FTEXT in tree BICUBICS LET somz14&=64 ! FTEXT in tree BICUBICS LET somx15&=65 ! FTEXT in tree BICUBICS LET somy15&=66 ! FTEXT in tree BICUBICS LET somz15&=67 ! FTEXT in tree BICUBICS LET somx16&=68 ! FTEXT in tree BICUBICS LET somy16&=69 ! FTEXT in tree BICUBICS LET somz16&=70 ! FTEXT in tree BICUBICS LET sou01&=93 ! IBOX in tree BICUBICS LET niv01&=101 ! IBOX in tree BICUBICS LET fraopt&=108 ! USERDEF in tree BICUBICS LET fragen&=113 ! IBOX in tree BICUBICS LET fraann&=117 ! IBOX in tree BICUBICS ' LET copier&=3 ! Form/Dialog-box LET conombr&=8 ! FTEXT in tree COPIER LET comdistx&=25 ! FTEXT in tree COPIER LET comdisty&=26 ! FTEXT in tree COPIER LET comdistz&=27 ! FTEXT in tree COPIER LET codegrex&=28 ! FTEXT in tree COPIER LET codegrey&=29 ! FTEXT in tree COPIER LET codegrez&=30 ! FTEXT in tree COPIER LET coptauxx&=31 ! FTEXT in tree COPIER LET coptauxy&=32 ! FTEXT in tree COPIER LET coptauxz&=33 ! FTEXT in tree COPIER LET coalea0x&=36 ! FTEXT in tree COPIER LET coalea0y&=37 ! FTEXT in tree COPIER LET coalea0z&=38 ! FTEXT in tree COPIER LET coalea1x&=39 ! FTEXT in tree COPIER LET coalea1y&=40 ! FTEXT in tree COPIER LET coalea1z&=41 ! FTEXT in tree COPIER LET coalea2x&=42 ! FTEXT in tree COPIER LET coalea2y&=43 ! FTEXT in tree COPIER LET coalea2z&=44 ! FTEXT in tree COPIER LET distri0x&=45 ! USERDEF in tree COPIER LET distri0y&=46 ! USERDEF in tree COPIER LET distri0z&=47 ! USERDEF in tree COPIER LET distri1x&=48 ! USERDEF in tree COPIER LET distri1y&=49 ! USERDEF in tree COPIER LET distri1z&=50 ! USERDEF in tree COPIER LET corefer0&=67 ! IBOX in tree COPIER LET corefer1&=71 ! IBOX in tree COPIER LET coinitia&=73 ! FTEXT in tree COPIER LET copimult&=79 ! IBOX in tree COPIER LET coannul&=83 ! IBOX in tree COPIER ' LET popupdiv&=4 ! Form/Dialog-box LET chxprimi&=1 ! IBOX in tree POPUPDIV LET pop0&=2 ! TEXT in tree POPUPDIV LET pop1&=14 ! TEXT in tree POPUPDIV LET chxfnct&=15 ! IBOX in tree POPUPDIV LET fnc01&=16 ! TEXT in tree POPUPDIV LET fnc02&=19 ! TEXT in tree POPUPDIV LET chxcoul&=20 ! IBOX in tree POPUPDIV LET coul0&=21 ! BOXTEXT in tree POPUPDIV LET coul15&=36 ! BOXTEXT in tree POPUPDIV LET chxcalqu&=37 ! IBOX in tree POPUPDIV LET numani01&=38 ! TEXT in tree POPUPDIV LET numani10&=47 ! TEXT in tree POPUPDIV LET chxrendu&=48 ! IBOX in tree POPUPDIV LET povrend0&=49 ! TEXT in tree POPUPDIV LET povrend1&=60 ! TEXT in tree POPUPDIV LET chxoutfi&=61 ! IBOX in tree POPUPDIV LET outfile0&=62 ! TEXT in tree POPUPDIV LET outfile1&=66 ! TEXT in tree POPUPDIV LET chxtrace&=67 ! IBOX in tree POPUPDIV LET poppal0&=68 ! TEXT in tree POPUPDIV LET poppal1&=71 ! TEXT in tree POPUPDIV LET chxhalde&=72 ! IBOX in tree POPUPDIV LET haldes01&=73 ! TEXT in tree POPUPDIV LET haldes02&=78 ! TEXT in tree POPUPDIV LET chxhalty&=79 ! IBOX in tree POPUPDIV LET haltyp01&=80 ! TEXT in tree POPUPDIV LET haltyp02&=84 ! TEXT in tree POPUPDIV LET chxmosai&=85 ! IBOX in tree POPUPDIV LET mosaic01&=86 ! TEXT in tree POPUPDIV LET mosaic02&=92 ! TEXT in tree POPUPDIV LET chxbicub&=93 ! IBOX in tree POPUPDIV LET bicub01&=94 ! IMAGE in tree POPUPDIV LET bicub02&=100 ! IMAGE in tree POPUPDIV LET chxstep&=101 ! IBOX in tree POPUPDIV LET step01&=102 ! TEXT in tree POPUPDIV LET step02&=109 ! TEXT in tree POPUPDIV LET chxflatn&=110 ! IBOX in tree POPUPDIV LET flat01&=111 ! TEXT in tree POPUPDIV LET flat02&=120 ! TEXT in tree POPUPDIV LET chxmarq&=121 ! IBOX in tree POPUPDIV LET marq01&=122 ! USERDEF in tree POPUPDIV LET marq02&=125 ! USERDEF in tree POPUPDIV LET chxface&=126 ! IBOX in tree POPUPDIV LET faces01&=127 ! TEXT in tree POPUPDIV LET faces02&=129 ! TEXT in tree POPUPDIV LET chxancsc&=130 ! IBOX in tree POPUPDIV LET ancsce01&=131 ! TEXT in tree POPUPDIV LET ancsce02&=136 ! TEXT in tree POPUPDIV ' ++SYM RETURN > PROCEDURE index_ressource_3 ! Constantes globales du ressource nø3 ' ++SYM REM Resource file indices for RSC_3. ' LET divpopu0&=0 ! Form/Dialog-box LET chxobjet&=1 ! IBOX in tree DIVPOPU0 LET souscurs&=2 ! IBOX in tree DIVPOPU0 LET popchoze&=3 ! USERDEF in tree DIVPOPU0 LET popchoha&=4 ! USERDEF in tree DIVPOPU0 LET popchoba&=5 ! USERDEF in tree DIVPOPU0 LET popchofi&=6 ! USERDEF in tree DIVPOPU0 LET popchope&=7 ! IBOX in tree DIVPOPU0 LET popchoca&=8 ! IBOX in tree DIVPOPU0 LET bpopchoc&=10 ! IBOX in tree DIVPOPU0 LET souspopc&=11 ! IBOX in tree DIVPOPU0 LET popcho01&=12 ! FTEXT in tree DIVPOPU0 LET popcho10&=21 ! FTEXT in tree DIVPOPU0 ' LET divpopu1&=1 ! Form/Dialog-box LET chxlumie&=1 ! IBOX in tree DIVPOPU1 LET soursope&=2 ! IBOX in tree DIVPOPU1 LET sourzero&=3 ! USERDEF in tree DIVPOPU1 LET sourhaut&=4 ! USERDEF in tree DIVPOPU1 LET sourbas&=5 ! USERDEF in tree DIVPOPU1 LET sourmaxi&=6 ! USERDEF in tree DIVPOPU1 LET sourpere&=7 ! IBOX in tree DIVPOPU1 LET sourfils&=8 ! IBOX in tree DIVPOPU1 LET sourbfil&=10 ! IBOX in tree DIVPOPU1 LET soursous&=11 ! IBOX in tree DIVPOPU1 LET popsour0&=12 ! FTEXT in tree DIVPOPU1 LET popsour1&=21 ! FTEXT in tree DIVPOPU1 ' LET divpopu2&=2 ! Form/Dialog-box LET chxvaleu&=1 ! IBOX in tree DIVPOPU2 LET valesous&=2 ! IBOX in tree DIVPOPU2 LET valehaut&=3 ! USERDEF in tree DIVPOPU2 LET valebas&=4 ! USERDEF in tree DIVPOPU2 LET valepere&=5 ! IBOX in tree DIVPOPU2 LET valefils&=6 ! IBOX in tree DIVPOPU2 LET bvalefil&=8 ! IBOX in tree DIVPOPU2 LET sousvale&=9 ! IBOX in tree DIVPOPU2 LET valeur01&=10 ! FTEXT in tree DIVPOPU2 LET valeur02&=17 ! FTEXT in tree DIVPOPU2 ' LET divpopu3&=3 ! Form/Dialog-box LET chxtextu&=1 ! IBOX in tree DIVPOPU3 LET soutexcr&=2 ! IBOX in tree DIVPOPU3 LET poptexze&=3 ! USERDEF in tree DIVPOPU3 LET poptexha&=4 ! USERDEF in tree DIVPOPU3 LET poptexba&=5 ! USERDEF in tree DIVPOPU3 LET poptexfi&=6 ! USERDEF in tree DIVPOPU3 LET poptexpe&=7 ! IBOX in tree DIVPOPU3 LET poptexca&=8 ! IBOX in tree DIVPOPU3 LET bpoptexc&=10 ! IBOX in tree DIVPOPU3 LET souspote&=11 ! IBOX in tree DIVPOPU3 LET poptex01&=12 ! FTEXT in tree DIVPOPU3 LET poptex10&=21 ! FTEXT in tree DIVPOPU3 ' LET messages&=4 ! Form/Dialog-box LET aide0&=10 ! STRING in tree MESSAGES LET creseg&=20 ! STRING in tree MESSAGES ' LET predefini&=5 ! Form/Dialog-box LET ficcolor&=7 ! FTEXT in tree PREDEFINI LET bficcolo&=9 ! IBOX in tree PREDEFINI LET couleur&=12 ! BOX in tree PREDEFINI LET ajoupred&=16 ! IBOX in tree PREDEFINI LET modipred&=20 ! IBOX in tree PREDEFINI LET effapred&=24 ! IBOX in tree PREDEFINI LET carrsatu&=28 ! FTEXT in tree PREDEFINI LET carrtein&=29 ! FTEXT in tree PREDEFINI LET rouetesa&=32 ! IBOX in tree PREDEFINI LET teinsatu&=33 ! IMAGE in tree PREDEFINI LET ascelumi&=34 ! IBOX in tree PREDEFINI LET carrlumi&=36 ! TEXT in tree PREDEFINI LET lumicarr&=38 ! IBOX in tree PREDEFINI LET ascetran&=42 ! IBOX in tree PREDEFINI LET carrtran&=44 ! TEXT in tree PREDEFINI LET trancarr&=46 ! IBOX in tree PREDEFINI LET asceroug&=49 ! IBOX in tree PREDEFINI LET carrroug&=51 ! TEXT in tree PREDEFINI LET rougcarr&=53 ! IBOX in tree PREDEFINI LET ascevert&=54 ! IBOX in tree PREDEFINI LET carrvert&=56 ! TEXT in tree PREDEFINI LET vertcarr&=58 ! IBOX in tree PREDEFINI LET ascebleu&=59 ! IBOX in tree PREDEFINI LET carrbleu&=61 ! TEXT in tree PREDEFINI LET bleucarr&=63 ! IBOX in tree PREDEFINI LET valprede&=71 ! IBOX in tree PREDEFINI LET cheprede&=75 ! IBOX in tree PREDEFINI LET annprede&=79 ! IBOX in tree PREDEFINI ' ++SYM RETURN > PROCEDURE index_ressource_4 ! Constantes globales du ressource nø4 ' ++SYM REM Resource file indices for RSC_4. ' LET les_calq&=0 ! Form/Dialog-box LET numacale&=10 ! IBOX in tree LES_CALQ LET numrefe&=14 ! IBOX in tree LES_CALQ LET camerefe&=18 ! IBOX in tree LES_CALQ LET poinrefe&=22 ! IBOX in tree LES_CALQ LET nomacale&=23 ! FBOXTEXT in tree LES_CALQ LET viserefe&=27 ! IBOX in tree LES_CALQ LET acalerx1&=34 ! USERDEF in tree LES_CALQ LET acalerx2&=35 ! USERDEF in tree LES_CALQ LET acalerx3&=36 ! USERDEF in tree LES_CALQ LET acalery1&=38 ! USERDEF in tree LES_CALQ LET acalery2&=39 ! USERDEF in tree LES_CALQ LET acalery3&=40 ! USERDEF in tree LES_CALQ LET acalerz1&=42 ! USERDEF in tree LES_CALQ LET acalerz2&=43 ! USERDEF in tree LES_CALQ LET acalerz3&=44 ! USERDEF in tree LES_CALQ LET sousrefe&=45 ! IBOX in tree LES_CALQ LET refx&=50 ! FTEXT in tree LES_CALQ LET refy&=51 ! FTEXT in tree LES_CALQ LET refz&=52 ! FTEXT in tree LES_CALQ LET refex1&=54 ! USERDEF in tree LES_CALQ LET refex2&=55 ! USERDEF in tree LES_CALQ LET refex3&=56 ! USERDEF in tree LES_CALQ LET refey1&=58 ! USERDEF in tree LES_CALQ LET refey2&=59 ! USERDEF in tree LES_CALQ LET refey3&=60 ! USERDEF in tree LES_CALQ LET refez1&=62 ! USERDEF in tree LES_CALQ LET refez2&=63 ! USERDEF in tree LES_CALQ LET refez3&=64 ! USERDEF in tree LES_CALQ LET okcalage&=69 ! IBOX in tree LES_CALQ LET ancalage&=73 ! IBOX in tree LES_CALQ ' LET anajauge&=1 ! Form/Dialog-box LET anaboite&=6 ! IBOX in tree ANAJAUGE ' LET statobje&=2 ! Form/Dialog-box LET soustaob&=5 ! IBOX in tree STATOBJE LET numstaob&=6 ! FTEXT in tree STATOBJE LET typstaob&=7 ! FTEXT in tree STATOBJE LET nomstaob&=8 ! FTEXT in tree STATOBJE LET nbpstaob&=9 ! FTEXT in tree STATOBJE LET nbfstaob&=10 ! FTEXT in tree STATOBJE LET finstaob&=15 ! IBOX in tree STATOBJE LET zerstaob&=16 ! USERDEF in tree STATOBJE LET haustaob&=17 ! USERDEF in tree STATOBJE LET nbrstaob&=18 ! FTEXT in tree STATOBJE LET basstaob&=19 ! USERDEF in tree STATOBJE LET maxstaob&=20 ! USERDEF in tree STATOBJE ' LET popupara&=3 ! Form/Dialog-box LET rapide&=5 ! IBOX in tree POPUPARA LET okpoppar&=9 ! IBOX in tree POPUPARA LET primsimp&=13 ! IBOX in tree POPUPARA LET fondgris&=17 ! IBOX in tree POPUPARA LET smooth&=21 ! IBOX in tree POPUPARA LET palsyste&=25 ! IBOX in tree POPUPARA LET backup&=29 ! IBOX in tree POPUPARA LET ecravirt&=33 ! IBOX in tree POPUPARA LET actiauto&=37 ! IBOX in tree POPUPARA LET bounding&=41 ! IBOX in tree POPUPARA LET ch100&=45 ! IBOX in tree POPUPARA LET ch255&=49 ! IBOX in tree POPUPARA LET pvise&=53 ! IBOX in tree POPUPARA LET creaauto&=57 ! IBOX in tree POPUPARA LET carrvisi&=61 ! IBOX in tree POPUPARA LET ctrlvisi&=65 ! IBOX in tree POPUPARA ' LET quartic&=4 ! Form/Dialog-box LET nomquart&=7 ! FBOXTEXT in tree QUARTIC LET valquar0&=14 ! FBOXTEXT in tree QUARTIC LET valquar1&=48 ! FBOXTEXT in tree QUARTIC LET charquar&=113 ! USERDEF in tree QUARTIC LET sauvquar&=114 ! USERDEF in tree QUARTIC LET okquarti&=119 ! IBOX in tree QUARTIC LET annquart&=123 ! IBOX in tree QUARTIC ' LET quadric&=5 ! Form/Dialog-box LET nomquadr&=7 ! FBOXTEXT in tree QUADRIC LET valquad0&=12 ! FBOXTEXT in tree QUADRIC LET valquad1&=21 ! FBOXTEXT in tree QUADRIC LET charquad&=38 ! USERDEF in tree QUADRIC LET sauvquad&=39 ! USERDEF in tree QUADRIC LET okquadri&=44 ! IBOX in tree QUADRIC LET annquadr&=48 ! IBOX in tree QUADRIC ' LET fen_vue&=6 ! Form/Dialog-box LET fenvue00&=0 ! BOX in tree FEN_VUE LET fenvu00b&=1 ! IBOX in tree FEN_VUE LET fenvueeb&=2 ! USERDEF in tree FEN_VUE LET fenvue02&=3 ! BOXTEXT in tree FEN_VUE LET fenvue2b&=4 ! IBOX in tree FEN_VUE LET fenvue23&=5 ! USERDEF in tree FEN_VUE LET fenvue24&=6 ! USERDEF in tree FEN_VUE LET fenvue04&=7 ! USERDEF in tree FEN_VUE LET fenvue03&=8 ! USERDEF in tree FEN_VUE LET fenvue05&=9 ! USERDEF in tree FEN_VUE LET fenvue06&=10 ! TEXT in tree FEN_VUE LET fenvue07&=11 ! BOX in tree FEN_VUE LET fenvue27&=12 ! BOX in tree FEN_VUE LET fenvue08&=13 ! IBOX in tree FEN_VUE LET fenvue10&=14 ! IBOX in tree FEN_VUE LET fenvue11&=15 ! IBOX in tree FEN_VUE LET fenvue12&=16 ! IBOX in tree FEN_VUE LET fenvue19&=17 ! USERDEF in tree FEN_VUE LET fenvue20&=18 ! USERDEF in tree FEN_VUE LET fenvue37&=19 ! BOX in tree FEN_VUE LET fenvue47&=20 ! BOX in tree FEN_VUE LET fenlib_x&=21 ! USERDEF in tree FEN_VUE LET fenlib_y&=22 ! USERDEF in tree FEN_VUE LET fenlib_z&=23 ! USERDEF in tree FEN_VUE LET fenvue13&=24 ! IBOX in tree FEN_VUE LET fenvue15&=25 ! IBOX in tree FEN_VUE LET fenvue16&=26 ! IBOX in tree FEN_VUE LET fenvue17&=27 ! IBOX in tree FEN_VUE LET fenvue22&=28 ! USERDEF in tree FEN_VUE LET fenvue21&=29 ! USERDEF in tree FEN_VUE LET fenhiera&=30 ! USERDEF in tree FEN_VUE LET fenvue18&=31 ! USERDEF in tree FEN_VUE ' LET biblio&=7 ! Form/Dialog-box LET charbibl&=7 ! USERDEF in tree BIBLIO LET zonebibl&=8 ! BOX in tree BIBLIO LET sauvbibl&=9 ! USERDEF in tree BIBLIO LET effabibl&=10 ! USERDEF in tree BIBLIO LET nombibl&=11 ! FBOXTEXT in tree BIBLIO LET ajoubib&=12 ! USERDEF in tree BIBLIO LET debubibl&=13 ! USERDEF in tree BIBLIO LET moinbibl&=14 ! USERDEF in tree BIBLIO LET plusbibl&=15 ! USERDEF in tree BIBLIO LET finbibl&=16 ! USERDEF in tree BIBLIO LET perebibl&=17 ! IBOX in tree BIBLIO LET filsbibl&=18 ! IBOX in tree BIBLIO LET bfilsbib&=20 ! IBOX in tree BIBLIO ' LET popincl&=8 ! Form/Dialog-box LET cheinca1&=5 ! USERDEF in tree POPINCL LET cheinc1&=6 ! FTEXT in tree POPINCL LET cheinca2&=7 ! USERDEF in tree POPINCL LET cheinc2&=8 ! FTEXT in tree POPINCL LET cheinca3&=9 ! USERDEF in tree POPINCL LET cheinc3&=10 ! FTEXT in tree POPINCL LET cheinca4&=11 ! USERDEF in tree POPINCL LET cheinc4&=12 ! FTEXT in tree POPINCL LET cheinca5&=13 ! USERDEF in tree POPINCL LET cheinc5&=14 ! FTEXT in tree POPINCL LET cheinca6&=15 ! USERDEF in tree POPINCL LET cheinc6&=16 ! FTEXT in tree POPINCL LET cheinca7&=17 ! USERDEF in tree POPINCL LET cheinc7&=18 ! FTEXT in tree POPINCL LET cheinca8&=19 ! USERDEF in tree POPINCL LET cheinc8&=20 ! FTEXT in tree POPINCL LET cheinca9&=21 ! USERDEF in tree POPINCL LET cheinc9&=22 ! FTEXT in tree POPINCL LET valichin&=27 ! IBOX in tree POPINCL LET annchein&=31 ! IBOX in tree POPINCL ' LET modules&=9 ! Form/Dialog-box LET drivsous&=5 ! IBOX in tree MODULES LET driv0&=7 ! FTEXT in tree MODULES LET driv1&=16 ! FTEXT in tree MODULES LET drivsouc&=17 ! IBOX in tree MODULES LET drivzero&=18 ! USERDEF in tree MODULES LET drivhaut&=19 ! USERDEF in tree MODULES LET drivbas&=20 ! USERDEF in tree MODULES LET drivfin&=21 ! USERDEF in tree MODULES LET drivpere&=23 ! IBOX in tree MODULES LET drivfils&=24 ! IBOX in tree MODULES LET bdrivfil&=26 ! IBOX in tree MODULES LET drivannu&=30 ! IBOX in tree MODULES LET drivok&=35 ! IBOX in tree MODULES ' LET vue_fine&=10 ! Form/Dialog-box LET barrendu&=3 ! FBOXTEXT in tree VUE_FINE LET sauvphon&=5 ! USERDEF in tree VUE_FINE LET gourphon&=7 ! BOX in tree VUE_FINE LET sizephon&=8 ! USERDEF in tree VUE_FINE ' LET jaugcour&=11 ! Form/Dialog-box LET oldsessi&=3 ! FBOXTEXT in tree JAUGCOUR LET courjaug&=6 ! IBOX in tree JAUGCOUR LET noncours&=12 ! IBOX in tree JAUGCOUR LET ouicours&=17 ! IBOX in tree JAUGCOUR ' LET calques&=12 ! Form/Dialog-box LET caldef01&=12 ! IBOX in tree CALQUES LET caldef02&=13 ! IBOX in tree CALQUES LET caldef03&=14 ! IBOX in tree CALQUES LET caldef04&=15 ! IBOX in tree CALQUES LET caldef05&=16 ! IBOX in tree CALQUES LET caldef06&=17 ! IBOX in tree CALQUES LET caldef07&=18 ! IBOX in tree CALQUES LET caldef08&=19 ! IBOX in tree CALQUES LET caldef09&=20 ! IBOX in tree CALQUES LET caldef10&=21 ! IBOX in tree CALQUES LET calnom01&=22 ! FBOXTEXT in tree CALQUES LET calnom02&=23 ! FBOXTEXT in tree CALQUES LET calnom03&=24 ! FBOXTEXT in tree CALQUES LET calnom04&=25 ! FBOXTEXT in tree CALQUES LET calnom05&=26 ! FBOXTEXT in tree CALQUES LET calnom06&=27 ! FBOXTEXT in tree CALQUES LET calnom07&=28 ! FBOXTEXT in tree CALQUES LET calnom08&=29 ! FBOXTEXT in tree CALQUES LET calnom09&=30 ! FBOXTEXT in tree CALQUES LET calnom10&=31 ! FBOXTEXT in tree CALQUES LET cavion01&=35 ! USERDEF in tree CALQUES LET cavion02&=36 ! USERDEF in tree CALQUES LET cavion03&=37 ! USERDEF in tree CALQUES LET cavion04&=38 ! USERDEF in tree CALQUES LET cavion05&=39 ! USERDEF in tree CALQUES LET cavion06&=40 ! USERDEF in tree CALQUES LET cavion07&=41 ! USERDEF in tree CALQUES LET cavion08&=42 ! USERDEF in tree CALQUES LET cavion09&=43 ! USERDEF in tree CALQUES LET cavion10&=44 ! USERDEF in tree CALQUES LET caviof01&=48 ! USERDEF in tree CALQUES LET caviof02&=49 ! USERDEF in tree CALQUES LET caviof03&=50 ! USERDEF in tree CALQUES LET caviof04&=51 ! USERDEF in tree CALQUES LET caviof05&=52 ! USERDEF in tree CALQUES LET caviof06&=53 ! USERDEF in tree CALQUES LET caviof07&=54 ! USERDEF in tree CALQUES LET caviof08&=55 ! USERDEF in tree CALQUES LET caviof09&=56 ! USERDEF in tree CALQUES LET caviof10&=57 ! USERDEF in tree CALQUES LET calcou01&=58 ! FBOXTEXT in tree CALQUES LET calcou02&=59 ! FBOXTEXT in tree CALQUES LET calcou03&=60 ! FBOXTEXT in tree CALQUES LET calcou04&=61 ! FBOXTEXT in tree CALQUES LET calcou05&=62 ! FBOXTEXT in tree CALQUES LET calcou06&=63 ! FBOXTEXT in tree CALQUES LET calcou07&=64 ! FBOXTEXT in tree CALQUES LET calcou08&=65 ! FBOXTEXT in tree CALQUES LET calcou09&=66 ! FBOXTEXT in tree CALQUES LET calcou10&=67 ! FBOXTEXT in tree CALQUES LET touscalq&=77 ! IBOX in tree CALQUES LET uncalq&=81 ! IBOX in tree CALQUES LET sortcalq&=86 ! IBOX in tree CALQUES LET annucalq&=90 ! IBOX in tree CALQUES ' LET inftemps&=13 ! Form/Dialog-box LET tmps01&=6 ! FTEXT in tree INFTEMPS LET tmps02&=7 ! FTEXT in tree INFTEMPS LET tmps03&=8 ! FTEXT in tree INFTEMPS LET tmps04&=9 ! FTEXT in tree INFTEMPS ' LET infobjet&=14 ! Form/Dialog-box LET infobj00&=10 ! FTEXT in tree INFOBJET LET infobj02&=12 ! FTEXT in tree INFOBJET LET infobj05&=13 ! FTEXT in tree INFOBJET LET infobj08&=14 ! FTEXT in tree INFOBJET LET infobj03&=17 ! FTEXT in tree INFOBJET LET infobj06&=18 ! FTEXT in tree INFOBJET LET infobj09&=19 ! FTEXT in tree INFOBJET LET infobj01&=20 ! FTEXT in tree INFOBJET LET infobj04&=22 ! FTEXT in tree INFOBJET LET infobj07&=23 ! FTEXT in tree INFOBJET LET infobj10&=24 ! FTEXT in tree INFOBJET ' LET par_t2g&=15 ! Form/Dialog-box LET t2gclose&=6 ! BOXCHAR in tree PAR_T2G LET t2gvert&=7 ! BOX in tree PAR_T2G LET t2gmove&=8 ! BOXTEXT in tree PAR_T2G LET t2ghori&=9 ! BOX in tree PAR_T2G LET t2gfulle&=10 ! BOXCHAR in tree PAR_T2G LET t2gsize&=11 ! BOXCHAR in tree PAR_T2G LET t2gfo4&=15 ! USERDEF in tree PAR_T2G LET t2gfo6&=17 ! USERDEF in tree PAR_T2G LET t2gfo13&=19 ! USERDEF in tree PAR_T2G LET t2gpal0&=22 ! USERDEF in tree PAR_T2G LET t2gpal1&=24 ! USERDEF in tree PAR_T2G LET t2gpal2&=26 ! USERDEF in tree PAR_T2G LET t2gpbuf&=30 ! USERDEF in tree PAR_T2G LET t2ggbuf&=32 ! USERDEF in tree PAR_T2G LET t2glbuf&=34 ! USERDEF in tree PAR_T2G LET t2gbuff&=36 ! FTEXT in tree PAR_T2G LET valit2g&=41 ! IBOX in tree PAR_T2G LET annut2g&=45 ! IBOX in tree PAR_T2G ' ++SYM RETURN > PROCEDURE index_ressource_5 ! Constantes globales du ressource nø5 ' ++SYM REM Resource file indices for RSC_5. ' LET multsele&=0 ! Form/Dialog-box LET modisemu&=5 ! USERDEF in tree MULTSELE LET textsemu&=6 ! USERDEF in tree MULTSELE LET pigmsemu&=7 ! USERDEF in tree MULTSELE LET normsemu&=8 ! USERDEF in tree MULTSELE LET finisemu&=9 ! USERDEF in tree MULTSELE LET halosemu&=10 ! USERDEF in tree MULTSELE LET atmosemu&=11 ! USERDEF in tree MULTSELE LET selesous&=12 ! IBOX in tree MULTSELE LET selcho01&=14 ! FTEXT in tree MULTSELE LET selcho10&=23 ! FTEXT in tree MULTSELE LET soussele&=24 ! IBOX in tree MULTSELE LET selchoze&=25 ! USERDEF in tree MULTSELE LET selchoha&=26 ! USERDEF in tree MULTSELE LET selchoba&=27 ! USERDEF in tree MULTSELE LET selchofi&=28 ! USERDEF in tree MULTSELE LET selchope&=29 ! IBOX in tree MULTSELE LET selchoca&=30 ! IBOX in tree MULTSELE LET bselchoc&=32 ! IBOX in tree MULTSELE LET valisele&=37 ! IBOX in tree MULTSELE LET riensele&=41 ! IBOX in tree MULTSELE LET toutsele&=45 ! IBOX in tree MULTSELE ' LET subjecti&=1 ! Form/Dialog-box LET poscampo&=12 ! IBOX in tree SUBJECTI LET poscamvi&=16 ! IBOX in tree SUBJECTI LET possubx&=17 ! FTEXT in tree SUBJECTI LET possuby&=18 ! FTEXT in tree SUBJECTI LET possubz&=20 ! FTEXT in tree SUBJECTI LET poslampo&=24 ! IBOX in tree SUBJECTI LET poslamvi&=28 ! IBOX in tree SUBJECTI LET subposob&=32 ! IBOX in tree SUBJECTI LET subcampo&=38 ! IBOX in tree SUBJECTI LET subcamvi&=42 ! IBOX in tree SUBJECTI LET subversx&=43 ! FTEXT in tree SUBJECTI LET subversy&=44 ! FTEXT in tree SUBJECTI LET subversz&=46 ! FTEXT in tree SUBJECTI LET sublampo&=50 ! IBOX in tree SUBJECTI LET sublamvi&=54 ! IBOX in tree SUBJECTI LET subvisob&=58 ! IBOX in tree SUBJECTI LET valisubj&=63 ! IBOX in tree SUBJECTI LET annusubj&=67 ! IBOX in tree SUBJECTI ' LET divers&=2 ! Form/Dialog-box LET acti&=1 ! STRING in tree DIVERS LET inacti&=2 ! STRING in tree DIVERS LET etatacti&=3 ! STRING in tree DIVERS LET etatinac&=4 ! STRING in tree DIVERS LET coordonn&=5 ! STRING in tree DIVERS LET titre&=6 ! STRING in tree DIVERS LET version&=7 ! STRING in tree DIVERS LET calcul&=8 ! STRING in tree DIVERS LET calcul1&=9 ! STRING in tree DIVERS LET definir&=10 ! STRING in tree DIVERS LET definie&=11 ! STRING in tree DIVERS LET rphon&=12 ! STRING in tree DIVERS LET rgour&=13 ! STRING in tree DIVERS LET creatinc&=14 ! STRING in tree DIVERS LET creatpov&=15 ! STRING in tree DIVERS LET nbiman&=16 ! STRING in tree DIVERS LET testanim&=17 ! STRING in tree DIVERS LET distance&=18 ! STRING in tree DIVERS LET lin0&=19 ! STRING in tree DIVERS LET lin1&=20 ! STRING in tree DIVERS LET lin2&=21 ! STRING in tree DIVERS LET lin3&=22 ! STRING in tree DIVERS LET lin4&=23 ! STRING in tree DIVERS LET lin5&=24 ! STRING in tree DIVERS LET lin6&=25 ! STRING in tree DIVERS LET lin7&=26 ! STRING in tree DIVERS LET lin8&=27 ! STRING in tree DIVERS LET lin9&=28 ! STRING in tree DIVERS LET lin10&=29 ! STRING in tree DIVERS LET lin11&=30 ! STRING in tree DIVERS LET lin12&=31 ! STRING in tree DIVERS LET lin13&=32 ! STRING in tree DIVERS LET lin14&=33 ! STRING in tree DIVERS LET lin15&=34 ! STRING in tree DIVERS LET lin16&=35 ! STRING in tree DIVERS LET lin17&=36 ! STRING in tree DIVERS LET lin18&=37 ! STRING in tree DIVERS LET lin19&=38 ! STRING in tree DIVERS LET lin20&=39 ! STRING in tree DIVERS LET lin21&=40 ! STRING in tree DIVERS LET lin22&=41 ! STRING in tree DIVERS LET lin23&=42 ! STRING in tree DIVERS LET lin24&=43 ! STRING in tree DIVERS LET lin25&=44 ! STRING in tree DIVERS LET lin26&=45 ! STRING in tree DIVERS LET lin27&=46 ! STRING in tree DIVERS LET lin28&=47 ! STRING in tree DIVERS LET lin29&=48 ! STRING in tree DIVERS LET lin30&=49 ! STRING in tree DIVERS LET lin31&=50 ! STRING in tree DIVERS LET lin32&=51 ! STRING in tree DIVERS LET lin33&=52 ! STRING in tree DIVERS LET lin34&=53 ! STRING in tree DIVERS LET lin35&=54 ! STRING in tree DIVERS LET lin36&=55 ! STRING in tree DIVERS LET lin37&=56 ! STRING in tree DIVERS LET lin38&=57 ! STRING in tree DIVERS LET lin39&=58 ! STRING in tree DIVERS LET txtinvis&=59 ! STRING in tree DIVERS LET txteffac&=60 ! STRING in tree DIVERS LET lin40&=61 ! STRING in tree DIVERS LET lin49&=62 ! STRING in tree DIVERS LET lin46&=63 ! STRING in tree DIVERS LET lin50&=64 ! STRING in tree DIVERS LET lin42&=65 ! STRING in tree DIVERS LET lin51&=66 ! STRING in tree DIVERS LET lin41&=67 ! STRING in tree DIVERS LET lin52&=68 ! STRING in tree DIVERS LET lin45&=69 ! STRING in tree DIVERS LET lin53&=70 ! STRING in tree DIVERS LET lin43&=71 ! STRING in tree DIVERS LET lin54&=72 ! STRING in tree DIVERS LET lin44&=73 ! STRING in tree DIVERS LET lin55&=74 ! STRING in tree DIVERS LET lin76&=75 ! STRING in tree DIVERS LET lin62&=76 ! STRING in tree DIVERS LET lin47&=77 ! STRING in tree DIVERS LET lin68&=78 ! STRING in tree DIVERS LET lin63&=79 ! STRING in tree DIVERS LET lin78&=80 ! STRING in tree DIVERS LET lin69&=81 ! STRING in tree DIVERS LET lin64&=82 ! STRING in tree DIVERS LET lin70&=83 ! STRING in tree DIVERS LET lin56&=84 ! STRING in tree DIVERS LET lin65&=85 ! STRING in tree DIVERS LET lin71&=86 ! STRING in tree DIVERS LET lin57&=87 ! STRING in tree DIVERS LET lin66&=88 ! STRING in tree DIVERS LET lin72&=89 ! STRING in tree DIVERS LET lin58&=90 ! STRING in tree DIVERS LET lin67&=91 ! STRING in tree DIVERS LET lin73&=92 ! STRING in tree DIVERS LET lin59&=93 ! STRING in tree DIVERS LET lin60&=94 ! STRING in tree DIVERS LET lin61&=95 ! STRING in tree DIVERS LET lin48&=96 ! STRING in tree DIVERS LET lin48_1&=97 ! STRING in tree DIVERS LET lin48_2&=98 ! STRING in tree DIVERS LET lin48_3&=99 ! STRING in tree DIVERS LET lin77&=100 ! STRING in tree DIVERS LET lin74&=101 ! STRING in tree DIVERS LET lin75&=102 ! STRING in tree DIVERS LET mouse_world&=103 ! IBOX in tree DIVERS ' LET lauteur&=3 ! Form/Dialog-box LET fin_img&=9 ! IBOX in tree LAUTEUR LET img_moi&=10 ! IBOX in tree LAUTEUR ' LET image_fond&=4 ! Form/Dialog-box LET imgfon01&=6 ! FTEXT in tree IMAGE_FOND LET imgfonok&=14 ! IBOX in tree IMAGE_FOND LET imgfonef&=18 ! IBOX in tree IMAGE_FOND ' LET hierarchie&=5 ! Form/Dialog-box LET hie_bar0&=3 ! BOXTEXT in tree HIERARCHIE LET hie_bar1&=4 ! IBOX in tree HIERARCHIE LET hie_fon&=5 ! USERDEF in tree HIERARCHIE LET hie_red&=6 ! USERDEF in tree HIERARCHIE LET hie_fer&=7 ! USERDEF in tree HIERARCHIE LET hie_sous&=8 ! BOX in tree HIERARCHIE LET hieascv0&=9 ! IBOX in tree HIERARCHIE LET hieascv1&=10 ! IBOX in tree HIERARCHIE LET hiefilv0&=11 ! IBOX in tree HIERARCHIE LET hiefilv1&=12 ! IBOX in tree HIERARCHIE LET hiefilv2&=13 ! IBOX in tree HIERARCHIE LET hiehauto&=14 ! USERDEF in tree HIERARCHIE LET hiehaut&=15 ! USERDEF in tree HIERARCHIE LET hiebas&=16 ! USERDEF in tree HIERARCHIE LET hiebasto&=17 ! USERDEF in tree HIERARCHIE LET hieasch0&=18 ! IBOX in tree HIERARCHIE LET hieasch1&=19 ! IBOX in tree HIERARCHIE LET hiefilh0&=20 ! IBOX in tree HIERARCHIE LET hiefilh1&=21 ! IBOX in tree HIERARCHIE LET hiefilh2&=22 ! IBOX in tree HIERARCHIE LET hiegauto&=23 ! USERDEF in tree HIERARCHIE LET hiegauch&=24 ! USERDEF in tree HIERARCHIE LET hiedroit&=25 ! USERDEF in tree HIERARCHIE LET hiedroto&=26 ! USERDEF in tree HIERARCHIE LET hie_size&=27 ! USERDEF in tree HIERARCHIE ' ++SYM RETURN > PROCEDURE index_ressource_6 ! Constantes globales du ressource nø6 ' ++SYM REM Indice du ressource pour RSC_6 ' LET infmotif&=0 ! Formulaire/Dialogue LET parvide1&=17 ! TEXT dans l'arbre INFMOTIF LET parvide4&=18 ! TEXT dans l'arbre INFMOTIF LET ta_1&=19 ! TEXT dans l'arbre INFMOTIF LET td_1&=20 ! TEXT dans l'arbre INFMOTIF LET td_2&=21 ! TEXT dans l'arbre INFMOTIF LET td_3&=22 ! TEXT dans l'arbre INFMOTIF LET td_4&=23 ! TEXT dans l'arbre INFMOTIF LET tf_1&=24 ! TEXT dans l'arbre INFMOTIF LET tf_2&=25 ! TEXT dans l'arbre INFMOTIF LET ti_1&=26 ! TEXT dans l'arbre INFMOTIF LET ti_2&=27 ! TEXT dans l'arbre INFMOTIF LET ti_3&=28 ! TEXT dans l'arbre INFMOTIF LET tk_1&=29 ! TEXT dans l'arbre INFMOTIF LET tk_2&=30 ! TEXT dans l'arbre INFMOTIF LET tk_3&=31 ! TEXT dans l'arbre INFMOTIF LET tm_1&=32 ! TEXT dans l'arbre INFMOTIF LET tp_1&=48 ! TEXT dans l'arbre INFMOTIF LET tp_2&=49 ! TEXT dans l'arbre INFMOTIF LET tp_3&=50 ! TEXT dans l'arbre INFMOTIF LET ts_1&=51 ! TEXT dans l'arbre INFMOTIF LET tt_1&=52 ! TEXT dans l'arbre INFMOTIF LET tcc_1&=53 ! TEXT dans l'arbre INFMOTIF LET tcc_2&=54 ! TEXT dans l'arbre INFMOTIF LET parvide2&=56 ! TEXT dans l'arbre INFMOTIF LET parvide5&=57 ! TEXT dans l'arbre INFMOTIF LET pa_1&=58 ! TEXT dans l'arbre INFMOTIF LET pd_1&=59 ! TEXT dans l'arbre INFMOTIF LET pd_2&=60 ! TEXT dans l'arbre INFMOTIF LET pd_3&=61 ! TEXT dans l'arbre INFMOTIF LET pd_4&=62 ! TEXT dans l'arbre INFMOTIF LET pd_5&=63 ! TEXT dans l'arbre INFMOTIF LET pd_6&=64 ! TEXT dans l'arbre INFMOTIF LET pf_1&=65 ! TEXT dans l'arbre INFMOTIF LET pf_2&=66 ! TEXT dans l'arbre INFMOTIF LET pf_3&=67 ! TEXT dans l'arbre INFMOTIF LET pf_4&=68 ! TEXT dans l'arbre INFMOTIF LET pi_1&=69 ! TEXT dans l'arbre INFMOTIF LET pi_2&=70 ! TEXT dans l'arbre INFMOTIF LET pi_3&=71 ! TEXT dans l'arbre INFMOTIF LET pk_1&=72 ! TEXT dans l'arbre INFMOTIF LET pk_2&=73 ! TEXT dans l'arbre INFMOTIF LET pk_3&=74 ! TEXT dans l'arbre INFMOTIF LET pk_4&=75 ! TEXT dans l'arbre INFMOTIF LET pk_5&=76 ! TEXT dans l'arbre INFMOTIF LET pk_6&=77 ! TEXT dans l'arbre INFMOTIF LET pm_1&=78 ! TEXT dans l'arbre INFMOTIF LET pp_1&=79 ! TEXT dans l'arbre INFMOTIF LET pp_2&=80 ! TEXT dans l'arbre INFMOTIF LET pp_3&=81 ! TEXT dans l'arbre INFMOTIF LET ps_1&=82 ! TEXT dans l'arbre INFMOTIF LET pt_1&=83 ! TEXT dans l'arbre INFMOTIF LET pcc_1&=84 ! TEXT dans l'arbre INFMOTIF LET pcc_2&=85 ! TEXT dans l'arbre INFMOTIF LET parvide3&=87 ! TEXT dans l'arbre INFMOTIF LET parvide6&=88 ! TEXT dans l'arbre INFMOTIF LET na_1&=89 ! TEXT dans l'arbre INFMOTIF LET na_2&=90 ! TEXT dans l'arbre INFMOTIF LET nb_1&=91 ! TEXT dans l'arbre INFMOTIF LET nc_1&=92 ! TEXT dans l'arbre INFMOTIF LET nd_1&=93 ! TEXT dans l'arbre INFMOTIF LET nd_2&=94 ! TEXT dans l'arbre INFMOTIF LET nd_3&=95 ! TEXT dans l'arbre INFMOTIF LET nd_4&=96 ! TEXT dans l'arbre INFMOTIF LET nd_5&=97 ! TEXT dans l'arbre INFMOTIF LET ne_1&=98 ! TEXT dans l'arbre INFMOTIF LET nf_1&=99 ! TEXT dans l'arbre INFMOTIF LET nf_2&=100 ! TEXT dans l'arbre INFMOTIF LET nf_3&=101 ! TEXT dans l'arbre INFMOTIF LET ng_1&=102 ! TEXT dans l'arbre INFMOTIF LET nh_1&=103 ! TEXT dans l'arbre INFMOTIF LET ni_1&=104 ! TEXT dans l'arbre INFMOTIF LET ni_2&=105 ! TEXT dans l'arbre INFMOTIF LET ni_3&=106 ! TEXT dans l'arbre INFMOTIF LET ni_4&=107 ! TEXT dans l'arbre INFMOTIF LET nj_1&=108 ! TEXT dans l'arbre INFMOTIF LET nk_1&=109 ! TEXT dans l'arbre INFMOTIF LET nk_2&=110 ! TEXT dans l'arbre INFMOTIF LET nk_3&=111 ! TEXT dans l'arbre INFMOTIF LET nk_4&=112 ! TEXT dans l'arbre INFMOTIF LET nl_1&=113 ! TEXT dans l'arbre INFMOTIF LET nm_1&=114 ! TEXT dans l'arbre INFMOTIF LET nm_2&=115 ! TEXT dans l'arbre INFMOTIF LET nn_1&=116 ! TEXT dans l'arbre INFMOTIF LET no_1&=117 ! TEXT dans l'arbre INFMOTIF LET np_1&=118 ! TEXT dans l'arbre INFMOTIF LET np_2&=119 ! TEXT dans l'arbre INFMOTIF LET np_3&=120 ! TEXT dans l'arbre INFMOTIF LET np_4&=121 ! TEXT dans l'arbre INFMOTIF LET nq_1&=122 ! TEXT dans l'arbre INFMOTIF LET nr_1&=123 ! TEXT dans l'arbre INFMOTIF LET ns_1&=124 ! TEXT dans l'arbre INFMOTIF LET ns_2&=125 ! TEXT dans l'arbre INFMOTIF LET nt_1&=126 ! TEXT dans l'arbre INFMOTIF LET nt_2&=127 ! TEXT dans l'arbre INFMOTIF LET nu_1&=128 ! TEXT dans l'arbre INFMOTIF LET nv_1&=129 ! TEXT dans l'arbre INFMOTIF LET nw_1&=130 ! TEXT dans l'arbre INFMOTIF LET nx_1&=131 ! TEXT dans l'arbre INFMOTIF LET ny_1&=132 ! TEXT dans l'arbre INFMOTIF LET nz_1&=133 ! TEXT dans l'arbre INFMOTIF LET naa_1&=134 ! TEXT dans l'arbre INFMOTIF LET nbb_1&=135 ! TEXT dans l'arbre INFMOTIF LET ncc_1&=136 ! TEXT dans l'arbre INFMOTIF LET ncc_2&=137 ! TEXT dans l'arbre INFMOTIF LET ncc_3&=138 ! TEXT dans l'arbre INFMOTIF ' ++SYM RETURN > PROCEDURE index_ressource_bubble_gem ! En cas de BUBBLE GEM en m‚moire ' ++SYM REM Indice du ressource pour BUBBLES ' LET bgem_000&=0 ! Formulaire/Dialogue LET bgem_001&=1 ! Formulaire/Dialogue LET bgem_002&=2 ! Formulaire/Dialogue LET bgem_003&=3 ! Formulaire/Dialogue LET bgem_004&=4 ! Formulaire/Dialogue LET bgem_005&=5 ! Formulaire/Dialogue LET bgem_006&=6 ! Formulaire/Dialogue LET bgem_007&=7 ! Formulaire/Dialogue LET bgem_008&=8 ! Formulaire/Dialogue LET bgem_009&=9 ! Formulaire/Dialogue LET bgem_010&=10 ! Formulaire/Dialogue LET bgem_011&=11 ! Formulaire/Dialogue LET bgem_012&=12 ! Formulaire/Dialogue LET bgem_013&=13 ! Formulaire/Dialogue LET bgem_014&=14 ! Formulaire/Dialogue LET bgem_015&=15 ! Formulaire/Dialogue LET bgem_016&=16 ! Formulaire/Dialogue LET bgem_017&=17 ! Formulaire/Dialogue LET bgem_018&=18 ! Formulaire/Dialogue LET bgem_019&=19 ! Formulaire/Dialogue LET bgem_020&=20 ! Formulaire/Dialogue LET bgem_021&=21 ! Formulaire/Dialogue LET bgem_022&=22 ! Formulaire/Dialogue LET bgem_023&=23 ! Formulaire/Dialogue LET bgem_024&=24 ! Formulaire/Dialogue LET bgem_025&=25 ! Formulaire/Dialogue LET bgem_026&=26 ! Formulaire/Dialogue LET bgem_027&=27 ! Formulaire/Dialogue LET bgem_028&=28 ! Formulaire/Dialogue LET bgem_029&=29 ! Formulaire/Dialogue ' ++SYM RETURN ' ****************************************************************************** > PROCEDURE reservation_memoire ! Un peu de m‚moire pour travailler LOCAL adresse%,taille_totale%,ef&,ad%,ad2%,x&,y&,w&,h& LOCAL ex&,ey&,ew&,eh&,i&,i% LOCAL d%,dl&,dh&,dp&,x11&,y11&,x21&,y21& LOCAL taille_univers% LOCAL taille_texture% LOCAL taille_pigment% LOCAL taille_normal% LOCAL taille_finish% LOCAL taille_interior% ' taille_univers%=MUL(limite_des_objets&,taille_objet&) ! Zone OBJET taille_texture%=MUL(limite_des_objets&,taille_texture&) ! Zone TEXTURE taille_pigment%=MUL(limite_des_objets&,taille_pigment&) ! Zone PIGMENT taille_normal%=MUL(limite_des_objets&,taille_normal&) ! Zone NORMAL taille_finish%=MUL(limite_des_objets&,taille_finish&) ! Zone FINISH taille_interior%=MUL(limite_des_objets&,taille_interior&) ! Zone INTERIOR ' CLR taille_totale% ADD taille_totale%,4 ! couleur_point% ADD taille_totale%,8 ! back_fond% ADD taille_totale%,12 ! memoire_modifier% ADD taille_totale%,16 ! zoo% ADD taille_totale%,20 ! mfdb% ADD taille_totale%,20 ! mfbd% ADD taille_totale%,24 ! mem_num% ADD taille_totale%,24 ! mem_subj% ADD taille_totale%,32 ! coef_rendu% ADD taille_totale%,32 ! buf% ADD taille_totale%,32 ! buf2% ADD taille_totale%,36 ! option% ADD taille_totale%,40 ! activation% ADD taille_totale%,40 ! deplace% ADD taille_totale%,48 ! matrice% ADD taille_totale%,48 ! matrice_cam% ADD taille_totale%,64 ! hwind% ADD taille_totale%,72 ! ligne_comment1% ADD taille_totale%,72 ! ligne_comment2% ADD taille_totale%,72 ! ligne_comment3% ADD taille_totale%,72 ! ligne_comment4% ADD taille_totale%,72 ! ligne_comment5% ADD taille_totale%,80 ! came_pyra% (62+16) C“ne camera ADD taille_totale%,160 ! dessin_carreaux% (64+96) Points de contr“le des carreaux ADD taille_totale%,172 ! boite_active% ADD taille_totale%,224 ! spot_cone% (158+64) C“ne des projecteurs ADD taille_totale%,240 ! ress% ADD taille_totale%,240 ! mem_vid% ADD taille_totale%,256 ! nom_en_cours% ADD taille_totale%,256 ! nom_divers% ADD taille_totale%,256 ! nom_mouvement% ADD taille_totale%,272 ! commande% ADD taille_totale%,360 ! nom_calque% ADD taille_totale%,548 ! objet_proj% ADD taille_totale%,628 ! objet_came% ADD taille_totale%,896 ! form_mouse% ADD taille_totale%,1024 ! coord_polygon% ADD taille_totale%,1024 ! emu_xten% ADD taille_totale%,1144 ! temporaire% ADD taille_totale%,1536 ! palette% ADD taille_totale%,2048 ! mem_redraw% ADD taille_totale%,3072 ! memoire_scenes% ADD taille_totale%,14400 ! preview_24bits% ADD taille_totale%,14400 ! preview_compre% IF NOT true_color! ADD taille_totale%,8192 ! trame% ENDIF IF bubble_gem! ADD taille_totale%,30*4 ! adr_bub% ENDIF ' ADD taille_totale%,taille_color_map& ! Zone COLOR/PIGMENT/NORMAL/TEXTURE map ADD taille_totale%,taille_slop_map& ! Zone SLOP map ADD taille_totale%,taille_projection& ! Zone PROJECTION ' ---------------------------------------------------------------------------- ADD taille_totale%,taille_source& ! Pour les modification de lumiŠre ' ---------------------------------------------------------------------------- ADD taille_totale%,taille_univers% ! Les objets ADD taille_totale%,taille_texture% ! Les textures ADD taille_totale%,taille_pigment% ! Les pigments ADD taille_totale%,taille_normal% ! Les normals ADD taille_totale%,taille_finish% ! Les finishs ADD taille_totale%,taille_interior% ! Les interiors ADD taille_totale%,taille_camera& ! La cam‚ra ADD taille_totale%,taille_atmosphere& ! Brouillard, Fond, Ciel et Arc en Ciel ADD taille_totale%,taille_texture& ! Texture par d‚faut ADD taille_totale%,taille_pigment& ! Pigment par d‚faut ADD taille_totale%,taille_normal& ! Normal par d‚faut ADD taille_totale%,taille_finish& ! Finish par d‚faut ADD taille_totale%,taille_interior& ! Interior par d‚faut ADD taille_totale%,taille_texture& ! Annulation Texture ADD taille_totale%,taille_pigment& ! Annulation Pigment ADD taille_totale%,taille_normal& ! Annulation Normal ADD taille_totale%,taille_finish& ! Annulation Finish ADD taille_totale%,taille_interior& ! Annulation Interior ADD taille_totale%,ADD(ecran%,256) ! Pour l'‚cran virtuel ADD taille_totale%,quartecran% ! Zone virtuel de redessin 3D 4 vues ADD taille_totale%,limite_des_objets& ! Fermeture/Ouverture dans hi‚rarchie ADD taille_totale%,SHL(limite_des_objets&,1) ! effacement% ADD taille_totale%,SHL(limite_des_objets&,2) ! objet% ADD taille_totale%,SHL(limite_des_objets&,2) ! edge% ADD taille_totale%,SHL(limite_des_objets&,2) ! pt_control% ADD taille_totale%,SHL(limite_des_objets&,2) ! pere_control% ADD taille_totale%,SHL(limite_des_objets&,2) ! courbe_extrude% ADD taille_totale%,SHL(limite_des_objets&,2) ! liste_csg% ADD taille_totale%,MUL(limite_des_objets&,20) ! param_trac% ADD taille_totale%,MUL(limite_des_objets&,50) ! Liaison% ADD taille_totale%,ADD(SHL(limite_des_objets&,2),2) ! Objets sous la souris ADD taille_totale%,taille_preview_ecran% ! Preview texture ' --------------------------- Les primitives de base ------------------------- ADD taille_totale%,40 ! Segment ( 26 + 14) ADD taille_totale%,172 ! Boite ( 98 + 74) ADD taille_totale%,124 ! Prisme ( 74 + 50) ADD taille_totale%,52 ! Triangle ( 38 + 14) ADD taille_totale%,556 ! Boite Arr( 290 + 266) ADD taille_totale%,100 ! Pyramide ( 62 + 38) ADD taille_totale%,628 ! Colonne ( 386 + 242) ADD taille_totale%,1744 ! Plan ( 974 + 770) ADD taille_totale%,2428 ! SphŠre (1226 + 1202) - Simple ( 326 + 290) soit 616 ADD taille_totale%,604 ! Tronc de ( 314 + 290) - Simple ( 218 + 194) soit 412 ADD taille_totale%,1450 ! H‚misphŠ ( 734 + 716) - Simple ( 218 + 194) soit 412 ADD taille_totale%,436 ! Disque ( 290 + 146) - Simple ( 194 + 98) soit 292 ADD taille_totale%,3724 ! Tore (1874 + 1850) - Simple ( 866 + 842) soit 1708 IF ldg_gl%>0 ! Cookie LDG trouv‚ on cherche TINY_GL ADD taille_totale%,160 ! light_position% de 0 … 9 ADD taille_totale%,16 ! light_ambient% ADD taille_totale%,16 ! light_diffuse% ADD taille_totale%,16 ! light_specular% ADD taille_totale%,40 ! Les flotant de MESA en paramŠtre ADD taille_totale%,64 ! Zone de retour screen_detect ADD taille_totale%,16 ! Pour screen_init ADD taille_totale%,36 ! Pour screen_init ADD taille_totale%,16 ! Ambient d'un objet ADD taille_totale%,16 ! Diffuse d'un objet ADD taille_totale%,16 ! Specular d'un objet ENDIF ADD taille_totale%,taille_fond% ! Pour le joli fond ' ADD taille_totale%,128 ! tracer_bios_tab% ADD taille_totale%,26 ! tracer_tri_tab% ADD taille_totale%,28 ! tracer_do_timing% ADD taille_totale%,28 ! tracer_param_tab% ADD taille_totale%,28 ! tracer_param_axe% ADD taille_totale%,32 ! tracer_trame_tab% ADD taille_totale%,32 ! tracer_trame_axe% ADD taille_totale%,32 ! tracer_trame_jauge% ADD taille_totale%,44 ! tracer_proj2d% ADD taille_totale%,48 ! tracer_proj3d% ADD taille_totale%,48 ! tracer_rotattrans% ADD taille_totale%,48 ! tracer_transrotat% ADD taille_totale%,56 ! tracer_normal_tab% ADD taille_totale%,56 ! tracer_normalise_tab% ADD taille_totale%,56 ! tracer_centre_tab% ADD taille_totale%,56 ! tracer_lestrois_tab% ADD taille_totale%,60 ! tracer_trace_tab% ' ---------------------------------------------------------------------------- ' IF taille_totale%0 ! Cookie LDG trouv‚ on initialise TINY_GL light_position%=@zone(160,adresse%) ! light_position% de 0 … 9 light_ambient%=@zone(16,adresse%) ! light_ambient% light_diffuse%=@zone(16,adresse%) ! light_diffuse% light_specular%=@zone(16,adresse%) ! light_specular% mesa_v0%=@zone(4,adresse%) ! Les flotant de MESA en paramŠtre mesa_v1%=@zone(4,adresse%) ! mesa_v2%=@zone(4,adresse%) ! mesa_v3%=@zone(4,adresse%) ! mesa_v4%=@zone(4,adresse%) ! mesa_v5%=@zone(4,adresse%) ! mesa_v6%=@zone(4,adresse%) ! mesa_v7%=@zone(4,adresse%) ! mesa_v8%=@zone(4,adresse%) ! mesa_v9%=@zone(4,adresse%) ! format_screen%=@zone(64,adresse%) ! Zone de retour screen_detect sortie_video%=@zone(16,adresse%) ! Pour screen_init videoinf%=@zone(36,adresse%) ! Pour screen_init ambient%=@zone(16,adresse%) ! Ambient d'un objet diffuse%=@zone(16,adresse%) ! Diffuse d'un objet specular%=@zone(16,adresse%) ! Specular d'un objet ENDIF fond%=@zone(taille_fond%,adresse%) ! Pour le joli fond textur‚ tracer_bios_tab%=@zone(128,adresse%) ! Simule XtendTOS en GFA tracer_tri_tab%=@zone(26,adresse%) ! // tracer_do_timing%=@zone(28,adresse%) ! // tracer_param_tab%=@zone(28,adresse%) ! // tracer_param_axe%=@zone(28,adresse%) ! // tracer_trame_tab%=@zone(32,adresse%) ! // tracer_trame_axe%=@zone(32,adresse%) ! // tracer_trame_jauge%=@zone(32,adresse%) ! // tracer_proj2d%=@zone(44,adresse%) ! // tracer_proj3d%=@zone(48,adresse%) ! // tracer_rotattrans%=@zone(48,adresse%) ! // tracer_transrotat%=@zone(48,adresse%) ! // tracer_normal_tab%=@zone(56,adresse%) ! // tracer_normalise_tab%=@zone(56,adresse%) ! // tracer_centre_tab%=@zone(56,adresse%) ! // tracer_lestrois_tab%=@zone(56,adresse%) ! // tracer_trace_tab%=@zone(60,adresse%) ! // ' --------------------------------------------------------------------! zone_transfert%=@prendre(ADD(1024,16),FALSE,3) ! pour les calculs 3D transfert%=zone_transfert% ELSE CHAR{path%}="[3][|Manque de m‚moire !|Out of memory !|][ Ok ]"+CHR$(0) ~@afficher_alerte(path%) close_virtual_screen_workstation(vdihandle%) ! On ferme la sation de travail liberation_memoire ! On rend la m‚moire au GEM appl_exit ! et on le dit au GEM END ! L…, c'est la fin...snif...snif ENDIF RETURN > PROCEDURE liberation_memoire ! Bon, rendont la au GEM, il la veut LOCAL cl&,i%,i&,l%,xw&,yw&,ww&,hw&,dum&,top& LOCAL r&,v&,b& ' ---------------------------------------------------------------------------- ' Avant de quitter l'application : ' ---------------------------------------------------------------------------- IF init_correct! chemin_systeme ' -------------------------------------------------------------------------- sauver_dernier_session ' -------------------------------------------------------------------------- sauver_l_envirronnement ' -------------------------------------------------------------------------- sauver_les_6_scenes ' -------------------------------------------------------------------------- sauver_configuration ' -------------------------------------------------------------------------- IF hwind% i&=31 DO ! Pour chaque fenˆtre IF INT{ADD(hwind%,SHL(i&,1))}>-1 ! Si la fenˆtre est ouverte wind_close(INT{ADD(hwind%,SHL(i&,1))}) ! La fermer wind_delete(INT{ADD(hwind%,SHL(i&,1))}) ! La d‚truire INT{ADD(hwind%,SHL(i&,1))}=-1 ENDIF DEC i& LOOP WHILE i&>-1 ENDIF ' -------------------------------------------------------------------------- ' On efface tout les fichiers UNDO s'il y en a ! definition_fichier(adr_parametres%,cheund&,nom_divers%,FALSE,FALSE,-1) IF undo_sauver&>0 FOR i&=1 TO undo_sauver& CHAR{nom_divers%}="UND"+RIGHT$("00000"+STR$(i&),5)+".ebs"+CHR$(0) minuscule(nom_divers%) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) IF @s_exist(mem_che%) efface_fichier ENDIF NEXT i& ENDIF elimination_des_temporaires effacer_fichiers_csg(TRUE) ENDIF ' IF open_gl! ' IF plan_systeme&=8 restore_palette(vdihandle%) ENDIF ' IF buffer_tga_phong% libere(*buffer_tga_phong%) ENDIF ' $C+ ~C:ldg_libterm%(L:scrldg%,L:mon_aespb%) $C- ' $C+ ~C:ldg_libterm%(L:exldg%,L:mon_aespb%) $C- ENDIF ' reinstalle_palette_systeme ' ---------------------------------------------------------------------------- graf_mouse(fleche&,0) ' libere(*image_buf_af%) libere(*image_buf_zx%) libere(*image_buf_yz%) libere(*image_buf_yx%) libere(*deplacement_multiple%) libere(*include_density_map%) ! 17 libere(*include_density%) ! 16 libere(*include_scattering%) ! 15 libere(*include_media%) ! 14 libere(*include_slop_map%) ! 13 libere(*include_atmosphere%) ! 12 libere(*include_projection%) ! 11 libere(*include_warp%) ! 10 libere(*include_normal_map%) ! 9 libere(*include_pigment_map%) ! 8 libere(*include_texture_map%) ! 7 libere(*include_color_map%) ! 6 libere(*include_interior%) ! 5 libere(*include_finish%) ! 4 libere(*include_normal%) ! 3 libere(*include_pigment%) ! 2 libere(*include_couleur%) ! 1 libere(*include_texture%) ! 0 libere(*les_outils%) libere(*les_imports%) libere(*les_modules%) libere(*zone_gouraud_phong%) libere(*les_alertes%) ' Effacer les vecteurs normaux i&=PRED(nombre_d_objets&) DO libere(ADD(edge%,SHL(i&,2))) DEC i& LOOP WHILE i&>-1 ' les points de contr“le des carreaux de B‚zier IF nombre_de_carreaux%>0 n%=PRED(nombre_de_carreaux%) DO libere(ADD(pt_control%,SHL(n%,2))) DEC n% LOOP WHILE n%>-1 ENDIF ' les courbe des objets LATHE/S.O.R./PRISM IF nombre_extrude%>0 n%=PRED(nombre_extrude%) DO libere(ADD(courbe_extrude%,SHL(n%,2))) DEC n% LOOP WHILE n%>-1 ENDIF ' les d‚finitions de C.S.G. IF nombre_de_csg%>0 n%=PRED(nombre_de_csg%) DO libere(ADD(liste_csg%,SHL(n%,2))) DEC n% LOOP WHILE n%>-1 ENDIF ' et les d‚finitions de primitives secondaires i&=PRED(primitive&) DO libere(ADD(objet%,SHL(i&,2))) DEC i& LOOP WHILE i&>12 ' libere(*redessin%) IF adr_menu% menu_bar(adr_menu%,0) ! Virer la barre de menu ENDIF wind_set(0,wf_newdesk&,0,0,0,0) ! Rendre le bureau IF @xrsrc_free<>0 libere(ADD(f_init%,4)) xrsrc_exit ENDIF ' IF INT{{ADD(GB,4)}}>=&H320 ! AES>3.20 ' INT{ADD(GCONTRL,2)}=0 ' INT{ADD(GCONTRL,4)}=0 ' INT{ADD(GCONTRL,6)}=0 ' INT{ADD(GCONTRL,8)}=0 ' GEMSYS 109 ! wind_new() ' ENDIF libere(*adresse_son_youpi%) libere(*adresse_son_glop%) libere(*param_3d%) libere(*zone_dessin_3d%) libere(*zone_transfert%) libere(*source%) libere(*zone%) libere(*deg_bleu%) libere(*deg_vert%) libere(*deg_roug%) libere(*degigris%) libere(*deg_gris%) libere(*roue%) libere(*auteur%) libere(*presente%) libere(*adr_chemin_systeme%) libere(*precalcul%) libere(*etendue%) libere(*station%) RETURN > PROCEDURE elimination_des_temporaires ! Si des temporaires, les effacer ' ............................................................................ ' .... V‚rifier si des fichiers mouvement existent encore. Si c'est le .... ' .... cas alors, les effacer. .... ' ............................................................................ ' CHAR{mem_che%}=CHAR{eb_temp%}+"\eb_model.shm"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\virus.vir"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\points.mvt"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\faces.mvt"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\mvt.mvt"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\bffor.mvt"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\bpfor.mvt"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\blign.mvt"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\limite.mvt"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\formef.mvt"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\a_faire.mvt"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\formep.mvt"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\nom_mont.mvt"+CHR$(0) efface_fichier ' CHAR{mem_che%}=CHAR{eb_temp%}+"\montagne.mvt"+CHR$(0) efface_fichier ' ............................................................................ RETURN > PROCEDURE efface_fichier IF @s_exist(mem_che%) ~GEMDOS(&H41,L:mem_che%) ENDIF RETURN > PROCEDURE changement_de_taille_transfert_et_ttf LOCAL nbp%,nbf%,nbft%,univ%,tpe&,adr_face%,adr_obje%,ouvert!,adresse% LOCAL taille%,taille0%,taille1%,taille2%,taille3%,relat&,nuu& LOCAL fin_b% IF ((NOT redimention!) OR face_maximum%=0) AND nombre_d_objets&>0 libere(*zone_transfert%) CLR nbft%,nuu& fin_b%=@adresse_objet(nombre_d_objets&) univ%=univers% DO IF modif_csg! ' Ajoute le nombre de faces de l'objet au total des faces type_d_objet_en_calcul(nuu&,univ%,nbp%,nbf%,adr_obje%,adr_face%) ADD nbft%,SUCC(nbf%) ELSE ' Si le calque contenant l'objet est visible IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(univ%),36)),35)}=1 ' Si l'objet n'est pas masqu‚ IF NOT BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_masque|) ' L'objet n'est pas en C.S.G. IF INT{ADD(univ%,offset_relation_csg&)}=-1 ' Ajoute le nombre de faces de l'objet au total des faces type_d_objet_en_calcul(nuu&,univ%,nbp%,nbf%,adr_obje%,adr_face%) ADD nbft%,SUCC(nbf%) ENDIF ENDIF ENDIF ENDIF ADD univ%,taille_objet& INC nuu& LOOP WHILE univ% PROCEDURE replacement_de_la_zone_memoire_des_fonctions(nume&) LOCAL position_dans_csg&,depart& LOCAL taille%,taille_a_deplacer% LOCAL adr_dep%,adr_arr% taille%=SHL(compteur_csg&,1) position_dans_csg&=@dans_csg(nume&) depart&=SUCC(position_dans_csg&) taille_a_deplacer%=SUB(taille%,SHL(depart&,1)) adr_dep%=ADD(effacement%,SHL(depart&,1)) adr_arr%=ADD(effacement%,SHL(position_dans_csg&,1)) bmove(adr_dep%,adr_arr%,taille_a_deplacer%) RETURN ' ****************************************************************************** ' **** Recherche et/ou creation du repertoire EB_TEMP et ses images **** ' ****************************************************************************** > PROCEDURE chemin_eb_temp LOCAL offs%,lect%,cpt% ' CHAR{eb_temp%}="VIDE" ' On place le A commme reference lect%=65 FOR cpt%=2 TO 25 ' IF BTST(BIOS(&HA),cpt%) CHAR{eb_temp%}=CHR$(ADD(lect%,cpt%))+":\eb_temp\defaut.def"+CHR$(0) IF cpt%=20 CHAR{eb_temp%}="VIDE" ' Ne rien faire ELSE IF @s_exist(eb_temp%) CHAR{eb_temp%}=CHR$(ADD(lect%,cpt%))+":\eb_temp"+CHR$(0) cpt%=25 ENDIF ENDIF ENDIF ' NEXT cpt% ' RETURN > FUNCTION demande_chemin_eb_temp LOCAL n% ' CHAR{msq%}="*"+CHR$(0) CHAR{masque%}="*"+CHR$(0) CHAR{eb_temp%}="*"+CHR$(0) CHAR{disque%}=CHAR{disque_systeme%} CHAR{path%}=CHAR{path_systeme%} CHAR{tr_tmp%}="Chemin de EB_TEMP - EB_TEMP path ?"+CHR$(0) ' DO definition_fichier(-1,-1,eb_temp%,TRUE,TRUE,tr_tmp%) ' IF UPPER$(CHAR{disque%})="U:" ' n%=@prendre(512,FALSE,3) ! il faut pr‚venir que U ' CHAR{n%}="[1][" ! est interdit ' CHAR{n%}=CHAR{n%}+" Disque U interdit. |" ' CHAR{n%}=CHAR{n%}+" changez d'emplacement. |" ' CHAR{n%}=CHAR{n%}+" Disk U not possible |" ' CHAR{n%}=CHAR{n%}+" Change placement. |" ' CHAR{n%}=CHAR{n%}+"][ D‚sol‚ | Sorry ]"+CHR$(0) ' ~@afficher_alerte(n%) ' libere(*n%) CHAR{path%}="[1][" ! est interdit CHAR{path%}=CHAR{path%}+" Disque U interdit. |" CHAR{path%}=CHAR{path%}+" changez d'emplacement. |" CHAR{path%}=CHAR{path%}+" Disk U not possible |" CHAR{path%}=CHAR{path%}+" Change placement. |" CHAR{path%}=CHAR{path%}+"][ D‚sol‚ | Sorry ]"+CHR$(0) ~@afficher_alerte(path%) CHAR{path%}=CHAR{path_systeme%} ELSE IF CHAR{disque%}<>"" CHAR{eb_temp%}=CHAR{disque%}+"\eb_temp"+CHR$(0) RETURN TRUE ENDIF CHAR{eb_temp%}="VIDE"+CHR$(0) ENDIF LOOP RETURN FALSE ' ENDFUNC > PROCEDURE creation_repertoire_eb_temp ~GEMDOS(&H39,L:eb_temp%) creation_du_fichier_defaut ' CHAR{tr_tmp%}=CHAR{eb_temp%}+"\textures"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) CHAR{tr_tmp%}=CHAR{eb_temp%}+"\textures\previews"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) CHAR{tr_tmp%}=CHAR{eb_temp%}+"\screens"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) CHAR{tr_tmp%}=CHAR{eb_temp%}+"\screens\1_plan"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) CHAR{tr_tmp%}=CHAR{eb_temp%}+"\screens\2_plans"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) CHAR{tr_tmp%}=CHAR{eb_temp%}+"\screens\4_plans"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) CHAR{tr_tmp%}=CHAR{eb_temp%}+"\screens\4_plansc"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) CHAR{tr_tmp%}=CHAR{eb_temp%}+"\screens\8_plans"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) CHAR{tr_tmp%}=CHAR{eb_temp%}+"\screens\8_plansc"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) CHAR{tr_tmp%}=CHAR{eb_temp%}+"\screens\15_plans"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) CHAR{tr_tmp%}=CHAR{eb_temp%}+"\screens\16_plans"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) CHAR{tr_tmp%}=CHAR{eb_temp%}+"\screens\24_plans"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) CHAR{tr_tmp%}=CHAR{eb_temp%}+"\screens\32_plans"+CHR$(0) ~GEMDOS(&H39,L:tr_tmp%) ' RETURN ' **************************** Gestion de la m‚moire *************************** > FUNCTION prendre(tl%,id!,mod|) ! Prendre un peu de m‚moire LOCAL l%,temp& ' Adapter la taille au multiple de 16 imm‚diatement sup‚rieur tl%=SHL(SHR(ADD(tl%,16),4),4) ' IF GEMDOS(&H44,L:-1,W:0)<>-32 ! La fonction est elle accept‚e IF multitache! mod|=mod| OR &X11000 ! Force l'utilisation des informations de ENDIF ! l'entˆte l%=GEMDOS(&H44,L:tl%,W:mod|) ! L…, on est sur TT, FALCON ou plus... ELSE l%=GEMDOS(&H48,L:tl%) ! Bon, allez, les vieux appels compatibles ENDIF $S%,S> SELECT l% CASE 0 PRINT tl% ERROR 8 DEFAULT IF id! membfill(l%,tl%,0) ENDIF RETURN l% ENDSELECT ENDFUNC > FUNCTION memoire_dispo(mod|) ! Reste-t-il de la m‚moire IF GEMDOS(&H44,L:-1,W:0)<>-32 ! La fonction est elle accept‚e RETURN GEMDOS(&H44,L:-1,W:mod|) ! Sur TT/FALCON, nouvel appel ELSE RETURN GEMDOS(&H48,L:-1) ! Sinon, vieux appels compatibles ENDIF ENDFUNC > PROCEDURE libere(ad%) ! On rend la m‚moire … la machine IF ad%>0 $S%,S> SELECT {ad%} CASE 0 ' Ne rien faire DEFAULT ~GEMDOS(&H49,L:{ad%}) {ad%}=0 ENDSELECT ENDIF garbage_collector RETURN > PROCEDURE membfill(vide_adr%,size%,msq%) ! Remplissage et vidage de bloc LOCAL dep_vi%,fin_vi%,nombre% LOCAL adr%,fin_adr% LOCAL nombre% adr%=precalcul% fin_adr%=ADD(adr%,256) DO {adr%}=msq% ADD adr%,4 LOOP WHILE adr% PROCEDURE garbage_collector ! Un peu de m‚nage dans la m‚moire ~FRE(0) ~FRE() IF hwind%>0 AND adr_info%>0 CHAR{{OB_SPEC(adr_info%,infomem&)}}=STR$(@memoire_dispo(0),9) IF GEMDOS(&H44,L:-1,W:0)<>-32 ! La fonction est elle accept‚e CHAR{{OB_SPEC(adr_info%,infomemt&)}}=STR$(@memoire_dispo(1),9) ELSE CHAR{{OB_SPEC(adr_info%,infomemt&)}}="ABSENTE " ENDIF IF INT{hwind%}>-1 redraw_element_fenetre(0,adr_info%,infomem&) redraw_element_fenetre(0,adr_info%,infomemt&) ENDIF ENDIF RETURN > FUNCTION zone(tal%,VAR adresse%) ! D‚calage d'adresse en m‚moire ADD adresse%,tal% RETURN SUB(adresse%,tal%) ENDFUNC > PROCEDURE bmove(bsrc%,bdes%,siz%) ! Copie de bloc rapide BMOVE bsrc%,bdes%,siz% RETURN ' ************************* Nouvelles routines de Xrsrc: ********************** > FUNCTION chargement_des_routines_xrsrc LOCAL n%,l%,f_base%,dummy% CHAR{path%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\asm\eb_model.ovl"+CHR$(0) IF @s_exist(path%) l%=@prendre(25,FALSE,3) f_base%=GEMDOS(&H4B,shw_load&,L:path%,L:l%,L:l%) IF f_base%>=0 f_init%={ADD(f_base%,8)} {ADD(f_init%,4)}=@prendre(100,FALSE,3) $C+ dummy%=C:f_init%(L:f_base%) $C- IF dummy%=0 f_scalc%={ADD(f_init%,42)} r_resident!=TRUE ENDIF ENDIF libere(*l%) ELSE RETURN FALSE ENDIF RETURN TRUE ENDFUNC ' > PROCEDURE xrsrc_exit IF r_resident! WORD{ADD(ADD(f_init%,4),36)}=129 ! Num‚ro de la fonction $C+ r%=C:f_scalc%() $C- ENDIF RETURN > FUNCTION xrsrc_free LOCAL r% IF r_resident! WORD{ADD(ADD(f_init%,4),36)}=2 ! Num‚ro de la fonction $C+ r%=C:f_scalc%() $C- RETURN r% ELSE ~@rsrc_free RETURN 0 ENDIF ENDFUNC > FUNCTION xrsrc_gaddr(re_gtype&,re_gindex&,VAR re_gaddr%) LOCAL r% IF r_resident! WORD{ADD(ADD(f_init%,4),36)}=3 ! Num‚ro de la fonction WORD{ADD(ADD(f_init%,4),0)}=re_gtype& WORD{ADD(ADD(f_init%,4),2)}=re_gindex& {ADD(ADD(f_init%,4),16)}=V:re_gaddr% $C+ r%=C:f_scalc%() $C- ELSE r%=@rsrc_gaddr(re_gtype&,re_gindex&,re_gaddr%) ENDIF RETURN r% ENDFUNC > PROCEDURE xrsrc_init IF r_resident! WORD{ADD(ADD(f_init%,4),36)}=128 ! Num‚ro de la fonction $C+ r%=C:f_scalc%() $C- ENDIF RETURN > FUNCTION xrsrc_load(n%) LOCAL r% IF r_resident! WORD{ADD(ADD(f_init%,4),36)}=1 ! Num‚ro de la fonction {ADD(ADD(f_init%,4),16)}=n% $C+ r%=C:f_scalc%() $C- ELSE r%=@rsrc_load(n%) ENDIF RETURN r% ENDFUNC > FUNCTION xrsrc_obfix(re_gaddr%,re_obj&) LOCAL r% IF r_resident! WORD{ADD(ADD(f_init%,4),36)}=5 ! Num‚ro de la fonction WORD{ADD(ADD(f_init%,4),0)}=re_obj& {ADD(ADD(f_init%,4),16)}=re_gaddr% $C+ r%=C:f_scalc%() $C- ELSE r%=@rsrc_obfix(re_obj&,re_gaddr%) ENDIF RETURN r% ENDFUNC > FUNCTION xrsrc_saddr(re_gtype&,re_gindex&,VAR re_gaddr%) LOCAL r% IF r_resident! WORD{ADD(ADD(f_init%,4),36)}=4 ! Num‚ro de la fonction WORD{ADD(ADD(f_init%,4),0)}=re_gtype& WORD{ADD(ADD(f_init%,4),2)}=re_gindex& {ADD(ADD(f_init%,4),16)}=V:re_gaddr% $C+ r%=C:f_scalc%() $C- ELSE r%=@rsrc_saddr(re_gtype&,re_gindex&,re_gaddr%) ENDIF RETURN r% ENDFUNC ' ********************** Gestion de la fenˆtre de vue ************************** > PROCEDURE fulled ! Appui sur le bouton plein ‚cran LOCAL temp& temp&=INT{ADD(buf%,6)} IF ful! ! Si elle est d‚j… plein pot wind_set(temp&,wf_currxywh&,fulx&,fuly&,fulw&,fulh&) ful!=FALSE ! Annuler flag mise_a_la_taille_fenetre_de_vue ELSE ! Sinon ~@wind_get(temp&,wf_currxywh&,fulx&,fuly&,fulw&,fulh&) wind_set(temp&,wf_currxywh&,global_xb&,global_yb&,global_wb&,global_hb&) ! Coord. maxi ful!=TRUE ! Positionner flag mise_a_la_taille_fenetre_de_vue ENDIF tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE tri_2d!=FALSE redessin_deja_fait!=FALSE RETURN > PROCEDURE sliders ! Gestion des sliders LOCAL lar&,hau&,pas LOCAL slidesizeh&,slidesizev& LOCAL deplacementx&,deplacementy& LOCAL slide&,xw&,yw&,ww&,hw& type_de_deplacement(deplacementx&,deplacementy&) ' ======================================== Coordonn‚es zone de travail la_fenetre(fenvue07&,xw&,yw&,ww&,hw&) lar&=ww&*z_correctionx%/zoom% ! Largeur & hauteur visualisable hau&=hw&*z_correctiony%/zoom% ! en fonction du zoom ' ======================================== Fixer la Taille slider vertical OB_H(adr_fenetre%,fenvue10&)=20 OB_H(adr_fenetre%,fenvue11&)=19 OB_H(adr_fenetre%,fenvue12&)=20 ' ======================================== Fixer la Taille slider horizontal OB_W(adr_fenetre%,fenvue15&)=20 OB_W(adr_fenetre%,fenvue16&)=19 OB_W(adr_fenetre%,fenvue17&)=20 ' ======================================== Fixer la position slider vertical pas=((OB_H(adr_fenetre%,fenvue08&)-2)-OB_H(adr_fenetre%,fenvue10&))/1000 OB_Y(adr_fenetre%,fenvue10&)=ROUND(500*pas) ' ======================================== Fixer la position slider horizontal pas=((OB_W(adr_fenetre%,fenvue13&)-2)-OB_W(adr_fenetre%,fenvue15&))/1000 OB_X(adr_fenetre%,fenvue15&)=ROUND(500*pas) redraw_elem(adr_fenetre%,fenvue08&) redraw_elem(adr_fenetre%,fenvue13&) RETURN > PROCEDURE deplacement_au_clavier(ty|,ii!) ! Qui c'est qu'y a boug‚ ici ? IF ty|=0 $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dessus|,vue_de_dessous| ' X+ … droite IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! SUB deplacement_en_x&,100*zoom%/z_correctionx% ELSE SUB deplacement_en_x&,10*zoom%/z_correctionx% ENDIF CASE vue_de_dos| ' X+ … gauche IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! ADD deplacement_en_x&,100*zoom%/z_correctionx% ELSE ADD deplacement_en_x&,10*zoom%/z_correctionx% ENDIF CASE vue_de_droite| ' Z+ … droite IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! SUB deplacement_en_z&,100*zoom%/z_correctionx% ELSE SUB deplacement_en_z&,10*zoom%/z_correctionx% ENDIF CASE vue_de_gauche| ' Z+ … gauche IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! ADD deplacement_en_z&,100*zoom%/z_correctionx% ELSE ADD deplacement_en_z&,10*zoom%/z_correctionx% ENDIF ENDSELECT ELSE IF ty|=1 $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dessus|,vue_de_dessous| ' X+ … droite IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! ADD deplacement_en_x&,100*zoom%/z_correctionx% ELSE ADD deplacement_en_x&,10*zoom%/z_correctionx% ENDIF CASE vue_de_dos| ' X+ … gauche IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! SUB deplacement_en_x&,100*zoom%/z_correctionx% ELSE SUB deplacement_en_x&,10*zoom%/z_correctionx% ENDIF CASE vue_de_droite| ' Z+ … droite IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! ADD deplacement_en_z&,100*zoom%/z_correctionx% ELSE ADD deplacement_en_z&,10*zoom%/z_correctionx% ENDIF CASE vue_de_gauche| ' Z+ … gauche IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! SUB deplacement_en_z&,100*zoom%/z_correctionx% ELSE SUB deplacement_en_z&,10*zoom%/z_correctionx% ENDIF ENDSELECT ELSE IF ty|=2 $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos|,vue_de_gauche|,vue_de_droite| ' Y+ en haut IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! ADD deplacement_en_y&,100*zoom%/z_correctiony% ELSE ADD deplacement_en_y&,10*zoom%/z_correctiony% ENDIF CASE vue_de_dessus| ' Z+ en haut IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! ADD deplacement_en_z&,100*zoom%/z_correctiony% ELSE ADD deplacement_en_z&,10*zoom%/z_correctiony% ENDIF CASE vue_de_dessous| ' Z+ en bas IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! SUB deplacement_en_z&,100*zoom%/z_correctiony% ELSE SUB deplacement_en_z&,10*zoom%/z_correctiony% ENDIF ENDSELECT ELSE IF ty|=3 $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos|,vue_de_gauche|,vue_de_droite| ' Y+ en haut IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! SUB deplacement_en_y&,100*zoom%/z_correctiony% ELSE SUB deplacement_en_y&,10*zoom%/z_correctiony% ENDIF CASE vue_de_dessus| ' Z+ en haut IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! SUB deplacement_en_z&,100*zoom%/z_correctiony% ELSE SUB deplacement_en_z&,10*zoom%/z_correctiony% ENDIF CASE vue_de_dessous| ' Z+ en bas IF (BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&)) AND NOT ii! ADD deplacement_en_z&,100*zoom%/z_correctiony% ELSE ADD deplacement_en_z&,10*zoom%/z_correctiony% ENDIF ENDSELECT ENDIF IF grille_vue! deplacement_en_x&=MUL(DIV(deplacement_en_x&,pas_grille&),pas_grille&) deplacement_en_y&=MUL(DIV(deplacement_en_y&,pas_grille&),pas_grille&) deplacement_en_z&=MUL(DIV(deplacement_en_z&,pas_grille&),pas_grille&) ENDIF IF NOT ii! tri_2d!=FALSE redraw_force(24,24) ENDIF redessin_deja_fait!=FALSE RETURN > PROCEDURE type_de_deplacement(VAR deplacementx&,deplacementy&) LOCAL lar&,hau&,moitiex&,moitiey& LOCAL xw&,yw&,ww&,hw& LOCAL poly%,adr% ' ======================================== Coordonn‚es zone de travail la_fenetre(fenvue07&,xw&,yw&,ww&,hw&) lar&=ww&*z_correctionx%/zoom% ! Largeur & hauteur visualisable hau&=hw&*z_correctiony%/zoom% ! en fonction du zoom moitiex&=SUB(16384,DIV(lar&,2)) moitiey&=SUB(16384,DIV(hau&,2)) $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| deplacementx&=ADD(deplacement_en_x&,moitiex&) deplacementy&=ADD(deplacement_en_y&,moitiey&) CASE vue_de_gauche|,vue_de_droite| deplacementx&=ADD(deplacement_en_z&,moitiex&) deplacementy&=ADD(deplacement_en_y&,moitiey&) CASE vue_de_dessus|,vue_de_dessous| deplacementx&=ADD(deplacement_en_x&,moitiex&) deplacementy&=ADD(deplacement_en_z&,moitiey&) ENDSELECT RETURN > PROCEDURE deplacement_effectif_x(deplacementx&) IF deplacementx&<>0 $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dessus|,vue_de_dessous| ' X+ … droite SUB deplacement_en_x&,deplacementx& CASE vue_de_dos| ' X+ … gauche ADD deplacement_en_x&,deplacementx& CASE vue_de_droite| ' Z+ … droite SUB deplacement_en_z&,deplacementx& CASE vue_de_gauche| ' Z+ … gauche ADD deplacement_en_z&,deplacementx& ENDSELECT ENDIF RETURN > PROCEDURE deplacement_effectif_y(deplacementy&) IF deplacementy&<>0 $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos|,vue_de_gauche|,vue_de_droite| ' Y+ en haut SUB deplacement_en_y&,deplacementy& CASE vue_de_dessus| ' Z+ en haut SUB deplacement_en_z&,deplacementy& CASE vue_de_dessous| ' Z+ en bas ADD deplacement_en_z&,deplacementy& ENDSELECT ENDIF RETURN > PROCEDURE definition_zoom_souris ! Allez on d‚finit le zoom … la souris LOCAL origx&,origy& LOCAL clic&,a_faire! LOCAL px0&,py0&,px1&,py1& LOCAL rapx,rapy,rapm LOCAL centx&,centy& LOCAL xm,ym,zm a_faire!=TRUE CLR px0&,py0&,px1&,py1&,clic& graf_mouse(reticule_mince&,0) ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) place_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& ' videsouris set_type_de_ligne(noir&,1,5,0,0,-1) set_remplissage(2,8,noir&,-1) set_fill_perimeter_visibility(0) CHAR{{OB_SPEC(adr_fenetre%,fenvue02&)}}=CHAR{OB_SPEC(adr_divers%,lin2&)} redraw_element_fenetre(48,adr_fenetre%,fenvue02&) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) IF global_mk&=1 IF global_mx&>global_xf& AND global_my&>global_yf& AND global_mx&global_amx& OR global_my&<>global_amy& $S&,$S> SELECT clic& CASE 0 afficher_coordonnees(FALSE) CASE 1 afficher_coordonnees(FALSE) set_writing_mode(mode_xor|) IF global_amx&<>-1 OR global_amy&<>-1 box(px0&,py0&,global_amx&,global_amy&) ENDIF box(px0&,py0&,global_mx&,global_my&) set_writing_mode(mode_remplace|) ENDSELECT global_amx&=global_mx& global_amy&=global_my& ENDIF EXIT IF clic&=2 OR global_mk&=2 LOOP IF global_mk&=2 OR click&=2 a_faire!=FALSE ENDIF IF clic&>0 ENDIF videsouris CHAR{{OB_SPEC(adr_fenetre%,fenvue02&)}}=CHAR{titre_en_cours%} redraw_element_fenetre(48,adr_fenetre%,fenvue02&) enleve_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) ' graf_mouse(fleche&,0) IF a_faire! ' ---------- Mise en place de la fenˆtre de zoom : petit point/grand point IF px0&>px1& SWAP px0&,px1& ENDIF IF py0&>py1& SWAP py0&,py1& ENDIF ' ---------- Calcul du centre de la fenˆtre de zoom en point ‚cran centx&=ADD(px0&,DIV(SUCC(SUB(px1&,px0&)),2)) centy&=ADD(py0&,DIV(SUCC(SUB(py1&,py0&)),2)) ' ---------- Calcul de la position du centre calcul‚ dans l'univers objet $S|,S> SELECT dessin_3d| CASE vue_de_face| ' X+ … droite Y+ en haut ADD origx&,deplacement_en_x& ADD origy&,deplacement_en_y& xm=SUB(centx&,origx&)*z_correctionx%/zoom% ym=-SUB(centy&,origy&)*z_correctiony%/zoom% CASE vue_de_dos| ' X+ … gauche Y+ en haut SUB origx&,deplacement_en_x& ADD origy&,deplacement_en_y& xm=-SUB(centx&,origx&)*z_correctionx%/zoom% ym=SUB(centy&,origy&)*z_correctiony%/zoom% CASE vue_de_gauche| ' Z+ … gauche Y+ en haut SUB origx&,deplacement_en_z& ADD origy&,deplacement_en_y& zm=-SUB(centx&,origx&)*z_correctionx%/zoom% ym=-SUB(centy&,origy&)*z_correctiony%/zoom% CASE vue_de_droite| ' Z+ … droite Y+ en haut ADD origx&,deplacement_en_z& ADD origy&,deplacement_en_y& zm=SUB(centx&,origx&)*z_correctionx%/zoom% ym=-SUB(centy&,origy&)*z_correctiony%/zoom% CASE vue_de_dessus| ' X+ … droite Z+ en haut ADD origx&,deplacement_en_x& ADD origy&,deplacement_en_z& xm=SUB(centx&,origx&)*z_correctionx%/zoom% zm=-SUB(centy&,origy&)*z_correctiony%/zoom% CASE vue_de_dessous| ' X+ … droite Z+ en bas ADD origx&,deplacement_en_x& SUB origy&,deplacement_en_z& xm=SUB(centx&,origx&)*z_correctionx%/zoom% zm=SUB(centy&,origy&)*z_correctiony%/zoom% ENDSELECT ' ---------- Calcul du rapport sur l'horizontal de l'‚cran rapx=SUCC(SUB(px1&,px0&))/(global_wf&*(zoom%/1024)) ' ---------- Calcul du rapport sur la verticale de l'‚cran rapy=SUCC(SUB(py1&,py0&))/(global_hf&*(zoom%/1024)) ' ---------- Prendre le plus grand rapport pour ˆtre sur de voir quelque chose rapm=MAX(rapx,rapy) ' ---------- R‚ajustement du zoom en fonction du rapport moyen zoom%=0 IF rapm<>0 zoom%=(1/rapm)*1024 ENDIF IF zoom%<10 zoom%=10 ENDIF $S|,$S> SELECT dessin_3d| CASE vue_de_face| deplacement_en_x&=-xm*zoom%/z_correctionx% deplacement_en_y&=ym*zoom%/z_correctiony% CASE vue_de_dos| deplacement_en_x&=-xm*zoom%/z_correctionx% deplacement_en_y&=-ym*zoom%/z_correctiony% CASE vue_de_gauche| deplacement_en_z&=-zm*zoom%/z_correctionx% deplacement_en_y&=ym*zoom%/z_correctiony% CASE vue_de_droite| deplacement_en_z&=-zm*zoom%/z_correctionx% deplacement_en_y&=ym*zoom%/z_correctiony% CASE vue_de_dessus|,vue_de_dessous| deplacement_en_x&=-xm*zoom%/z_correctionx% deplacement_en_z&=zm*zoom%/z_correctiony% ENDSELECT ecrire_zoom_dans_outils(FALSE) redessin_deja_fait!=FALSE tri_2d!=FALSE ENDIF redraw_force(idx_info&,idx_animation&) RETURN > PROCEDURE centrage_sur_objet_actif ! Allez, on centre sur un objet LOCAL panx,pany,panz LOCAL tanx,tany,tanz IF nombre_d_objets&>0 ' On calcul le d‚calage sur les 3 axes pour l'objet actif au centre univ%=@adresse_objet(objet_actif&) IF INT{univ%}=primitive_triangle& pour_triangle_active(univ%,panx,pany,panz,tanx,tany,tanz) $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| deplacement_en_x&=-panx*zoom%/z_correctionx% deplacement_en_y&=pany*zoom%/z_correctiony% CASE vue_de_gauche|,vue_de_droite| deplacement_en_z&=-panz*zoom%/z_correctionx% deplacement_en_y&=pany*zoom%/z_correctiony% CASE vue_de_dessus|,vue_de_dessous| deplacement_en_x&=-panx*zoom%/z_correctionx% deplacement_en_z&=panz*zoom%/z_correctiony% ENDSELECT ELSE $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| deplacement_en_x&=-SINGLE{ADD(univ%,2)}*zoom%/z_correctionx% deplacement_en_y&=SINGLE{ADD(univ%,6)}*zoom%/z_correctiony% CASE vue_de_droite|,vue_de_gauche| deplacement_en_z&=-SINGLE{ADD(univ%,10)}*zoom%/z_correctionx% deplacement_en_y&=SINGLE{ADD(univ%,6)}*zoom%/z_correctiony% CASE vue_de_dessus|,vue_de_dessous| deplacement_en_x&=-SINGLE{ADD(univ%,2)}*zoom%/z_correctionx% deplacement_en_z&=SINGLE{ADD(univ%,10)}*zoom%/z_correctiony% ENDSELECT ENDIF redessin_deja_fait!=FALSE tri_2d!=FALSE ENDIF RETURN > PROCEDURE calcul_zoom_total ! ou sur toute la scŠne d'un coup LOCAL lar,hau,pro,milx,mily,milz LOCAL minx,miny,minz LOCAL maxx,maxy,maxz LOCAL rapx,rapy,rapm LOCAL distancex,distancey calcul_taille_selection_multiple(TRUE,lar,hau,pro,milx,mily,milz,minx,miny,minz,maxx,maxy,maxz) $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| ' X+ … droite Y+ en haut ' X+ … gauche Y+ en haut distancex=maxx-minx distancey=maxy-miny deplacement_en_x&=-milx*zoom%/z_correctionx% deplacement_en_y&=mily*zoom%/z_correctiony% CASE vue_de_gauche|,vue_de_droite| ' Z+ … gauche Y+ en haut ' Z+ … droite Y+ en haut distancex=maxz-minz distancey=maxy-miny deplacement_en_z&=-milz*zoom%/z_correctionx% deplacement_en_y&=mily*zoom%/z_correctiony% CASE vue_de_dessus|,vue_de_dessous| ' X+ … droite Z+ en haut ' X+ … droite Z+ en bas distancex=maxx-minx distancey=maxz-minz deplacement_en_x&=-milx*zoom%/z_correctionx% deplacement_en_z&=milz*zoom%/z_correctiony% ENDSELECT ' ---------- Calcul du rapport sur l'horizontal de l'‚cran rapx=distancex/OB_W(adr_fenetre%,fen_act&) ' ---------- Calcul du rapport sur la verticale de l'‚cran rapy=distancey/OB_H(adr_fenetre%,fen_act&) ' ---------- Prendre le plus grand rapport pour ˆtre sur de voir quelque chose rapm=MAX(rapx,rapy) ' ---------- R‚ajustement du zoom en fonction du rapport moyen zoom%=0 IF rapm<>0 zoom%=(1/rapm)*1024 ENDIF IF zoom%<10 zoom%=10 ENDIF redessin_deja_fait!=FALSE tri_2d!=FALSE ecrire_zoom_dans_outils(TRUE) RETURN > PROCEDURE centrage_sur_univers ! Tien, l…, on redimensionne tout LOCAL univ%,fin_univ% LOCAL minx,miny,minz LOCAL maxx,maxy,maxz LOCAL lar,hau,pro,milx,mily,milz LOCAL adr_sr%,fin_s%,adr_face%,k%,fin_k% LOCAL univ%,k%,fin_k%,adr_st% LOCAL distance,rapp LOCAL distancex,distancey,distancez calcul_taille_selection_multiple(TRUE,lar,hau,pro,milx,mily,milz,minx,miny,minz,maxx,maxy,maxz) distancex=SUB(maxx,minx) distancey=SUB(maxy,miny) distancez=SUB(maxz,minz) distance=MAX(distancex,distancey,distancez) IF distance==0 distance=1 ENDIF rapp=MIN(OB_W(adr_fenetre%,fen_act&),OB_H(adr_fenetre%,fen_act&))/distance IF rapp==0 rapp=1 ENDIF ' univ%=univers% ' D‚placer tout les objets d'aprŠs le d‚calage calculer pr‚c‚dement DO IF INT{univ%}=primitive_triangle& ' Si c'est un triangle, on repositionne directement les points SINGLE{ADD(univ%,2)}=(SINGLE{ADD(univ%,2)}-milx)*rapp SINGLE{ADD(univ%,6)}=(SINGLE{ADD(univ%,6)}-mily)*rapp SINGLE{ADD(univ%,10)}=(SINGLE{ADD(univ%,10)}-milz)*rapp SINGLE{ADD(univ%,14)}=(SINGLE{ADD(univ%,14)}-milx)*rapp SINGLE{ADD(univ%,18)}=(SINGLE{ADD(univ%,18)}-mily)*rapp SINGLE{ADD(univ%,22)}=(SINGLE{ADD(univ%,22)}-milz)*rapp SINGLE{ADD(univ%,26)}=(SINGLE{ADD(univ%,26)}-milx)*rapp SINGLE{ADD(univ%,30)}=(SINGLE{ADD(univ%,30)}-mily)*rapp SINGLE{ADD(univ%,34)}=(SINGLE{ADD(univ%,34)}-milz)*rapp ELSE SINGLE{ADD(univ%,2)}=(SINGLE{ADD(univ%,2)}-milx)*rapp SINGLE{ADD(univ%,6)}=(SINGLE{ADD(univ%,6)}-mily)*rapp SINGLE{ADD(univ%,10)}=(SINGLE{ADD(univ%,10)}-milz)*rapp SINGLE{ADD(univ%,14)}=SINGLE{ADD(univ%,14)}*rapp SINGLE{ADD(univ%,18)}=SINGLE{ADD(univ%,18)}*rapp SINGLE{ADD(univ%,22)}=SINGLE{ADD(univ%,22)}*rapp ENDIF ' Scale, Rotate et Translate dans la partie TEXTURE adr_st%=ADD(univ%,offset_texture&) ' Translate SINGLE{ADD(adr_st%,2)}=SINGLE{ADD(adr_st%,2)}*rapp SINGLE{ADD(adr_st%,6)}=SINGLE{ADD(adr_st%,6)}*rapp SINGLE{ADD(adr_st%,10)}=SINGLE{ADD(adr_st%,10)}*rapp ' Scale SINGLE{ADD(adr_st%,14)}=SINGLE{ADD(adr_st%,14)}*rapp SINGLE{ADD(adr_st%,18)}=SINGLE{ADD(adr_st%,18)}*rapp SINGLE{ADD(adr_st%,22)}=SINGLE{ADD(adr_st%,22)}*rapp ' Rotate SINGLE{ADD(adr_st%,26)}=SINGLE{ADD(adr_st%,26)}*rapp SINGLE{ADD(adr_st%,30)}=SINGLE{ADD(adr_st%,30)}*rapp SINGLE{ADD(adr_st%,34)}=SINGLE{ADD(adr_st%,34)}*rapp ' Scale, Rotate et Translate dans la partie PIGMENT adr_st%=ADD(univ%,offset_pigment&) IF BTST(BYTE{ADD(adr_st%,5)},2) ' Scale SINGLE{ADD(adr_st%,34)}=SINGLE{ADD(adr_st%,34)}*rapp SINGLE{ADD(adr_st%,38)}=SINGLE{ADD(adr_st%,38)}*rapp SINGLE{ADD(adr_st%,42)}=SINGLE{ADD(adr_st%,42)}*rapp ENDIF IF BTST(BYTE{ADD(adr_st%,5)},1) ' Rotate SINGLE{ADD(adr_st%,10)}=SINGLE{ADD(adr_st%,10)}*rapp SINGLE{ADD(adr_st%,14)}=SINGLE{ADD(adr_st%,14)}*rapp SINGLE{ADD(adr_st%,18)}=SINGLE{ADD(adr_st%,18)}*rapp ENDIF IF BTST(BYTE{ADD(adr_st%,5)},0) ' Translate SINGLE{ADD(adr_st%,22)}=SINGLE{ADD(adr_st%,22)}*rapp SINGLE{ADD(adr_st%,26)}=SINGLE{ADD(adr_st%,26)}*rapp SINGLE{ADD(adr_st%,30)}=SINGLE{ADD(adr_st%,30)}*rapp ENDIF ' Scale, Rotate et Translate dans la partie NORMAL adr_st%=ADD(univ%,offset_normal&) IF BTST(BYTE{ADD(adr_st%,2)},2) ' Scale SINGLE{ADD(adr_st%,40)}=SINGLE{ADD(adr_st%,40)}*rapp SINGLE{ADD(adr_st%,44)}=SINGLE{ADD(adr_st%,44)}*rapp SINGLE{ADD(adr_st%,48)}=SINGLE{ADD(adr_st%,48)}*rapp ENDIF IF BTST(BYTE{ADD(adr_st%,3)},1) ' Rotate SINGLE{ADD(adr_st%,16)}=SINGLE{ADD(adr_st%,16)}*rapp SINGLE{ADD(adr_st%,20)}=SINGLE{ADD(adr_st%,20)}*rapp SINGLE{ADD(adr_st%,24)}=SINGLE{ADD(adr_st%,24)}*rapp ENDIF IF BTST(BYTE{ADD(adr_st%,3)},0) ' Translate SINGLE{ADD(adr_st%,28)}=SINGLE{ADD(adr_st%,28)}*rapp SINGLE{ADD(adr_st%,32)}=SINGLE{ADD(adr_st%,32)}*rapp SINGLE{ADD(adr_st%,36)}=SINGLE{ADD(adr_st%,36)}*rapp ENDIF ADD univ%,taille_objet& LOOP WHILE univ% PROCEDURE retire_centrage IF total_auto! total_auto!=FALSE ob_state(adr_outils%,iztotal&,aes_selected&,total_auto!) redraw_elem(adr_outils%,iztotal&) ENDIF IF centrage_auto! centrage_auto!=FALSE ob_state(adr_outils%,izcentre&,aes_selected&,centrage_auto!) redraw_elem(adr_outils%,izcentre&) ENDIF RETURN > PROCEDURE la_fenetre(fact&,VAR xfen&,yfen&,wfen&,hfen&) objc_offset(adr_fenetre%,fact&,xfen&,yfen&) wfen&=OB_W(adr_fenetre%,fact&) hfen&=OB_H(adr_fenetre%,fact&) RETURN ' ****************************************************************************** > PROCEDURE selection_multiple(lx&,ly&) LOCAL px&,py&,pw&,ph&,i&,sortie!,ex&,j&,pr_f& LOCAL top&,temp&,mvtx&,mvty&,choi&,numero& LOCAL src_depl%,des_depl%,tai_depl%,sortie_mul| LOCAL un%,fin_un%,objet_prem& lx&=SHL(SHR(lx&,4),4) ~@wind_get(0,wf_top&,top&,temp&,temp&,temp&) sortie!=FALSE px&=lx& py&=ly& pw&=OB_W(adr_selec_mult%,0) ph&=OB_H(adr_selec_mult%,0) OB_X(adr_selec_mult%,0)=lx& OB_Y(adr_selec_mult%,0)=ly& px&=SHL(SHR(px&,4),4) form_dial(0,px&,py&,pw&,ph&,px&,py&,pw&,ph&) videsouris IF objets_a_deplacer&=0 membfill(effacement%,SHL(limite_des_objets&,1),0) ENDIF valide_devalide_options_saisie_multiple(FALSE,objet_prem&) IF nombre_d_objets&<10 debut_popup_choix&=0 ELSE IF objet_prem&>SUB(nombre_d_objets&,10) debut_popup_choix&=SUB(nombre_d_objets&,10) ELSE debut_popup_choix&=objet_prem& ENDIF ENDIF calcul_selection_multiple!=FALSE ecrire_la_selection_multiple(FALSE) i&=OB_H(adr_selec_mult%,selcho01&) position_curseur_popup(adr_selec_mult%,selchope&,selchoca&,debut_popup_choix&,nombre_d_objets&,FALSE) ' pr_f&=@wind_create(0,px&,py&,pw&,ph&) IF pr_f&>-1 wind_open(pr_f&,px&,py&,pw&,ph&) ENDIF ' objc_draw(adr_selec_mult%,0,12,px&,py&,pw&,ph&,-1) DO ex&=@form_do(adr_selec_mult%,-1) SELECT ex& CASE toutsele& objc_change(adr_selec_mult%,ex&) videsouris CLR objets_a_deplacer&,numero& un%=univers% fin_un%=@adresse_objet(nombre_d_objets&) DO ' Si l'objet n'est pas masqu‚, et si son calque est visible ' alors, on le s‚lectionne IF NOT BTST(BYTE{ADD(un%,offset_drapeau0&)},bit_masque|) IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(@adresse_objet(numero&)),36)),35)}=1 CARD{ADD(deplacement_multiple%,SHL(objets_a_deplacer&,1))}=numero& INC objets_a_deplacer& ENDIF ENDIF INC numero& ADD un%,taille_objet& LOOP WHILE un%mvty&) debut_popup_choix&=-debut_popup_choix&*(debut_popup_choix&=>0 AND debut_popup_choix&<=SUB(nombre_d_objets&,10))+0*(debut_popup_choix&<0)-SUB(nombre_d_objets&,10)*(debut_popup_choix&>SUB(nombre_d_objets&,10)) position_curseur_popup(adr_selec_mult%,selchope&,selchoca&,debut_popup_choix&,nombre_d_objets&,TRUE) ecrire_la_selection_multiple(TRUE) objc_change(adr_selec_mult%,selchope&) CASE bselchoc& IF NOT (BTST(OB_STATE(adr_selec_mult%,bselchoc&),aes_disable&)) objc_change(adr_selec_mult%,bselchoc&) deplace_curseur_popup(adr_selec_mult%,selchope&,selchoca&,0) objc_change(adr_selec_mult%,bselchoc&) ENDIF CASE selchoha& IF NOT (BTST(OB_STATE(adr_selec_mult%,ex&),aes_disable&)) IF debut_popup_choix&>0 objc_change(adr_selec_mult%,ex&) DEC debut_popup_choix& scroll_bas_popup_general(TRUE,adr_selec_mult%,debut_popup_choix&,0,nombre_d_objets&,10,souscurs&,selcho01&,selcho10&) position_curseur_popup(adr_selec_mult%,selchope&,selchoca&,debut_popup_choix&,nombre_d_objets&,TRUE) ecrire_la_selection_multiple(FALSE) objc_change(adr_selec_mult%,selchoha&) ENDIF ENDIF CASE selchoze& IF NOT (BTST(OB_STATE(adr_selec_mult%,ex&),aes_disable&)) IF debut_popup_choix&>0 objc_change(adr_selec_mult%,ex&) videsouris CLR debut_popup_choix& position_curseur_popup(adr_selec_mult%,selchope&,selchoca&,debut_popup_choix&,nombre_d_objets&,TRUE) ecrire_la_selection_multiple(TRUE) ENDIF ENDIF CASE selchoba& IF NOT (BTST(OB_STATE(adr_selec_mult%,ex&),aes_disable&)) IF debut_popup_choix&-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' IF normal_camera! fermeture_fenetre(44) normal_camera!=FALSE mettre_a_jour_les_redraws(global_xb&,global_yb&,global_wb&,global_hb&,-1) ENDIF $S|,$S> SELECT sortie_mul| CASE 1 ouvrir_modification CASE 2 lancement_gestion_texture ' ouvrir_textures CASE 3 lancement_gestion_texture ' ouvrir_pigment CASE 4 lancement_gestion_texture ' ouvrir_normal CASE 5 lancement_gestion_texture ' ouvrir_finish CASE 6 lancement_gestion_texture ' ouvrir_interior CASE 7 lancement_gestion_texture ' ouvrir_atmosphere ENDSELECT ' RETURN > PROCEDURE valide_devalide_options_saisie_multiple(in!,VAR objet_prem&) LOCAL i&,se& ' ob_state(adr_selec_mult%,textsemu&,aes_disable&,FALSE) ob_state(adr_selec_mult%,pigmsemu&,aes_disable&,FALSE) ob_state(adr_selec_mult%,normsemu&,aes_disable&,FALSE) ob_state(adr_selec_mult%,finisemu&,aes_disable&,FALSE) ob_state(adr_selec_mult%,halosemu&,aes_disable&,FALSE) ' IF BTST(BYTE{ADD(@adresse_texture(objet_actif&),3)},6) ob_state(adr_selec_mult%,pigmsemu&,aes_disable&,TRUE) ob_state(adr_selec_mult%,normsemu&,aes_disable&,TRUE) ob_state(adr_selec_mult%,finisemu&,aes_disable&,TRUE) ob_state(adr_selec_mult%,halosemu&,aes_disable&,TRUE) ENDIF IF objets_a_deplacer&=0 libere(*deplacement_multiple%) deplacement_multiple%=@prendre(SHL(limite_des_objets&,1),TRUE,3) CARD{deplacement_multiple%}=objet_actif& INT{ADD(effacement%,SHL(objet_actif&,1))}=1 objet_prem&=objet_actif& ELSE objet_prem&=nombre_d_objet& CLR i& DO INT{ADD(effacement%,SHL(CARD{ADD(deplacement_multiple%,SHL(i&,1))},1))}=1 objet_prem&=MIN(objet_prem&,CARD{ADD(deplacement_multiple%,SHL(i&,1))}) INC i& LOOP WHILE i& PROCEDURE ecrire_la_selection_multiple(ind!) LOCAL tex_debs&,choix&,fin_n&,limit&,num& avant_les_scrolls(TRUE,adr_selec_mult%,debut_popup_choix&,0,nombre_d_objets&,10,soussele&,selcho01&,selcho10&,limit&) tex_debs&=selcho01& fin_n&=ADD(debut_popup_choix&,limit&) num&=debut_popup_choix& DO ob_state(adr_selec_mult%,tex_debs&,aes_disable&,FALSE) BYTE{ADD(ADD(@adresse_objet(num&),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(num&),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_selec_mult%,tex_debs&)}}=STR$(num&,5)+LEFT$(CHAR{ADD(@adresse_objet(num&),offset_nom_objet&)},22)+CHR$(0) ELSE choix&=INT{@adresse_objet(num&)} CHAR{{OB_SPEC(adr_selec_mult%,tex_debs&)}}=STR$(num&,5)+@nom_objet$(choix&,TRUE)+CHR$(0) ENDIF IF BTST(BYTE{ADD(@adresse_objet(num&),offset_drapeau0&)},bit_masque|) ' Si l'objet est masqu‚ ou dans une CSG, on le grise dans la liste ob_state(adr_selec_mult%,tex_debs&,aes_disable&,TRUE) ' ELSE IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(@adresse_objet(num&)),36)),35)}=0 ' Si le calque de l'objet est invisible on le grise dans la liste ' ob_state(adr_selec_mult%,tex_debs&,aes_disable&,TRUE) ENDIF ob_state(adr_selec_mult%,tex_debs&,aes_selected&,FALSE) IF INT{ADD(effacement%,SHL(num&,1))}=1 ob_state(adr_selec_mult%,tex_debs&,aes_selected&,TRUE) ENDIF INC tex_debs& INC num& LOOP WHILE num&<=fin_n& IF limit&<9 num&=SUCC(limit&) DO ob_state(adr_selec_mult%,tex_debs&,aes_selected&,FALSE) ob_state(adr_selec_mult%,tex_debs&,aes_disable&,TRUE) CHAR{{OB_SPEC(adr_selec_mult%,tex_debs&)}}=STRING$(45,".") INC tex_debs& INC num& LOOP WHILE num&<10 ENDIF IF ind! redraw_elem(adr_selec_mult%,selesous&) ENDIF RETURN > PROCEDURE calcul_taille_selection_multiple(i!,VAR lar,hau,pro,milx,mily,milz,minx,miny,minz,maxx,maxy,maxz) LOCAL u%,fin_b%,k%,fin_k% LOCAL adr_face%,ef% LOCAL panx,pany,panz LOCAL panx%,pany%,panz% LOCAL tanx,tany,tanz LOCAL ranx,rany,ranz ' minx=3.599386269725E+308 miny=3.599386269725E+308 minz=3.599386269725E+308 maxx=-3.599386269725E+308 maxy=-3.599386269725E+308 maxz=-3.599386269725E+308 ' fin_b%=@adresse_objet(nombre_d_objets&) u%=univers% ef%=effacement% CLR tot_angx,tot_angy,tot_angz DO IF INT{ef%}=1 OR i! ' Si l'objet n'est pas masqu‚ (donc, pas en C.S.G.) IF NOT BTST(BYTE{ADD(u%,offset_drapeau0&)},bit_masque|) ' Et si ce n'est pas un plan (le presque infini ‡a pose des problŠmes) IF INT{u%}<>primitive_plan& ' R‚cup‚rer les points et faces d'une boŒte englobante pour calcul total adr_face%=@adresse_face(boite_active%) IF INT{u%}=primitive_triangle& pour_triangle_active(u%,panx,pany,panz,tanx,tany,tanz) bmove(ADD(boite_active%,2),transfert%,96) matrice_xyz(0,0,0,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=tanx {ADD(matrice%,4)}=tany {ADD(matrice%,8)}=tanz {ADD(tracer_rotattrans%,32)}=8 {ADD(tracer_rotattrans%,36)}=panx*1024 {ADD(tracer_rotattrans%,40)}=pany*1024 {ADD(tracer_rotattrans%,44)}=panz*1024 ro_tr(tracer_rotattrans%) ELSE panx=ROUND(SINGLE{ADD(u%,2)},3) pany=ROUND(SINGLE{ADD(u%,6)},3) panz=ROUND(SINGLE{ADD(u%,10)},3) tanx=ROUND(SINGLE{ADD(u%,14)},3) tany=ROUND(SINGLE{ADD(u%,18)},3) tanz=ROUND(SINGLE{ADD(u%,22)},3) ranx=ROUND(SINGLE{ADD(u%,26)},3) rany=ROUND(SINGLE{ADD(u%,30)},3) ranz=ROUND(SINGLE{ADD(u%,34)},3) bmove(ADD(boite_active%,2),transfert%,96) matrice_zyx(-ranx,-rany,-ranz,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=tanx {ADD(matrice%,4)}=tany {ADD(matrice%,8)}=tanz {ADD(tracer_rotattrans%,32)}=8 {ADD(tracer_rotattrans%,36)}=panx*1024 {ADD(tracer_rotattrans%,40)}=pany*1024 {ADD(tracer_rotattrans%,44)}=panz*1024 ro_tr(tracer_rotattrans%) ENDIF fin_k%=ADD(transfert%,96) k%=transfert% DO minx=MIN(minx,{k%}/1024) miny=MIN(miny,{ADD(k%,4)}/1024) minz=MIN(minz,{ADD(k%,8)}/1024) maxx=MAX(maxx,{k%}/1024) maxy=MAX(maxy,{ADD(k%,4)}/1024) maxz=MAX(maxz,{ADD(k%,8)}/1024) ADD k%,12 LOOP WHILE k% PROCEDURE afficher_coordonnees(ii!) ! Ou est elle ? La souris ? LOCAL adr%,origx&,origy&,univ%,adr_nom_actif% LOCAL f1!,f2!,f3! LOCAL cx&,cy&,cw&,ch& ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) enleve_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) ' calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& ' IF (global_mx&>global_xf& AND global_my&>global_yf& AND global_mx& SELECT dessin_3d| CASE vue_de_face| ' X+ … droite Y+ en haut ADD origx&,deplacement_en_x& ADD origy&,deplacement_en_y& xm=SUB(global_mx&,origx&)*z_correctionx%/zoom% ym=-SUB(global_my&,origy&)*z_correctiony%/zoom% coordonnee_par_grille(xm,ym) CHAR{adr%}="X "+STR$(xm,10,3)+" Y "+STR$(ym,10,3)+" Calque Nø "+STR$(SUCC(calque_actif|),2)+" Zoom "+STR$(zoom%/1024,10,3) CASE vue_de_dos| ' X+ … gauche Y+ en haut SUB origx&,deplacement_en_x& ADD origy&,deplacement_en_y& xm=-SUB(global_mx&,origx&)*z_correctionx%/zoom% ym=SUB(global_my&,origy&)*z_correctiony%/zoom% coordonnee_par_grille(xm,ym) CHAR{adr%}="X "+STR$(xm,10,3)+" Y "+STR$(ym,10,3)+" Calque Nø "+STR$(SUCC(calque_actif|),2)+" Zoom "+STR$(zoom%/1024,10,3) CASE vue_de_gauche| ' Z+ … gauche Y+ en haut SUB origx&,deplacement_en_z& ADD origy&,deplacement_en_y& zm=-SUB(global_mx&,origx&)*z_correctionx%/zoom% ym=-SUB(global_my&,origy&)*z_correctiony%/zoom% coordonnee_par_grille(zm,ym) CHAR{adr%}="Y "+STR$(ym,10,3)+" Z "+STR$(zm,10,3)+" Calque Nø "+STR$(SUCC(calque_actif|),2)+" Zoom "+STR$(zoom%/1024,10,3) CASE vue_de_droite| ' Z+ … droite Y+ en haut ADD origx&,deplacement_en_z& ADD origy&,deplacement_en_y& zm=SUB(global_mx&,origx&)*z_correctionx%/zoom% ym=-SUB(global_my&,origy&)*z_correctiony%/zoom% coordonnee_par_grille(zm,ym) CHAR{adr%}="Y "+STR$(ym,10,3)+" Z "+STR$(zm,10,3)+" Calque Nø "+STR$(SUCC(calque_actif|),2)+" Zoom "+STR$(zoom%/1024,10,3) CASE vue_de_dessus| ' X+ … droite Z+ en haut ADD origx&,deplacement_en_x& ADD origy&,deplacement_en_z& xm=SUB(global_mx&,origx&)*z_correctionx%/zoom% zm=-SUB(global_my&,origy&)*z_correctiony%/zoom% coordonnee_par_grille(xm,zm) CHAR{adr%}="X "+STR$(xm,10,3)+" Z "+STR$(zm,10,3)+" Calque Nø "+STR$(SUCC(calque_actif|),2)+" Zoom "+STR$(zoom%/1024,10,3) CASE vue_de_dessous| ' X+ … droite Z+ en bas ADD origx&,deplacement_en_x& SUB origy&,deplacement_en_z& xm=SUB(global_mx&,origx&)*z_correctionx%/zoom% zm=SUB(global_my&,origy&)*z_correctiony%/zoom% coordonnee_par_grille(xm,zm) CHAR{adr%}="X "+STR$(xm,10,3)+" Z "+STR$(zm,10,3)+" Calque Nø "+STR$(SUCC(calque_actif|),2)+" Zoom "+STR$(zoom%/1024,10,3) ENDSELECT CHAR{{OB_SPEC(adr_fenetre%,fenvue06&)}}=CHAR{adr%} redraw_element_fenetre(48,adr_fenetre%,fenvue06&) ENDIF RETURN > PROCEDURE coordonnee_par_grille(VAR cxm,cym) IF grille_vue! cxm=MUL(DIV(cxm,pas_grille&),pas_grille&) cym=MUL(DIV(cym,pas_grille&),pas_grille&) ENDIF RETURN > PROCEDURE ecran_vers_univers(soux&,souy&,VAR noux,nouy) LOCAL adr%,origx&,origy& LOCAL xm,ym,zm LOCAL cx&,cy&,cw&,ch& ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& ' dans_quelle_vue(origx&,origy&) $S|,S> SELECT dessin_3d| CASE vue_de_face|,vue_de_droite|,vue_de_dessus| ' X+ … droite Y+ en haut ' Z+ … droite Y+ en haut ' X+ … droite Z+ en haut noux=SUB(soux&,origx&)*z_correctionx%/zoom% nouy=-SUB(souy&,origy&)*z_correctiony%/zoom% coordonnee_par_grille(noux,nouy) CASE vue_de_dos|,vue_de_gauche| ' X+ … gauche Y+ en haut ' Z+ … gauche Y+ en haut noux=-SUB(soux&,origx&)*z_correctionx%/zoom% nouy=-SUB(souy&,origy&)*z_correctiony%/zoom% coordonnee_par_grille(noux,nouy) CASE vue_de_dessous| ' X+ … droite Z+ en bas noux=SUB(soux&,origx&)*z_correctionx%/zoom% nouy=SUB(souy&,origy&)*z_correctiony%/zoom% coordonnee_par_grille(noux,nouy) ENDSELECT RETURN > PROCEDURE grille_ecran LOCAL j&,i&,origx&,origy&,des% LOCAL px0&,py0&,px1&,py1& LOCAL fin_b0&,fin_b1& LOCAL xm,ym,pasx,pasy set_polymarker_type(marqueur|) set_polymarker_height(1) set_polymarker_color_index(noir&) ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& ' $S|,S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dessus|,vue_de_dessous| ' X+ … droite ADD origx&,deplacement_en_x& CASE vue_de_dos| ' X+ … gauche SUB origx&,deplacement_en_x& CASE vue_de_gauche| ' Z+ … gauche SUB origx&,deplacement_en_z& CASE vue_de_droite| ' Z+ … droite ADD origx&,deplacement_en_z& ENDSELECT $S|,S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos|,vue_de_gauche|,vue_de_droite| ' Y+ en haut ADD origy&,deplacement_en_y& CASE vue_de_dessus| ' Z+ en haut ADD origy&,deplacement_en_z& CASE vue_de_dessous| ' Z+ en bas SUB origy&,deplacement_en_z& ENDSELECT ' {zoo%}=zoom% {ADD(zoo%,4)}=z_correctionx% {ADD(zoo%,8)}=zoom% {ADD(zoo%,12)}=z_correctiony% ' pasx=(pas_grille&*zoom%)/z_correctionx% pasy=(pas_grille&*zoom%)/z_correctiony% fin_b0&=ADD(global_xf&,global_wf&) fin_b1&=ADD(global_yf&,global_hf&) py0&=global_yf& ' {ADD(tracer_proj2d%,16)}=transfert% {ADD(tracer_proj2d%,20)}=emu_xten% {ADD(tracer_proj2d%,28)}=vue_de_face| {ADD(tracer_proj2d%,32)}=origx& {ADD(tracer_proj2d%,36)}=origy& ' DO px0&=global_xf& DO ecran_vers_univers(px0&,py0&,xm,ym) coordonnee_par_grille(xm,ym) {transfert%}=xm*1024 {ADD(transfert%,4)}=ym*1024 c2d2d(tracer_proj2d%) ' polymarker(0) ADD px0&,pasx LOOP WHILE px0&<=fin_b0& ADD py0&,pasy LOOP WHILE py0&<=fin_b1& RETURN > PROCEDURE desactiver_fenetre ! Elles ne sont plus actives non ? LOCAL i&,adr%,top&,obstate& LOCAL pc&,pcf&,c&,obflags& LOCAL x&,y&,w&,h& ~@wind_get(0,wf_top&,top&,temp&,temp&,temp&) CLR i& DO ! Pour toutes les fenˆtres IF i&<>25 ! et qu'elle n'est pas la fenˆtre du lanceur IF INT{ADD(hwind%,SHL(i&,1))}>-1 ! Si la fenˆtre est ouverte adr%=@arbre_ressource(i&) ! R‚cupŠre l'arbre pc&=OB_TAIL(adr%,0) ! Combien d'enfants ?? WHILE pc&<>-1 ! Recherche du dernier enfant pcf&=pc& pc&=OB_TAIL(adr%,pcf&) WEND ! Ok on est au dernier CLR c& DO obflags&=OB_FLAGS(adr%,c&) ! Noter ob_flags objet IF BTST(ob_flags&,aes_hidetree&)=0 ! Si non HIDETREE obstate&=OB_STATE(adr%,c&) ! Noter ob_state objet IF BTST(obstate&,wm_xmoved&) ! Si barre de mouvement IF i&=@numero_fenetre(top&) obstate&=OB_STATE(adr%,PRED(c&)) ! ob_state de la vrai barre IF BTST(obstate&,aes_disable&) OB_STATE(adr%,PRED(c&))=BCLR(obstate&,aes_disable&) redraw_element_fenetre(SHL(i&,1),adr%,PRED(c&)) ENDIF ELSE obstate&=OB_STATE(adr%,PRED(c&)) IF BTST(obstate&,aes_disable&)=0 OB_STATE(adr%,PRED(c&))=BSET(obstate&,aes_disable&) redraw_element_fenetre(SHL(i&,1),adr%,PRED(c&)) ENDIF ENDIF c&=pcf& ENDIF ENDIF INC c& LOOP WHILE c&<=pcf& ENDIF ENDIF INC i& LOOP WHILE i&<32 RETURN > PROCEDURE changement_de_vue(mode_de_vue|) $S|,$S> SELECT mode_de_vue| CASE vue_de_face|,vue_de_dos|,vue_de_droite|,vue_de_gauche|,vue_de_dessus|,vue_de_dessous| IF dessin_gouraud_phong! redimention!=FALSE ENDIF IF vue_subjective! BMOVE mem_subj%,camera%,24 vue_subjective!=FALSE tri_fi!=FALSE ENDIF demarquer_les_menus dessin_3d|=mode_de_vue| IF memoire_dessin|<>mode_de_vue| tri_2d!=FALSE ENDIF memoire_dessin|=mode_de_vue| marquer_les_menus SELECT mode_de_vue| CASE vue_de_face|,vue_de_dos| ob_state(adr_fenetre%,fenlib_x&,aes_selected&,liberte_x!) ob_state(adr_fenetre%,fenlib_y&,aes_selected&,liberte_y!) ob_state(adr_fenetre%,fenlib_z&,aes_selected&,FALSE) CASE vue_de_droite|,vue_de_gauche| ob_state(adr_fenetre%,fenlib_x&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_y&,aes_selected&,liberte_y!) ob_state(adr_fenetre%,fenlib_z&,aes_selected&,liberte_z!) CASE vue_de_dessus|,vue_de_dessous| ob_state(adr_fenetre%,fenlib_x&,aes_selected&,liberte_x!) ob_state(adr_fenetre%,fenlib_y&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_z&,aes_selected&,liberte_z!) ENDSELECT redessin_deja_fait!=FALSE redraw_icones_de_vue redraw_force(idx_vue&,idx_vue&) CASE vue_en_3d|,vue_en_3d_cache|,vue_en_bouknight|,vue_en_subjectif| IF dessin_gouraud_phong! redimention!=FALSE ENDIF demarquer_les_menus IF mode_de_vue|=vue_en_3d| IF vue_subjective! BMOVE mem_subj%,camera%,24 vue_subjective!=FALSE tri_fi!=FALSE ENDIF trait!=FALSE face_pleine!=FALSE ELSE IF mode_de_vue|=vue_en_3d_cache| IF vue_subjective! BMOVE mem_subj%,camera%,24 vue_subjective!=FALSE tri_fi!=FALSE ENDIF trait!=TRUE face_pleine!=FALSE ELSE IF mode_de_vue|=vue_en_bouknight| IF vue_subjective! BMOVE mem_subj%,camera%,24 vue_subjective!=FALSE tri_fi!=FALSE ENDIF trait!=TRUE face_pleine!=TRUE ELSE IF mode_de_vue|=vue_en_subjectif| IF NOT vue_subjective! BMOVE camera%,mem_subj%,24 ENDIF trait!=FALSE face_pleine!=FALSE redimention!=FALSE vue_subjective!=TRUE SINGLE{camera%}=VAL(CHAR{{OB_SPEC(adr_vue_subjective%,possubx&)}}) SINGLE{ADD(camera%,4)}=VAL(CHAR{{OB_SPEC(adr_vue_subjective%,possuby&)}}) SINGLE{ADD(camera%,8)}=VAL(CHAR{{OB_SPEC(adr_vue_subjective%,possubz&)}}) SINGLE{ADD(camera%,12)}=VAL(CHAR{{OB_SPEC(adr_vue_subjective%,subversx&)}}) SINGLE{ADD(camera%,16)}=VAL(CHAR{{OB_SPEC(adr_vue_subjective%,subversy&)}}) SINGLE{ADD(camera%,20)}=VAL(CHAR{{OB_SPEC(adr_vue_subjective%,subversz&)}}) ENDIF IF dessin_3d| PROCEDURE dans_quelle_vue(VAR origx&,origy&) $S|,$S> SELECT dessin_3d| CASE vue_de_face| ' X+ … droite Y+ en haut ADD origx&,deplacement_en_x& ADD origy&,deplacement_en_y& CASE vue_de_dos| ' X+ … gauche Y+ en haut SUB origx&,deplacement_en_x& ADD origy&,deplacement_en_y& CASE vue_de_gauche| ' Z+ … gauche Y+ en haut SUB origx&,deplacement_en_z& ADD origy&,deplacement_en_y& CASE vue_de_droite| ' Z+ … droite Y+ en haut ADD origx&,deplacement_en_z& ADD origy&,deplacement_en_y& CASE vue_de_dessus| ' X+ … droite Z+ en haut ADD origx&,deplacement_en_x& ADD origy&,deplacement_en_z& CASE vue_de_dessous| ' X+ … droite Z+ en bas ADD origx&,deplacement_en_x& SUB origy&,deplacement_en_z& ENDSELECT RETURN > PROCEDURE rotation_pour_vue_2d(nb%) $S|,$S> SELECT dessin_3d| CASE vue_de_dos| ' X+ … gauche Y+ en haut matrice_xyz(0,180,0,matrice%) CASE vue_de_gauche| ' Z+ … gauche Y+ en haut matrice_xyz(0,270,0,matrice%) CASE vue_de_droite| ' Z+ … droite Y+ en haut matrice_xyz(0,90,0,matrice%) CASE vue_de_dessus| ' X+ … droite Z+ en haut matrice_xyz(90,0,0,matrice%) CASE vue_de_dessous| ' X+ … droite Z+ en bas matrice_xyz(270,0,0,matrice%) DEFAULT ' Dans tous les autres cas matrice_xyz(0,0,0,matrice%) ENDSELECT ' ******** Echelle + Rotation + Translation {matrice%}=2 {ADD(matrice%,4)}=2 {ADD(matrice%,8)}=2 {ADD(tracer_rotattrans%,32)}=nb% {ADD(tracer_rotattrans%,36)}=0 {ADD(tracer_rotattrans%,40)}=0 {ADD(tracer_rotattrans%,44)}=0 ro_tr(tracer_rotattrans%) RETURN ' ****************************************************************************** > PROCEDURE redraw_force(debut_redraw&,fin_redraw&) LOCAL xv&,yv&,wv&,hv& LOCAL i&,xw&,yw&,ww&,hw& i&=debut_redraw& ! Pour certaines fenˆtres DO ' Si la fenˆtre est ouverte ou si c'est le bureau IF (INT{ADD(hwind%,SHL(i&,1))}>-1) OR (i&=0) IF i&=0 xw&=global_xb& yw&=global_yb& ww&=global_wb& hw&=global_hb& ELSE IF mode_winx! ~@wind_get(INT{ADD(hwind%,SHL(i&,1))},wf_workxywh&,xv&,yv&,wv&,hv&) wind_calc(0,0,xv&,yv&,wv&,hv&,xw&,yw&,ww&,hw&) ELSE ~@wind_get(INT{ADD(hwind%,SHL(i&,1))},wf_currxywh&,xw&,yw&,ww&,hw&) ENDIF ENDIF ' On s'envoie … soi-mˆme un message de redraw INT{buf%}=wm_redraw& ! Num‚ro du message INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur du message INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message INT{ADD(buf%,6)}=INT{ADD(hwind%,SHL(i&,1))} ! Handle fenˆtre concern‚e INT{ADD(buf%,8)}=xw& ! Cordonn‚e zone redraw (bureau) INT{ADD(buf%,10)}=yw& INT{ADD(buf%,12)}=ww& INT{ADD(buf%,14)}=hw& appl_write(ap_id&,16,buf%) ! Envoi du message ENDIF INC i& LOOP WHILE i& PROCEDURE redraw(x&,y&,w&,h&,de!) ! Une liste de rectangle c'est utile... LOCAL redrx&,redry&,redrw&,redrh&,rdx&,rdy&,rdw&,rdh&,index& LOCAL mem_redrx&,mem_redry&,mem_redrw&,mem_redrh&,m_ix&,m_iy& LOCAL temp&,top&,i&,cp&,r%,x_f&,y_f&,cr|,cv|,cb|,rep& LOCAL cx&,cy&,cw&,ch&,num_buf&,adrc%,taille_fic% LOCAL zx&,zy&,zw&,zh&,fx&,fy&,fw&,fh&,origx&,origy& LOCAL p_cou1&,p_cou2&,p_tra1%,p_tra2%,p_tra3% LOCAL s%,sl&,sh&,sp&,d%,dl&,dh&,dp& ' num_buf&=INT{ADD(buf%,6)} ~@wind_get(0,wf_top&,top&,temp&,temp&,temp&) index&=@numero_fenetre(num_buf&) rdx&=x& ! Coordonn‚es rectangle … redessiner rdy&=y& rdw&=w& rdh&=h& ' L…, on commence par r‚cup‚rer tout les rectangles … redessiner. ' Ainsi, on est sur qu'aucune perturbation ne viendra stoper les ' redessins d'‚crans de mˆme que mes routines de dessins qui bloque ' les listes de rectangles. CLR cp& r%=redraw_mem% ! Zone de m‚morisation des rectangles ' Demande les coord. et dimensions du 1ø rectangle de la liste ~@wind_get(num_buf&,wf_firstxywh&,redrx&,redry&,redrw&,redrh&) DO ' IF (redrw&>0) AND (redrh&>0) INT{r%}=index& INT{ADD(r%,2)}=redrx& INT{ADD(r%,4)}=redry& INT{ADD(r%,6)}=redrw& INT{ADD(r%,8)}=redrh& INC cp& ADD r%,10 ENDIF ' Rectangle suivant rep&=@wind_get(num_buf&,wf_nextxywh&,redrx&,redry&,redrw&,redrh&) ' Tant qu'il y a largeur ou hauteur et pas d'erreur... ' et tant que le compteur n'a pas atteint la valeur 100 EXIT IF (redrw&<1) OR (redrh&<1) OR (rep&=0) ' EXIT IF rep&=0 EXIT IF cp&=200 ! j'ai cent rectangles en r‚serve... LOOP ' Et voil…. Maintenant, le GEM peut faire ce qu'il veut. La liste des ' rectangles est sauv‚e. Il est donc possible de la parcourir sans passer ' par le GEM et enfin faire des redessins correts. r%=redraw_mem% CLR i& DO index&=INT{r%} redrx&=INT{ADD(r%,2)} redry&=INT{ADD(r%,4)} redrw&=INT{ADD(r%,6)} redrh&=INT{ADD(r%,8)} ' IF (redrw&<>0) AND (redrh&<>0) ' Si intersection des deux zones IF RC_INTERSECT(rdx&,rdy&,rdw&,rdh&,redrx&,redry&,redrw&,redrh&) AND index&<>-1 x_f&=PRED(ADD(redrx&,redrw&)) IF x_f&>xmax& redrw&=SUB(redrw&,SUB(x_f&,xmax&)) ENDIF y_f&=PRED(ADD(redry&,redrh&)) IF y_f&>ymax& redrh&=SUB(redrh&,SUB(y_f&,ymax&)) ENDIF $S|,S> SELECT index& CASE idx_vue& IF redessin_deja_fait! buffer_vers_ecran(redrx&,redry&,PRED(redrw&),PRED(redrh&)) redraw_element_fenetre(48,adr_fenetre%,fenvue02&) ELSE IF trois_vue! ' Redessin de la vue en cours ' objc_offset(adr_fenetre%,fenvue07&,global_xf&,global_yf&) global_wf&=ADD(OB_W(adr_fenetre%,fenvue07&),OB_W(adr_fenetre%,fenvue27&)) global_hf&=ADD(OB_H(adr_fenetre%,fenvue07&),OB_H(adr_fenetre%,fenvue37&)) ' la_fenetre(fenvue00&,cx&,cy&,cw&,ch&) x_f&=PRED(ADD(cx&,cw&)) IF x_f&>xmax& cw&=SUB(cw&,SUB(x_f&,xmax&)) ENDIF y_f&=PRED(ADD(cy&,ch&)) IF y_f&>ymax& ch&=SUB(ch&,SUB(y_f&,ymax&)) ENDIF ' ========================== Le haut de la fenˆtre zx&=cx& zy&=cy& zw&=cw& zh&=SUB(global_yf&,cy&) IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) objc_draw(adr_fenetre%,0,12,zx&,zy&,zw&,zh&,-1) ENDIF ' ========================== Le bas de la fenˆtre zx&=cx& zy&=ADD(global_yf&,global_hf&) zw&=cw& zh&=SUB(PRED(ADD(cy&,ch&)),PRED(zy&)) IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) objc_draw(adr_fenetre%,0,12,zx&,zy&,zw&,zh&,-1) ENDIF ' ========================== La partie droite de la fenˆtre zx&=ADD(global_xf&,global_wf&) zy&=cy& zw&=SUB(PRED(ADD(cx&,cw&)),PRED(zx&)) zh&=ch& IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) objc_draw(adr_fenetre%,0,12,zx&,zy&,zw&,zh&,-1) ENDIF ' ========================== Vue de face la_fenetre(fenvue07&,zx&,zy&,zw&,zh&) calcul_la_zone_clippe(zx&,zy&,zw&,zh&,mix&,miy&) fen_act&=fenvue07& tri_2d!=FALSE dessin_3d|=vue_de_face| redessin_deja_fait!=FALSE IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) objc_draw(adr_fenetre%,fenvue07&,0,zx&,zy&,zw&,zh&,-1) redraw_image_de_fond(zx&,zy&,zw&,zh&) IF de! dessin_generale(physique%,zx&,zy&,zw&,zh&) ENDIF ENDIF ' ========================== Vue de gauche la_fenetre(fenvue27&,zx&,zy&,zw&,zh&) calcul_la_zone_clippe(zx&,zy&,zw&,zh&,mix&,miy&) fen_act&=fenvue27& tri_2d!=FALSE dessin_3d|=vue_de_gauche| redessin_deja_fait!=FALSE IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) objc_draw(adr_fenetre%,fenvue27&,0,zx&,zy&,zw&,zh&,-1) redraw_image_de_fond(zx&,zy&,zw&,zh&) IF de! dessin_generale(physique%,zx&,zy&,zw&,zh&) ENDIF ENDIF ' ========================== Vue de dessus la_fenetre(fenvue37&,zx&,zy&,zw&,zh&) calcul_la_zone_clippe(zx&,zy&,zw&,zh&,mix&,miy&) fen_act&=fenvue37& tri_2d!=FALSE dessin_3d|=vue_de_dessus| redessin_deja_fait!=FALSE IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) objc_draw(adr_fenetre%,fenvue37&,0,zx&,zy&,zw&,zh&,-1) redraw_image_de_fond(zx&,zy&,zw&,zh&) IF de! dessin_generale(physique%,zx&,zy&,zw&,zh&) ENDIF ENDIF ' ========================== Vue en 3D filaire (plein si OpenGL) la_fenetre(fenvue47&,zx&,zy&,zw&,zh&) calcul_la_zone_clippe(zx&,zy&,zw&,zh&,mix&,miy&) fen_act&=fenvue47& tri_fi!=FALSE dessin_3d|=vue_en_3d| redessin_deja_fait!=FALSE trait!=FALSE ' ' IF utilise_opengl! ' trace_3d_plein!=FALSE ' dernier_plein!=TRUE ' face_pleine!=TRUE ' trait!=TRUE ' ENDIF ' IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) IF NOT utilise_opengl! objc_draw(adr_fenetre%,fenvue47&,0,zx&,zy&,zw&,zh&,-1) ENDIF IF de! dessin_generale(physique%,zx&,zy&,zw&,zh&) ENDIF ENDIF ELSE ' Redessin de la vue en cours ' la_fenetre(fenvue00&,cx&,cy&,cw&,ch&) x_f&=PRED(ADD(cx&,cw&)) IF x_f&>xmax& cw&=SUB(cw&,SUB(x_f&,xmax&)) ENDIF y_f&=PRED(ADD(cy&,ch&)) IF y_f&>ymax& ch&=SUB(ch&,SUB(y_f&,ymax&)) ENDIF ' ========================== Le haut de la fenˆtre zx&=cx& zy&=cy& zw&=cw& zh&=SUB(global_yf&,cy&) IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) objc_draw(adr_fenetre%,0,12,zx&,zy&,zw&,zh&,-1) ENDIF ' ========================== Le bas de la fenˆtre zx&=cx& zy&=ADD(global_yf&,global_hf&) zw&=cw& zh&=SUB(PRED(ADD(cy&,ch&)),PRED(zy&)) IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) objc_draw(adr_fenetre%,0,12,zx&,zy&,zw&,zh&,-1) ENDIF ' ========================== La partie droite de la fenˆtre zx&=ADD(global_xf&,global_wf&) zy&=cy& zw&=SUB(PRED(ADD(cx&,cw&)),PRED(zx&)) zh&=ch& IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) objc_draw(adr_fenetre%,0,12,zx&,zy&,zw&,zh&,-1) ENDIF ' ========================== Et la zone graphique fen_act&=fenvue07& la_fenetre(fenvue07&,zx&,zy&,zw&,zh&) IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) IF dessin_3d|=vue_en_3d| IF NOT utilise_opengl! objc_draw(adr_fenetre%,fenvue07&,0,zx&,zy&,zw&,zh&,-1) redraw_image_de_fond(zx&,zy&,zw&,zh&) ENDIF ELSE objc_draw(adr_fenetre%,fenvue07&,0,zx&,zy&,zw&,zh&,-1) redraw_image_de_fond(zx&,zy&,zw&,zh&) ENDIF IF de! dessin_generale(physique%,zx&,zy&,zw&,zh&) ENDIF ENDIF ENDIF ENDIF CASE idx_merci& effacer_texte_merci_non_vue ob_flags(adr_merci%,inf_contenu&,aes_hidetree&,TRUE) objc_draw(@arbre_ressource(index&),0,12,redrx&,redry&,redrw&,redrh&,-1) ob_flags(adr_merci%,inf_contenu&,aes_hidetree&,FALSE) objc_offset(adr_merci%,inf_cadre&,zx&,zy&) zw&=OB_W(adr_merci%,inf_cadre&) zh&=OB_H(adr_merci%,inf_cadre&) IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) objc_draw(@arbre_ressource(index&),inf_contenu&,1,zx&,zy&,zw&,zh&,-1) ENDIF CASE idx_vue_fine& objc_draw(adr_vue_fine%,0,12,redrx&,redry&,redrw&,redrh&,-1) objc_offset(adr_vue_fine%,gourphon&,zx&,zy&) zw&=OB_W(adr_vue_fine%,gourphon&) zh&=OB_H(adr_vue_fine%,gourphon&) mix&=ADD(zx&,DIV(zw&,2)) miy&=ADD(zy&,DIV(zh&,2)) IF PRED(ADD(zx&,zw&))>xmax& zw&=SUB(zw&,SUB(PRED(ADD(zx&,zw&)),xmax&)) ENDIF IF PRED(ADD(zy&,zh&))>ymax& zh&=SUB(global_hf&,SUB(PRED(ADD(zy&,zh&)),ymax&)) ENDIF IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) objc_draw(adr_vue_fine%,gourphon&,0,zx&,zy&,zw&,zh&,-1) IF dessin_gouraud_phong! buffer_vers_go_ph(zx&,zy&,zw&,zh&) ELSE IF de! dessin_gouraud_phong(zx&,zy&,zw&,zh&) go_ph_vers_buffer ENDIF ENDIF ENDIF CASE idx_couleurs& objc_draw(@arbre_ressource(index&),0,12,redrx&,redry&,redrw&,redrh&,-1) lire_couleurs(couleur_en_cours%,TRUE) CASE idx_lumieres& objc_draw(@arbre_ressource(index&),0,12,redrx&,redry&,redrw&,redrh&,-1) ' --------------------------------------- Couleur d'une source lumineuse cr|=BYTE{ADD(mem_src%,4)} cv|=BYTE{ADD(mem_src%,5)} cb|=BYTE{ADD(mem_src%,6)} objc_offset(adr_lumieres%,souscoul&,fx&,fy&) fw&=OB_W(adr_lumieres%,souscoul&) fh&=OB_H(adr_lumieres%,souscoul&) affichage_couleur_tc(fx&,fy&,fw&,fh&,cr|,cv|,cb|,redrx&,redry&,redrw&,redrh&) CASE idx_auteur& affiche_image_auteur(redrx&,redry&,redrw&,redrh&) CASE idx_hierarchie& objc_draw(@arbre_ressource(index&),0,12,redrx&,redry&,redrw&,redrh&,-1) analyse_scene objc_offset(adr_hierarchie%,hie_sous&,zx&,zy&) zw&=OB_W(adr_hierarchie%,hie_sous&) zh&=OB_H(adr_hierarchie%,hie_sous&) IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) place_le_clipping(zx&,zy&,PRED(ADD(zx&,zw&)),PRED(ADD(zy&,zh&)),m_ix&,m_iy&) redessin_hierarchie(TRUE) enleve_le_clipping(zx&,zy&,PRED(ADD(zx&,zw&)),PRED(ADD(zy&,zh&)),m_ix&,m_iy&) ENDIF CASE idx_animation& objc_draw(@arbre_ressource(index&),0,12,redrx&,redry&,redrw&,redrh&,-1) objc_offset(adr_animation%,0,zx&,zy&) zw&=OB_W(adr_animation%,0) zh&=OB_H(adr_animation%,0) IF RC_INTERSECT(redrx&,redry&,redrw&,redrh&,zx&,zy&,zw&,zh&) barre_d_anime!=FALSE place_le_clipping(zx&,zy&,PRED(ADD(zx&,zw&)),PRED(ADD(zy&,zh&)),m_ix&,m_iy&) dessin_time_line(zx&,zy&,zw&,zh&) enleve_le_clipping(zx&,zy&,PRED(ADD(zx&,zw&)),PRED(ADD(zy&,zh&)),m_ix&,m_iy&) ENDIF DEFAULT objc_draw(@arbre_ressource(index&),0,12,redrx&,redry&,redrw&,redrh&,-1) ENDSELECT ENDIF ENDIF ' INC i& ADD r%,10 LOOP WHILE i&0 ' ------------------------------------------------------- Vue de face la_fenetre(fenvue07&,redrx&,redry&,redrw&,redrh&) x_f&=PRED(ADD(redrx&,redrw&)) y_f&=PRED(ADD(redry&,redrh&)) IF x_f&>xmax& redrw&=SUB(redrw&,SUB(x_f&,xmax&)) ENDIF IF y_f&>ymax& redrh&=SUB(redrh&,SUB(y_f&,ymax&)) ENDIF fen_act&=fenvue07& dessin_3d|=vue_de_face| ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,zx&,zy&,zw&,zh&) IF zh&>28 place_le_clipping(redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),m_ix&,m_iy&) ' set_clipping_rectangle(1,redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),0,0) objet_actif(TRUE) ' set_clipping_rectangle(0,redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),0,0) enleve_le_clipping(redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),m_ix&,m_iy&) ENDIF ' -------------------------------------------------------- Vue de gauche la_fenetre(fenvue27&,redrx&,redry&,redrw&,redrh&) x_f&=PRED(ADD(redrx&,redrw&)) y_f&=PRED(ADD(redry&,redrh&)) IF x_f&>xmax& redrw&=SUB(redrw&,SUB(x_f&,xmax&)) ENDIF IF y_f&>ymax& redrh&=SUB(redrh&,SUB(y_f&,ymax&)) ENDIF fen_act&=fenvue27& dessin_3d|=vue_de_gauche| ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,zx&,zy&,zw&,zh&) IF zh&>28 place_le_clipping(redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),m_ix&,m_iy&) ' set_clipping_rectangle(1,redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),0,0) objet_actif(TRUE) ' set_clipping_rectangle(0,redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),0,0) place_le_clipping(redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),m_ix&,m_iy&) ENDIF ' ------------------------------------------------------- Vue de dessus la_fenetre(fenvue37&,redrx&,redry&,redrw&,redrh&) x_f&=PRED(ADD(redrx&,redrw&)) y_f&=PRED(ADD(redry&,redrh&)) IF x_f&>xmax& redrw&=SUB(redrw&,SUB(x_f&,xmax&)) ENDIF IF y_f&>ymax& redrh&=SUB(redrh&,SUB(y_f&,ymax&)) ENDIF fen_act&=fenvue37& dessin_3d|=vue_de_dessus| ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,zx&,zy&,zw&,zh&) IF zh&>28 place_le_clipping(redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),m_ix&,m_iy&) ' set_clipping_rectangle(1,redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),0,0) objet_actif(TRUE) ' set_clipping_rectangle(0,redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),0,0) enleve_le_clipping(redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),m_ix&,m_iy&) ENDIF ENDIF ELSE la_fenetre(fenvue07&,redrx&,redry&,redrw&,redrh&) x_f&=PRED(ADD(redrx&,redrw&)) y_f&=PRED(ADD(redry&,redrh&)) IF x_f&>xmax& redrw&=SUB(redrw&,SUB(x_f&,xmax&)) ENDIF IF y_f&>ymax& redrh&=SUB(redrh&,SUB(y_f&,ymax&)) ENDIF IF NOT redessin_deja_fait! IF (PRED(ADD(redrx&,redrw&))0 AND dessin_3d|28 place_le_clipping(redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),m_ix&,m_iy&) ' set_clipping_rectangle(1,redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),0,0) objet_actif(TRUE) ' set_clipping_rectangle(0,redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),0,0) enleve_le_clipping(redrx&,redry&,PRED(ADD(redrx&,redrw&)),PRED(ADD(redry&,redrh&)),m_ix&,m_iy&) ENDIF ENDIF ENDIF ELSE IF NOT premiere_copie! ecran_vers_buffer premiere_copie!=TRUE ENDIF IF info_objet_supp! info_supplementaire_objet_actif ENDIF RETURN > PROCEDURE redraw_image_de_fond(zx&,zy&,zw&,zh&) LOCAL s%,sl&,sh&,sp&,d%,dl&,dh&,dp& LOCAL origx&,origy&,taille_fic% LOCAL xf&,yf&,wf&,hf&,cx&,cy&,cw&,ch& ' IF image_de_calque! ' IF @image_de_fond_presente ' IF @change_image_de_fond(origx&,origy&) libere(*image_buf_af%) ' sp&=1 ! Monochrome dp&=plan_systeme& ! Fonction de l'‚cran ' $S|,S> SELECT dessin_3d| CASE vue_de_face| IF image_flg_face! ' taille_fic%=largeur_buf_af_face&/8*hauteur_buf_af_face&*plan_systeme& image_buf_af%=@prendre(taille_fic%,TRUE,3) ' s%=image_buf_face% sl&=largeur_buf_af_face& sh&=hauteur_buf_af_face& d%=image_buf_af% dl&=largeur_buf_af_face& dh&=hauteur_buf_af_face& ' copy_raster_transparent(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,0,0,PRED(sl&),PRED(sh&),0,0,PRED(dl&),PRED(dh&)) ELSE ' taille_fic%=largeur_buf_af_dos&/8*hauteur_buf_af_dos&*plan_systeme& image_buf_af%=@prendre(taille_fic%,TRUE,3) ' s%=image_buf_dos% sl&=largeur_buf_af_dos& sh&=hauteur_buf_af_dos& d%=image_buf_af% dl&=largeur_buf_af_dos& dh&=hauteur_buf_af_dos& ' inverse_image_h(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&) ENDIF image_fond|=1 CASE vue_de_dos| IF image_flg_dos! ' taille_fic%=largeur_buf_af_dos&/8*hauteur_buf_af_dos&*plan_systeme& image_buf_af%=@prendre(taille_fic%,TRUE,3) ' s%=image_buf_dos% sl&=largeur_buf_af_dos& sh&=hauteur_buf_af_dos& d%=image_buf_af% dl&=largeur_buf_af_dos& dh&=hauteur_buf_af_dos& ' copy_raster_transparent(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,0,0,PRED(sl&),PRED(sh&),0,0,PRED(dl&),PRED(dh&)) ELSE ' taille_fic%=largeur_buf_af_face&/8*hauteur_buf_af_face&*plan_systeme& image_buf_af%=@prendre(taille_fic%,TRUE,3) ' s%=image_buf_face% sl&=largeur_buf_af_face& sh&=hauteur_buf_af_face& d%=image_buf_af% dl&=largeur_buf_af_face& dh&=hauteur_buf_af_face& ' inverse_image_h(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&) ENDIF image_fond|=2 CASE vue_de_droite| IF image_flg_droite! ' taille_fic%=largeur_buf_af_droite&/8*hauteur_buf_af_droite&*plan_systeme& image_buf_af%=@prendre(taille_fic%,TRUE,3) ' s%=image_buf_droite% sl&=largeur_buf_af_droite& sh&=hauteur_buf_af_droite& d%=image_buf_af% dl&=largeur_buf_af_droite& dh&=hauteur_buf_af_droite& ' copy_raster_transparent(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,0,0,PRED(sl&),PRED(sh&),0,0,PRED(dl&),PRED(dh&)) ELSE ' taille_fic%=largeur_buf_af_gauche&/8*hauteur_buf_af_gauche&*plan_systeme& image_buf_af%=@prendre(taille_fic%,TRUE,3) ' s%=image_buf_gauche% sl&=largeur_buf_af_gauche& sh&=hauteur_buf_af_gauche& d%=image_buf_af% dl&=largeur_buf_af_gauche& dh&=hauteur_buf_af_gauche& ' inverse_image_h(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&) ENDIF image_fond|=3 CASE vue_de_gauche| IF image_flg_gauche! ' taille_fic%=largeur_buf_af_gauche&/8*hauteur_buf_af_gauche&*plan_systeme& image_buf_af%=@prendre(taille_fic%,TRUE,3) ' s%=image_buf_gauche% sl&=largeur_buf_af_gauche& sh&=hauteur_buf_af_gauche& d%=image_buf_af% dl&=largeur_buf_af_gauche& dh&=hauteur_buf_af_gauche& ' copy_raster_transparent(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,0,0,PRED(sl&),PRED(sh&),0,0,PRED(dl&),PRED(dh&)) ELSE ' taille_fic%=largeur_buf_af_droite&/8*hauteur_buf_af_droite&*plan_systeme& image_buf_af%=@prendre(taille_fic%,TRUE,3) ' s%=image_buf_droite% sl&=largeur_buf_af_droite& sh&=hauteur_buf_af_droite& d%=image_buf_af% dl&=largeur_buf_af_droite& dh&=hauteur_buf_af_droite& ' inverse_image_h(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&) ENDIF image_fond|=4 CASE vue_de_dessus| IF image_flg_dessus! ' taille_fic%=largeur_buf_af_dessus&/8*hauteur_buf_af_dessus&*plan_systeme& image_buf_af%=@prendre(taille_fic%,TRUE,3) ' s%=image_buf_dessus% sl&=largeur_buf_af_dessus& sh&=hauteur_buf_af_dessus& d%=image_buf_af% dl&=largeur_buf_af_dessus& dh&=hauteur_buf_af_dessus& ' copy_raster_transparent(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,0,0,PRED(sl&),PRED(sh&),0,0,PRED(dl&),PRED(dh&)) ELSE ' taille_fic%=largeur_buf_af_dessous&/8*hauteur_buf_af_dessous&*plan_systeme& image_buf_af%=@prendre(taille_fic%,TRUE,3) ' s%=image_buf_dessous% sl&=largeur_buf_af_dessous& sh&=hauteur_buf_af_dessous& d%=image_buf_af% dl&=largeur_buf_af_dessous& dh&=hauteur_buf_af_dessous& ' inverse_image_v(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&) ENDIF image_fond|=5 CASE vue_de_dessous| IF image_flg_dessous! ' taille_fic%=largeur_buf_af_dessous&/8*hauteur_buf_af_dessous&*plan_systeme& image_buf_af%=@prendre(taille_fic%,TRUE,3) ' s%=image_buf_dessous% sl&=largeur_buf_af_dessous& sh&=hauteur_buf_af_dessous& d%=image_buf_af% dl&=largeur_buf_af_dessous& dh&=hauteur_buf_af_dessous& ' copy_raster_transparent(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,0,0,PRED(sl&),PRED(sh&),0,0,PRED(dl&),PRED(dh&)) ELSE ' taille_fic%=largeur_buf_af_dessus&/8*hauteur_buf_af_dessus&*plan_systeme& image_buf_af%=@prendre(taille_fic%,TRUE,3) ' s%=image_buf_dessus% sl&=largeur_buf_af_dessus& sh&=hauteur_buf_af_dessus& d%=image_buf_af% dl&=largeur_buf_af_dessus& dh&=hauteur_buf_af_dessus& ' inverse_image_v(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&) ENDIF image_fond|=6 ENDSELECT ELSE $S|,S> SELECT image_fond| CASE 1,2 IF image_flg_face! sl&=largeur_buf_af_face& sh&=hauteur_buf_af_face& ELSE sl&=largeur_buf_af_dos& sh&=hauteur_buf_af_dos& ENDIF CASE 3,4 IF image_flg_droite! sl&=largeur_buf_af_droite& sh&=hauteur_buf_af_droite& ELSE sl&=largeur_buf_af_gauche& sh&=hauteur_buf_af_gauche& ENDIF CASE 5,6 IF image_flg_dessus! sl&=largeur_buf_af_dessus& sh&=hauteur_buf_af_dessus& ELSE sl&=largeur_buf_af_dessous& sh&=hauteur_buf_af_dessous& ENDIF ENDSELECT ENDIF ' xf&=SUB(origx&,SHR(sl&,1)) yf&=SUB(origy&,SHR(sh&,1)) wf&=sl& hf&=sh& cx&=xf& cy&=yf& cw&=wf& ch&=hf& ' IF RC_INTERSECT(zx&,zy&,zw&,zh&,cx&,cy&,cw&,ch&) poser_image_de_fond(cx&,cy&,cw&,ch&,xf&,yf&,wf&,hf&,origx&,origy&,sl&,sh&) ENDIF ' ENDIF ' ENDIF ' RETURN > PROCEDURE redraw_elem(arb%,obj&) ! Un ‚l‚ment … redessiner. C'est ici LOCAL x&,y&,w&,h&,ob& objc_offset(arb%,obj&,x&,y&) w&=OB_W(arb%,obj&) h&=OB_H(arb%,obj&) ' Pour pr‚venir les SHADOWS et les objets 3D du nouveau GEM, ‚largir le REDRAW ' de 3 pixels tout autour. ' objc_draw(arb%,0,12,x&-3,y&-3,w&+6,h&+6,-1) objc_draw(arb%,0,12,x&,y&,w&,h&,-1) RETURN > PROCEDURE redraw_element_fenetre(index&,adr_arb%,obj&) LOCAL rx&,ry&,rw&,rh&,rdx&,rdy&,rdw&,rdh& LOCAL zx&,zy&,zw&,zh&,rep& ' ' Coordonn‚es rectangle … redessiner objc_offset(adr_arb%,obj&,rdx&,rdy&) rdw&=OB_W(adr_arb%,obj&) rdh&=OB_H(adr_arb%,obj&) ' ' Demande les coord. et dimensions du 1ø rectangle de la liste ~@wind_get(INT{ADD(hwind%,index&)},wf_firstxywh&,rx&,ry&,rw&,rh&) DO ' Si intersection des deux zones IF RC_INTERSECT(rdx&,rdy&,rdw&,rdh&,rx&,ry&,rw&,rh&) objc_draw(@arbre_ressource(SHR(index&,1)),0,12,rx&,ry&,rw&,rh&,-1) ENDIF ' Rectangle suivant rep&=@wind_get(INT{ADD(hwind%,index&)},wf_nextxywh&,rx&,ry&,rw&,rh&) EXIT IF (rw&<1) OR (rh&<1) OR (rep&=0) ! Tant que largeur ou hauteur... LOOP ! et pas d'erreur ' RETURN > PROCEDURE affiche_image_auteur(rx&,ry&,rw&,rh&) LOCAL zx&,zy&,zw&,zh& ' objc_draw(@arbre_ressource(idx_auteur&),0,12,rx&,ry&,rw&,rh&,-1) ' objc_offset(adr_auteur%,img_moi&,zx&,zy&) zw&=OB_W(adr_auteur%,img_moi&) zh&=OB_H(adr_auteur%,img_moi&) IF PRED(ADD(zx&,zw&))>xmax& zw&=SUB(zw&,SUB(PRED(ADD(zx&,zw&)),xmax&)) ENDIF IF PRED(ADD(zy&,zh&))>ymax& zh&=SUB(global_hf&,SUB(PRED(ADD(zy&,zh&)),ymax&)) ENDIF ' IF RC_INTERSECT(rx&,ry&,rw&,rh&,zx&,zy&,zw&,zh&) objc_draw(@arbre_ressource(idx_auteur&),img_moi&,0,zx&,zy&,zw&,zh&,-1) auteur_vers_ecran(zx&,zy&,zw&,zh&) ENDIF ' RETURN > PROCEDURE redraw_icones_de_vue ! Quelques ic“nes … redessiner redraw_element_fenetre(idx_outils_dbl&,adr_outils%,iface&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,idos&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,igauche&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,idroite&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,ihaut&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,ibas&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,ifil&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,ifaces&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,iplein&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,izmoins&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,izplus&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,izsouris&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,iztotal&) redraw_element_fenetre(idx_outils_dbl&,adr_outils%,izcentre&) RETURN > PROCEDURE mettre_a_jour_les_redraws(xw&,yw&,ww&,hh&,de!) ! On d‚saturer le GEM LOCAL evt& DO evt&=@evnt_multi(&X110011,258,3,0,0,0,0,1,1,0,0,0,1,1,buf%,5,global_mx&,global_my&,global_mk&,kbd&,key&,click&) IF (INT{buf%}=wm_redraw&) AND (evt& AND &X10000) redraw(xw&,yw&,ww&,hh&,de!) ENDIF LOOP WHILE (evt& AND &X10000) RETURN > PROCEDURE mise_a_la_taille_fenetre_de_vue ! On ajuste le ressource LOCAL mth& LOCAL limite_larg_min&,limite_haut_min& LOCAL limite_larg_max&,limite_haut_max& LOCAL xf&,yf&,wf&,hf& ' ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,xf&,yf&,wf&,hf&) ' ' Le fond OB_X(adr_fenetre%,fenvue00&)=xf& OB_Y(adr_fenetre%,fenvue00&)=yf& OB_W(adr_fenetre%,fenvue00&)=wf& OB_H(adr_fenetre%,fenvue00&)=hf& OB_W(adr_fenetre%,fenvu00b&)=PRED(wf&) OB_H(adr_fenetre%,fenvu00b&)=PRED(hf&) ' La ligne d'information OB_W(adr_fenetre%,fenvue06&)=SUB(OB_W(adr_fenetre%,fenvu00b&),4) ' L'ic“ne FULLER OB_X(adr_fenetre%,fenvue05&)=SUB(PRED(ADD(OB_X(adr_fenetre%,fenvu00b&),OB_W(adr_fenetre%,fenvu00b&))),18) ' L'ic“ne XCLOSED OB_X(adr_fenetre%,fenvue03&)=SUB(OB_X(adr_fenetre%,fenvue05&),18) ' L'ic“ne XREDUCTED OB_X(adr_fenetre%,fenvue04&)=SUB(OB_X(adr_fenetre%,fenvue03&),18) ' L'ic“ne grille de la fenˆtre de vue OB_X(adr_fenetre%,fenvue24&)=SUB(OB_X(adr_fenetre%,fenvue04&),18) ' L'ic“ne triple vue OB_X(adr_fenetre%,fenvue23&)=SUB(OB_X(adr_fenetre%,fenvue24&),30) ' La barre de deplacement XMOVED OB_W(adr_fenetre%,fenvue02&)=SUB(OB_W(adr_fenetre%,fenvu00b&),124) OB_W(adr_fenetre%,fenvue2b&)=PRED(OB_W(adr_fenetre%,fenvue02&)) ' La zone de dessin OB_W(adr_fenetre%,fenvue07&)=SUB(OB_W(adr_fenetre%,fenvu00b&),17) OB_H(adr_fenetre%,fenvue07&)=SUB(OB_H(adr_fenetre%,fenvu00b&),60) ' IF trois_vue! OB_W(adr_fenetre%,fenvue07&)=SHL(SHR(DIV(OB_W(adr_fenetre%,fenvue07&),2),2),2) OB_H(adr_fenetre%,fenvue07&)=DIV(OB_H(adr_fenetre%,fenvue07&),2) OB_W(adr_fenetre%,fenvue27&)=OB_W(adr_fenetre%,fenvue07&) OB_H(adr_fenetre%,fenvue27&)=OB_H(adr_fenetre%,fenvue07&) OB_W(adr_fenetre%,fenvue37&)=OB_W(adr_fenetre%,fenvue07&) OB_H(adr_fenetre%,fenvue37&)=OB_H(adr_fenetre%,fenvue07&) ' IF utilise_opengl! ' OB_W(adr_fenetre%,fenvue47&)=MUL(DIV(OB_W(adr_fenetre%,fenvue07&),64),64) ' OB_H(adr_fenetre%,fenvue47&)=MUL(DIV(OB_W(adr_fenetre%,fenvue07&),64),48) ' ELSE OB_W(adr_fenetre%,fenvue47&)=OB_W(adr_fenetre%,fenvue07&) OB_H(adr_fenetre%,fenvue47&)=OB_H(adr_fenetre%,fenvue07&) ' ENDIF OB_X(adr_fenetre%,fenvue27&)=ADD(OB_X(adr_fenetre%,fenvue07&),OB_W(adr_fenetre%,fenvue07&)) OB_X(adr_fenetre%,fenvue37&)=OB_X(adr_fenetre%,fenvue07&) OB_Y(adr_fenetre%,fenvue37&)=ADD(OB_Y(adr_fenetre%,fenvue07&),OB_H(adr_fenetre%,fenvue07&)) OB_X(adr_fenetre%,fenvue47&)=OB_X(adr_fenetre%,fenvue27&) OB_Y(adr_fenetre%,fenvue47&)=OB_Y(adr_fenetre%,fenvue37&) ob_state(adr_fenetre%,fenvue27&,aes_hidetree&,FALSE) ob_state(adr_fenetre%,fenvue37&,aes_hidetree&,FALSE) ob_state(adr_fenetre%,fenvue47&,aes_hidetree&,FALSE) ' limite_larg_min&=DIV(OB_W(adr_fenetre%,fenvue07&),6) limite_haut_min&=DIV(OB_H(adr_fenetre%,fenvue07&),6) limite_larg_max&=ADD(OB_W(adr_fenetre%,fenvue07&),MUL(5,DIV(OB_W(adr_fenetre%,fenvue07&),6))) limite_haut_max&=ADD(OB_H(adr_fenetre%,fenvue07&),MUL(5,DIV(OB_H(adr_fenetre%,fenvue07&),6))) ' WHILE SUB(OB_W(adr_fenetre%,fenvue07&),dif_fx&)limite_larg_max& INC dif_fx& WEND WHILE SUB(OB_H(adr_fenetre%,fenvue07&),dif_fy&)>limite_haut_max& INC dif_fy& WEND ' OB_X(adr_fenetre%,fenvue27&)=SUB(OB_X(adr_fenetre%,fenvue27&),dif_fx&) OB_X(adr_fenetre%,fenvue47&)=SUB(OB_X(adr_fenetre%,fenvue47&),dif_fx&) OB_Y(adr_fenetre%,fenvue37&)=SUB(OB_Y(adr_fenetre%,fenvue37&),dif_fy&) OB_Y(adr_fenetre%,fenvue47&)=SUB(OB_Y(adr_fenetre%,fenvue47&),dif_fy&) ' OB_W(adr_fenetre%,fenvue07&)=SUB(OB_W(adr_fenetre%,fenvue07&),dif_fx&) OB_W(adr_fenetre%,fenvue37&)=SUB(OB_W(adr_fenetre%,fenvue37&),dif_fx&) OB_W(adr_fenetre%,fenvue27&)=ADD(OB_W(adr_fenetre%,fenvue27&),dif_fx&) OB_W(adr_fenetre%,fenvue47&)=ADD(OB_W(adr_fenetre%,fenvue47&),dif_fx&) OB_W(adr_fenetre%,fenvue47&)=SHL(SHR(OB_W(adr_fenetre%,fenvue47&),2),2) ' OB_H(adr_fenetre%,fenvue07&)=SUB(OB_H(adr_fenetre%,fenvue07&),dif_fy&) OB_H(adr_fenetre%,fenvue27&)=SUB(OB_H(adr_fenetre%,fenvue27&),dif_fy&) OB_H(adr_fenetre%,fenvue37&)=ADD(OB_H(adr_fenetre%,fenvue37&),dif_fy&) OB_H(adr_fenetre%,fenvue47&)=ADD(OB_H(adr_fenetre%,fenvue47&),dif_fy&) ELSE ' IF utilise_opengl! ' OB_W(adr_fenetre%,fenvue07&)=MUL(DIV(OB_W(adr_fenetre%,fenvue07&),64),64) ' OB_H(adr_fenetre%,fenvue07&)=MUL(DIV(OB_W(adr_fenetre%,fenvue07&),64),48) ' ELSE OB_W(adr_fenetre%,fenvue07&)=SHL(SHR(OB_W(adr_fenetre%,fenvue07&),2),2) ' ENDIF OB_W(adr_fenetre%,fenvue27&)=1 OB_H(adr_fenetre%,fenvue27&)=1 OB_W(adr_fenetre%,fenvue37&)=1 OB_H(adr_fenetre%,fenvue37&)=1 OB_H(adr_fenetre%,fenvue47&)=1 OB_W(adr_fenetre%,fenvue47&)=1 ob_state(adr_fenetre%,fenvue27&,aes_hidetree&,TRUE) ob_state(adr_fenetre%,fenvue37&,aes_hidetree&,TRUE) ob_state(adr_fenetre%,fenvue47&,aes_hidetree&,TRUE) ENDIF ' ' L'ascenceur vertical OB_X(adr_fenetre%,fenvue08&)=SUB(SUCC(wf&),19) OB_H(adr_fenetre%,fenvue08&)=SUB(OB_H(adr_fenetre%,fenvu00b&),60) ' La flŠche vers le bas OB_Y(adr_fenetre%,fenvue20&)=SUB(OB_H(adr_fenetre%,fenvue08&),16) ' Les ic“nes de contraintes d'axes OB_Y(adr_fenetre%,fenlib_x&)=SUB(SUCC(hf&),19) OB_Y(adr_fenetre%,fenlib_y&)=SUB(SUCC(hf&),19) OB_Y(adr_fenetre%,fenlib_z&)=SUB(SUCC(hf&),19) ' L'ascenceur horizontal OB_Y(adr_fenetre%,fenvue13&)=SUB(SUCC(hf&),19) OB_W(adr_fenetre%,fenvue13&)=SUB(OB_W(adr_fenetre%,fenvu00b&),113) ' La flŠche vers la droite OB_X(adr_fenetre%,fenvue22&)=SUB(OB_W(adr_fenetre%,fenvue13&),16) ' L'ic“ne de hi‚rarchie OB_X(adr_fenetre%,fenhiera&)=SUB(SUCC(wf&),67) OB_Y(adr_fenetre%,fenhiera&)=SUB(SUCC(hf&),19) ' L'ic“ne de taille OB_X(adr_fenetre%,fenvue18&)=SUB(SUCC(wf&),19) OB_Y(adr_fenetre%,fenvue18&)=SUB(SUCC(hf&),19) sliders ! Mise en place des ascenceurs ' IF trois_vue! calcul_la_zone_clippe(xf&,yf&,SHL(OB_W(adr_fenetre%,fenvue07&),1),SHL(OB_H(adr_fenetre%,fenvue07&),1),mix&,miy&) ELSE calcul_la_zone_clippe(xf&,yf&,OB_W(adr_fenetre%,fenvue07&),OB_H(adr_fenetre%,fenvue07&),mix&,miy&) ENDIF ' RETURN > PROCEDURE mise_a_la_taille_fenetre_d_anime(d!) ! On ajuste la fenˆtre LOCAL xf&,yf&,wf&,hf& ' IF d! ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,xf&,yf&,wf&,hf&) SUB global_hf&,OB_H(adr_animation%,0) ' wind_set(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,xf&,yf&,wf&,hf&) mise_a_la_taille_fenetre_de_vue tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE tri_2d!=FALSE redessin_deja_fait!=FALSE ' ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,xf&,yf&,wf&,hf&) ' ADD xf&,4 SUB wf&,2 ADD yf&,hf& hf&=OB_H(adr_animation%,0) wind_set(INT{ADD(hwind%,idx_animation_dbl&)},wf_currxywh&,xf&,yf&,wf&,hf&) ' Le fond de la fenˆtre OB_X(adr_animation%,0)=xf& OB_Y(adr_animation%,0)=yf& OB_W(adr_animation%,0)=wf& OB_H(adr_animation%,0)=hf& OB_W(adr_animation%,1)=PRED(wf&) OB_H(adr_animation%,1)=PRED(hf&) ' La barre de d‚placement OB_W(adr_animation%,3)=SUB(wf&,64) OB_W(adr_animation%,4)=PRED(OB_W(adr_animation%,3)) ' Bouton de mise en barre global_xf&=ADD(ADD(OB_X(adr_animation%,3),OB_W(adr_animation%,3)),2) OB_X(adr_animation%,5)=xf& ' Bouton de fermeture OB_X(adr_animation%,6)=ADD(OB_X(adr_animation%,5),18) ' Barre du curseur OB_W(adr_animation%,anime002&)=SUB(SUB(wf&,OB_X(adr_animation%,anime002&)),10) ' Echelle de temps OB_W(adr_animation%,anime004&)=OB_W(adr_animation%,anime002&) OB_W(adr_animation%,anime005&)=PRED(OB_W(adr_animation%,anime004&)) ' OB_H(adr_animation%,anime006&)=SUB(SUB(hf&,OB_Y(adr_animation%,anime006&)),10) OB_H(adr_animation%,anime007&)=PRED(OB_H(adr_animation%,anime006&)) ' Emplacement des ‚l‚ments OB_W(adr_animation%,anime008&)=OB_W(adr_animation%,anime002&) OB_H(adr_animation%,anime008&)=OB_H(adr_animation%,anime006&) OB_W(adr_animation%,anime009&)=PRED(OB_W(adr_animation%,anime008&)) OB_H(adr_animation%,anime009&)=OB_H(adr_animation%,anime007&) ' Ic“ne de redimentionnement OB_X(adr_animation%,anime010&)=SUB(wf&,16) OB_Y(adr_animation%,anime010&)=SUB(hf&,16) ' La barre de commande OB_X(adr_animation%,anime011&)=SUB(ADD(OB_X(adr_animation%,anime002&),DIV(OB_W(adr_animation%,anime002&),2)),DIV(OB_W(adr_animation%,anime011&),2)) ' ELSE ~@wind_get(INT{ADD(hwind%,idx_outils_dbl&)},wf_currxywh&,xf&,yf&,wf&,hf&) ' Calcul de la position de la fenˆtre de vue ' par rapport … la boŒte … outils ~@wind_get(INT{ADD(hwind%,idx_outils_dbl&)},wf_currxywh&,xf&,yf&,wf&,hf&) xf&=SHL(SHR(ADD(ADD(xf&,wf&),2),2),2) yf&=yf& wf&=SUB(xmax&,xf&) hf&=SUB(ymax&,yf&) wind_set(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,xf&,yf&,wf&,hf&) ' mise_a_la_taille_fenetre_de_vue tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE tri_2d!=FALSE redessin_deja_fait!=FALSE ENDIF IF multitache! redraw_force(idx_vue&,idx_animation&) ENDIF ' RETURN > PROCEDURE resize_fenetre_d_anime ! On ajuste le ressource aussi LOCAL xf&,yf&,wf&,hf& ' ~@wind_get(INT{ADD(hwind%,idx_animation_dbl&)},wf_currxywh&,xf&,yf&,wf&,hf&) ' Le fond de la fenˆtre OB_X(adr_animation%,0)=xf& OB_Y(adr_animation%,0)=yf& OB_W(adr_animation%,0)=wf& OB_H(adr_animation%,0)=hf& OB_W(adr_animation%,1)=PRED(wf&) OB_H(adr_animation%,1)=PRED(hf&) ' La barre de d‚placement OB_W(adr_animation%,3)=SUB(wf&,64) OB_W(adr_animation%,4)=PRED(OB_W(adr_animation%,3)) ' Bouton de mise en barre xf&=ADD(ADD(OB_X(adr_animation%,3),OB_W(adr_animation%,3)),2) OB_X(adr_animation%,5)=xf& ' Bouton de fermeture OB_X(adr_animation%,6)=ADD(OB_X(adr_animation%,5),18) ' Barre du curseur OB_W(adr_animation%,anime002&)=SUB(SUB(wf&,OB_X(adr_animation%,anime002&)),10) ' Echelle de temps OB_W(adr_animation%,anime004&)=OB_W(adr_animation%,anime002&) OB_W(adr_animation%,anime005&)=PRED(OB_W(adr_animation%,anime004&)) ' OB_H(adr_animation%,anime006&)=SUB(SUB(hf&,OB_Y(adr_animation%,anime006&)),10) OB_H(adr_animation%,anime007&)=PRED(OB_H(adr_animation%,anime006&)) ' Emplacement des ‚l‚ments OB_W(adr_animation%,anime008&)=OB_W(adr_animation%,anime002&) OB_H(adr_animation%,anime008&)=OB_H(adr_animation%,anime006&) OB_W(adr_animation%,anime009&)=PRED(OB_W(adr_animation%,anime008&)) OB_H(adr_animation%,anime009&)=OB_H(adr_animation%,anime007&) ' Ic“ne de redimentionnement OB_X(adr_animation%,anime010&)=SUB(wf&,16) OB_Y(adr_animation%,anime010&)=SUB(hf&,16) ' La barre de commande OB_X(adr_animation%,anime011&)=SUB(ADD(OB_X(adr_animation%,anime002&),DIV(OB_W(adr_animation%,anime002&),2)),DIV(OB_W(adr_animation%,anime011&),2)) ' RETURN > FUNCTION clique_centre_4_vues ! Tiens, on veut changer les tailles LOCAL fex0&,fey0&,few0&,feh0& LOCAL fex1&,fey1&,few1&,feh1& LOCAL fex2&,fey2&,few2&,feh2& LOCAL rgx&,rgy& ' la_fenetre(fenvue07&,fex0&,fey0&,few0&,feh0&) ' la_fenetre(fenvue27&,fex1&,fey1&,few1&,feh1&) ' la_fenetre(fenvue37&,fex2&,fey2&,few2&,feh2&) ' IF global_mx&=>SUB(PRED(ADD(fex0&,few0&)),5) AND global_mx&<=ADD(fex1&,5) IF global_my&=>SUB(PRED(ADD(fey0&,feh0&)),5) AND global_my&<=ADD(fey2&,5) RETURN TRUE ENDIF ENDIF ' RETURN FALSE ENDFUNC > PROCEDURE change_taille_des_vues ! AH! oui, on les change. LOCAL fex0&,fey0&,few0&,feh0& LOCAL fex1&,fey1&,few1&,feh1& LOCAL fex2&,fey2&,few2&,feh2& LOCAL rgx&,rgy& ' set_writing_mode(mode_transparent|) ecran_vers_buffer ' la_fenetre(fenvue07&,fex0&,fey0&,few0&,feh0&) ' la_fenetre(fenvue27&,fex1&,fey1&,few1&,feh1&) ' la_fenetre(fenvue37&,fex2&,fey2&,few2&,feh2&) ' place_le_clipping(fex0&,fey0&,ADD(few0&,few1&),ADD(feh0&,feh2&),rgx&,rgy&) set_type_de_ligne(jaune&,1,0,0,0,-1) ' IF true_color! BYTE{ADD(tracer_param_axe%,1)}=255 ! Jaune en TRUE COLOR BYTE{ADD(tracer_param_axe%,2)}=255 BYTE{ADD(tracer_param_axe%,3)}=0 ELSE {tracer_param_axe%}=jaune& ENDIF {ADD(tracer_param_axe%,4)}=jaune& ! couleur du contour ' {ADD(tracer_trace_tab%,16)}=coord_polygon% {ADD(tracer_trace_tab%,30)}=physique% {coord_polygon%}=0 {ADD(coord_polygon%,4)}=tracer_param_axe% ' rgx&=global_mx& rgy&=global_my& ' global_amx&=-1 global_amy&=-1 ' WHILE global_mk&=1 graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) ' IF ((global_mx&<>global_amx&) OR (global_my&<>global_amy&)) buffer_vers_ecran(global_xf&,global_yf&,global_wf&,global_hf&) ' INT{ADD(coord_polygon%,8)}=fex0& INT{ADD(coord_polygon%,10)}=global_my& INT{ADD(coord_polygon%,12)}=PRED(ADD(fex0&,ADD(few0&,few1&))) INT{ADD(coord_polygon%,14)}=global_my& draw_line(tracer_trace_tab%) ' INT{ADD(coord_polygon%,8)}=global_mx& INT{ADD(coord_polygon%,10)}=fey0& INT{ADD(coord_polygon%,12)}=global_mx& INT{ADD(coord_polygon%,14)}=PRED(ADD(fey0&,ADD(feh0&,feh2&))) draw_line(tracer_trace_tab%) ' global_amx&=global_mx& global_amy&=global_my& ' ENDIF WEND ' SUB dif_fx&,SUB(global_mx&,rgx&) SUB dif_fy&,SUB(global_my&,rgy&) ' IF true_color! BYTE{ADD(tracer_param_axe%,1)}=0 ! Noir en TRUE COLOR BYTE{ADD(tracer_param_axe%,2)}=0 BYTE{ADD(tracer_param_axe%,3)}=0 ELSE {tracer_param_axe%}=noir& ENDIF {ADD(tracer_param_axe%,4)}=noir& ! couleur du contour ' enleve_le_clipping(fex0&,fey0&,ADD(few0&,few1&),ADD(feh0&,feh2&),rgx&,rgy&) set_writing_mode(mode_remplace|) ' RETURN > PROCEDURE videsouris ! Elle bouge trop celle l…. LOCAL evt& graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) EXIT IF global_mk&=0 ! Attendre bouton souris relach‚ LOOP IF NOT flag_aes_mctrl! DO evt&=@evnt_multi(&X110011,258,3,0,0,0,0,1,1,0,0,0,1,1,buf%,5,global_mx&,global_my&,global_mk&,kbd&,key&,click&) LOOP WHILE (evt& AND &X10000) ENDIF RETURN > PROCEDURE vider_les_sources ! On vide toutes les sources LOCAL adr_sr%,fin_s% fin_s%=@adresse_source(nombre_de_source&) adr_sr%=source% DO BYTE{adr_sr%}=0 ! Inactive BYTE{ADD(adr_sr%,1)}=BCLR(BYTE{ADD(adr_sr%,1)},bit_spot|) BYTE{ADD(adr_sr%,1)}=BCLR(BYTE{ADD(adr_sr%,1)},bit_surface|) BYTE{ADD(adr_sr%,1)}=BCLR(BYTE{ADD(adr_sr%,1)},bit_objet_lie|) BYTE{ADD(adr_sr%,1)}=BCLR(BYTE{ADD(adr_sr%,1)},bit_cylindre|) BYTE{ADD(adr_sr%,1)}=BCLR(BYTE{ADD(adr_sr%,1)},bit_attenuation|) BYTE{ADD(adr_sr%,1)}=BCLR(BYTE{ADD(adr_sr%,1)},bit_shadowless|) BYTE{ADD(adr_sr%,1)}=BSET(BYTE{ADD(adr_sr%,1)},bit_atmosphere|) INT{ADD(adr_sr%,48)}=35 ! Radius INT{ADD(adr_sr%,50)}=45 ! Falloff INT{ADD(adr_sr%,52)}=10 ! Stighness INT{ADD(adr_sr%,54)}=-1 ! Objet li‚ BYTE{ADD(adr_sr%,57)}=1 ! Fade_Power type 1 ADD adr_sr%,taille_source& LOOP WHILE adr_sr% PROCEDURE couleur_et_trame(ro&,ve&,bl&,VAR pre_cou1&,pre_cou2&,pre_tra1%,pre_tra2%,pre_tra3%) LOCAL pour&,tr_sat&,tr_cou&,ctte&,csat&,clum& ' rvb_tsl(ro&,ve&,bl&,ctte&,csat&,clum&) ' ' ---------------------------- Force du tramage ------------------------------ pre_tra1%=ADD(trame%,SHL(SUB(255,clum&),5)) ' ---------------------------- Quantit‚ de couleur --------------------------- pour&=ROUND(SQR(MUL(clum&,csat&))*0.3921) tr_sat&=(clum&*pour&)/100 pre_tra2%=ADD(trame%,SHL(tr_sat&,5)) ' ---------------------------- Teinte principale ----------------------------- $S&,$S> SELECT ctte& CASE 0 TO 42 pre_cou1&=rouge& CASE 43 TO 85 pre_cou1&=jaune& CASE 86 TO 127 pre_cou1&=vert& CASE 128 TO 170 pre_cou1&=cyan& CASE 171 TO 212 pre_cou1&=bleu& CASE 213 TO 255 pre_cou1&=violet& ENDSELECT ' Teinte secondaire $S&,$S> SELECT ctte& CASE 0 TO 42 pre_cou2&=jaune& pour&=ROUND(ctte&*2.3809) CASE 43 TO 85 pre_cou2&=vert& pour&=ROUND(SUB(ctte&,42)*2.3255) CASE 86 TO 127 pre_cou2&=cyan& pour&=ROUND(SUB(ctte&,85)*2.3809) CASE 128 TO 170 pre_cou2&=bleu& pour&=ROUND(SUB(ctte&,127)*2.3255) CASE 171 TO 212 pre_cou2&=violet& pour&=ROUND(SUB(ctte&,170)*2.3809) CASE 213 TO 255 pre_cou2&=rouge& pour&=ROUND(SUB(ctte&,212)*2.3255) ENDSELECT ' tr_cou&=(SQR(MUL(tr_sat&,clum&))*pour&)/100 ' pre_tra3%=ADD(trame%,SHL(tr_cou&,5)) ' RETURN ' ****************************************************************************** ' Ah ! le virtuel, c'est g‚nial, surtout pour les redessins d'‚cran > PROCEDURE ecran_vers_buffer ! On sauve l'‚cran complet LOCAL ex&,ey&,ew&,eh& LOCAL d%,dl&,dh&,dp&,x11&,y11&,x21&,y21& ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_workxywh&,ex&,ey&,ew&,eh&) ' ************************* D‚finition du raster source ' C'est l'‚cran le GEM s'occupe de tout ' ************************* D‚finition du raster destination d%=redessin% ! L'adresse de l'image de l'‚cran dl&=SUCC(xmax&) ! Sa largeur (global_wf& pixels) dh&=SUCC(ymax&) ! Sa hauteur (global_hf& pixels) dp&=plan_systeme& ! Son nombre de plans (comme l'‚cran) ' ************************* Definition de la partie … d‚placer x11&=ex& ! Position X source y11&=ey& ! Position Y source x21&=0 ! Position X destination y21&=0 ! Position Y destination clip_raster(0,0,0,0,d%,dl&,dh&,dp&,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) RETURN > PROCEDURE buffer_vers_ecran(rx&,ry&,rw&,rh&) ! On restitue une zone de l'‚cran LOCAL ex&,ey&,ew&,eh& LOCAL s%,sl&,sh&,sp&,x11&,y11&,x21&,y21& ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_workxywh&,global_xf&,global_yf&,global_wf&,global_hf&) calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) ' ex&=rx& ey&=ry& ew&=SUCC(rw&) eh&=SUCC(rh&) ' ************************* D‚finition du raster source s%=redessin% ! L'adresse de l'image de l'‚cran sl&=SUCC(xmax&) ! Sa largeur (global_wf& pixels) sh&=SUCC(ymax&) ! Sa hauteur (global_hf& pixels) sp&=plan_systeme& ! Son nombre de plans (comme l'‚cran) ' ************************* D‚finition du raster destination ' C'est l'‚cran le GEM s'occupe de tout ' ************************* Definition de la partie … d‚placer x11&=SUB(rx&,global_xf&) ! Position X source y11&=SUB(ry&,global_yf&) ! Position Y source x21&=rx& ! Position X destination y21&=ry& ! Position Y destination clip_raster(s%,sl&,sh&,sp&,0,0,0,0,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) RETURN ' ' Allez, toujours du virtuel, mais pour le GOURAUD et le PHONG > PROCEDURE go_ph_vers_buffer ! On sauve l'‚cran de Gouraud/Phong LOCAL ex&,ey&,ew&,eh& LOCAL d%,dl&,dh&,dp&,x11&,y11&,x21&,y21& objc_offset(adr_vue_fine%,gourphon&,ex&,ey&) ew&=OB_W(adr_vue_fine%,gourphon&) eh&=OB_H(adr_vue_fine%,gourphon&) ' ************************* D‚finition du raster source ' C'est l'‚cran le GEM s'occupe de tout ' ************************* D‚finition du raster destination d%=ph_go_virtuel% ! L'adresse de l'image de l'‚cran dl&=ew& ! Sa largeur dh&=eh& ! Sa hauteur dp&=plan_systeme& ! Son nombre de plans (comme l'‚cran) ' ************************* Definition de la partie … d‚placer x11&=ex& ! Position X source y11&=ey& ! Position Y source x21&=0 ! Position X destination y21&=0 ! Position Y destination clip_raster(0,0,0,0,d%,dl&,dh&,dp&,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) RETURN > PROCEDURE buffer_vers_go_ph(rx&,ry&,rw&,rh&) ! On restitue une zone de l'‚cran LOCAL ex&,ey&,ew&,eh&,fx&,fy&,fw&,fh& LOCAL s%,sl&,sh&,sp&,x11&,y11&,x21&,y21& ' objc_offset(adr_vue_fine%,gourphon&,fx&,fy&) fw&=OB_W(adr_vue_fine%,gourphon&) fh&=OB_H(adr_vue_fine%,gourphon&) ' ex&=rx& ey&=ry& ew&=rw& eh&=rh& ' ************************* D‚finition du raster source s%=ph_go_virtuel% ! L'adresse de l'image de l'‚cran sl&=fw& ! Sa largeur sh&=fh& ! Sa hauteur sp&=plan_systeme& ! Son nombre de plans (comme l'‚cran) ' ************************* D‚finition du raster destination ' C'est l'‚cran le GEM s'occupe de tout ' ************************* Definition de la partie … d‚placer x11&=SUB(rx&,fx&) ! Position X source y11&=SUB(ry&,fy&) ! Position Y source x21&=rx& ! Position X destination y21&=ry& ! Position Y destination clip_raster(s%,sl&,sh&,sp&,0,0,0,0,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) RETURN ' ' Allez, une zolie image en fond d'‚cran pour d‚calquer un dessin > PROCEDURE poser_image_de_fond(rx&,ry&,rw&,rh&,global_xf&,global_yf&,global_wf&,global_hf&,origx&,origy&,ll&,hh&) LOCAL ex&,ey&,ew&,eh&,fx&,fy&,fw&,fh&,origx&,origy& LOCAL s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x11&,y11&,x21&,y21& ' la_fenetre(fen_act&,fx&,fy&,fw&,fh&) ' ex&=rx& ey&=ry& ew&=rw& eh&=rh& ' ************************* D‚finition du raster source s%=image_buf_af% ! L'adresse de l'image de l'‚cran sl&=ll& ! Sa largeur sh&=hh& ! Sa hauteur sp&=plan_systeme& ! Son nombre de plans (comme l'‚cran) ' ************************* D‚finition du raster destination CLR d%,dl&,dh&,dp& ! C'est l'‚cran le GEM s'occupe de tout ' ************************* Definition de la partie … d‚placer x11&=SUB(rx&,global_xf&) ! Position X source y11&=SUB(ry&,global_yf&) ! Position Y source x21&=rx& ! Position X destination y21&=ry& ! Position Y destination clip_raster(s%,sl&,sh&,sp&,0,0,0,0,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,7) ' RETURN ' ' Bien, on continue avec la photo de l'auteur (c'est moi) en couleur c'est mieux. > PROCEDURE auteur_vers_ecran(rx&,ry&,rw&,rh&) LOCAL ex&,ey&,ew&,eh&,global_xf&,global_yf&,global_wf&,fh& LOCAL s%,sl&,sh&,sp&,x11&,y11&,x21&,y21& ' objc_offset(adr_auteur%,img_moi&,global_xf&,global_yf&) global_wf&=OB_W(adr_auteur%,img_moi&) global_hf&=OB_H(adr_auteur%,img_moi&) ' ex&=rx& ey&=ry& ew&=rw& eh&=rh& ' ************************* D‚finition du raster source s%=auteur% ! L'adresse de l'image sl&=largeur_auteur& ! Sa largeur sh&=hauteur_auteur& ! Sa hauteur sp&=plan_systeme& ! Son nombre de plans (comme l'‚cran) ' ************************* D‚finition du raster destination ' C'est l'‚cran le GEM s'occupe de tout ' ************************* Definition de la partie … d‚placer x11&=SUB(rx&,global_xf&) ! Position X source y11&=SUB(ry&,global_yf&) ! Position Y source x21&=rx& ! Position X destination y21&=ry& ! Position Y destination clip_raster(s%,sl&,sh&,sp&,0,0,0,0,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) RETURN ' ' Allez, le jolie logo de lancement du programme... > PROCEDURE logo_eb3_vers_ecran(rx&,ry&,rw&,rh&) LOCAL ex&,ey&,ew&,eh& LOCAL s%,sl&,sh&,sp&,x11&,y11&,x21&,y21& ' ex&=rx& ey&=ry& ew&=rw& eh&=rh& ' ************************* D‚finition du raster source s%=presente% ! L'adresse de l'image sl&=largeur_presente& ! Sa largeur sh&=hauteur_presente& ! Sa hauteur sp&=plan_systeme& ! Son nombre de plans (comme l'‚cran) ' ************************* D‚finition du raster destination ' C'est l'‚cran le GEM s'occupe de tout ' ************************* Definition de la partie … d‚placer x11&=0 ! Position X source y11&=0 ! Position Y source x21&=rx& ! Position X destination y21&=ry& ! Position Y destination clip_raster(s%,sl&,sh&,sp&,0,0,0,0,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) RETURN ' ' Une superbe roue des couleurs > PROCEDURE roue_couleur_vers_ecran(rx&,ry&,rw&,rh&) LOCAL ex&,ey&,ew&,eh& LOCAL s%,sl&,sh&,sp&,x11&,y11&,x21&,y21& ' ex&=rx& ey&=ry& ew&=rw& eh&=rh& ' ************************* D‚finition du raster source s%=roue% ! L'adresse de l'image sl&=largeur_roue& ! Sa largeur sh&=hauteur_roue& ! Sa hauteur sp&=plan_systeme& ! Son nombre de plans (comme l'‚cran) ' ************************* D‚finition du raster destination ' C'est l'‚cran le GEM s'occupe de tout ' ************************* Definition de la partie … d‚placer x11&=0 ! Position X source y11&=0 ! Position Y source x21&=rx& ! Position X destination y21&=ry& ! Position Y destination clip_raster(s%,sl&,sh&,sp&,0,0,0,0,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) RETURN ' ' Une superbe roue des couleurs > PROCEDURE des_zolis_degrade_vers_ecran(nu&,rx&,ry&,rw&,rh&) LOCAL ex&,ey&,ew&,eh& LOCAL s%,sl&,sh&,sp&,x11&,y11&,x21&,y21& LOCAL adr%,ler&,hau& ' $S|,S> SELECT nu& CASE 0 adr%=degigris% lar&=largeur_degigris& hau&=hauteur_degigris& CASE 1 adr%=deg_gris% lar&=largeur_deg_gris& hau&=hauteur_deg_gris& CASE 2 adr%=deg_roug% lar&=largeur_deg_roug& hau&=hauteur_deg_roug& CASE 3 adr%=deg_vert% lar&=largeur_deg_vert& hau&=hauteur_deg_vert& CASE 4 adr%=deg_bleu% lar&=largeur_deg_bleu& hau&=hauteur_deg_bleu& ENDSELECT ' ex&=rx& ey&=ry& ew&=rw& eh&=rh& ' ************************* D‚finition du raster source s%=adr% ! L'adresse de l'image sl&=lar& ! Sa largeur sh&=hau& ! Sa hauteur sp&=plan_systeme& ! Son nombre de plans (comme l'‚cran) ' ************************* D‚finition du raster destination ' C'est l'‚cran le GEM s'occupe de tout ' ************************* Definition de la partie … d‚placer x11&=0 ! Position X source y11&=0 ! Position Y source x21&=rx& ! Position X destination y21&=ry& ! Position Y destination clip_raster(s%,sl&,sh&,sp&,0,0,0,0,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) RETURN ' ****************************************************************************** > PROCEDURE objet_actif(in!) ! Le nom de cet objet bien sur. LOCAL top&,temp&,univ%,ori_gx&,ori_gy&,x_&,y_&,w_&,h_& ' ~@wind_get(0,wf_top&,top&,temp&,temp&,temp&) temp&=@numero_fenetre(top&) IF temp&=24 IF @calcul_correction z_correction(adr_fenetre%,fen_act&) ENDIF ' IF in! afficher_coordonnees(FALSE) ENDIF position_objet_actif(in!) IF objets_a_deplacer&>0 univ%=activation% ELSE univ%=@adresse_objet(objet_actif&) ENDIF set_remplissage(2,8,noir&,-1) IF INT{univ%}=primitive_triangle& ' BMOVE ADD(deplace%,28),deplace%,4 ' BMOVE ADD(deplace%,28),ADD(deplace%,4),4 ' BMOVE ADD(deplace%,28),ADD(deplace%,8),4 ' BMOVE ADD(deplace%,28),ADD(deplace%,12),4 ' BMOVE ADD(deplace%,28),ADD(deplace%,16),4 ' BMOVE ADD(deplace%,28),ADD(deplace%,20),4 ' BMOVE ADD(deplace%,28),ADD(deplace%,24),4 ' BMOVE ADD(deplace%,28),ADD(deplace%,32),4 ' BMOVE ADD(deplace%,28),ADD(deplace%,36),4 ELSE ' Point de contr“le Haut Gauche boite_de_controle_souris(INT{deplace%},INT{ADD(deplace%,2)}) ' Point de contr“le Haut Milieu boite_de_controle_souris(INT{ADD(deplace%,4)},INT{ADD(deplace%,6)}) ' Point de contr“le Haut Droite boite_de_controle_souris(INT{ADD(deplace%,8)},INT{ADD(deplace%,10)}) ' Point de contr“le Milieu Gauche boite_de_controle_souris(INT{ADD(deplace%,12)},INT{ADD(deplace%,14)}) ' Point de contr“le Milieu Droite boite_de_controle_souris(INT{ADD(deplace%,16)},INT{ADD(deplace%,18)}) ' Point de contr“le Bas Gauche boite_de_controle_souris(INT{ADD(deplace%,20)},INT{ADD(deplace%,22)}) ' Point de contr“le Bas Milieu boite_de_controle_souris(INT{ADD(deplace%,24)},INT{ADD(deplace%,26)}) ' Point de contr“le Bas Droite boite_de_controle_souris(INT{ADD(deplace%,32)},INT{ADD(deplace%,34)}) ' Point de contr“le Haut Milieu Droite (Rotation) graf_mouse(m_off&,0) vdi_11(5,INT{ADD(deplace%,36)},INT{ADD(deplace%,38)},0,0,4,4,0,0) graf_mouse(m_on&,0) ENDIF ' IF FALSE ' ' Point de contr“le milieu milieu (d‚placement) ' boite_de_controle_souris(INT{ADD(deplace%,28)},INT{ADD(deplace%,30)}) ' ENDIF IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) AND controle_visible! AND objets_a_deplacer&=0 la_fenetre(fen_act&,x_&,y_&,w_&,h_&) ori_gx&=ADD(x_&,DIV(w_&,2)) ori_gy&=ADD(y_&,DIV(h_&,2)) dans_quelle_vue(ori_gx&,ori_gy&) point_de_controle_en_2d(dessin_3d|,univ%,ori_gx&,ori_gy&,TRUE) ENDIF ENDIF ' RETURN > PROCEDURE z_correction(adr_fen%,fen&) ' ************************************************************************** ' *** La je fixe les rapports sur X et Y pour un affichage plus r‚aliste *** ' *** les valeurs 508 et 399 sont la largeur et la hauteur de la zone *** ' *** de dessin en mode VGA 640x480. Tout les autres modes sont *** ' *** calcul‚s par rapport … cette dimension de fenˆtre. *** ' *** 05 05 2004 - Mettre un rapport de 1.33 pour 640/480 le rapport de *** ' *** POV et des appareils photo. *** ' ************************************************************************** z_correctionx%=(640/OB_W(adr_fen%,fen&))*1024 z_correctiony%=(480/OB_H(adr_fen%,fen&))*1024 RETURN > PROCEDURE boite_objet_actif(origx&,origy&) LOCAL i%,i_j&,fin_i_j&,tp1%,tp2%,tp3%,coord%,adr_fa% ' set_writing_mode(mode_transparent|) IF true_color! inquire_color_representation(jaune&,r&,v&,b&,vdihandle%) BYTE{ADD(tracer_param_tab%,1)}=r&*0.255 BYTE{ADD(tracer_param_tab%,2)}=v&*0.255 BYTE{ADD(tracer_param_tab%,3)}=b&*0.255 ELSE {tracer_param_tab%}=jaune& ENDIF CARD{ADD(tracer_param_tab%,8)}=1 ! Contour actif CARD{ADD(tracer_param_tab%,10)}=1 ! Tramage inactif CARD{tracer_trame_tab%}=&HE0E0 ' {ADD(tracer_trace_tab%,16)}=coord_polygon% {ADD(tracer_trace_tab%,30)}=physique% ' {ADD(tracer_proj2d%,16)}=tr_tmp% {ADD(tracer_proj2d%,28)}=vue_de_face| {ADD(tracer_proj2d%,32)}=origx& {ADD(tracer_proj2d%,36)}=origy& ' adr_fa%=@adresse_face(boite_active%) coord%=ADD(coord_polygon%,4) tp1%=tr_tmp% tp2%=ADD(tr_tmp%,12) tp3%=ADD(tr_tmp%,24) ' i%=ADD(adr_fa%,2) CLR i_j& DO {coord%}=tracer_param_tab% {ADD(tracer_proj2d%,20)}=ADD(coord%,4) ' BMOVE ADD(transfert%,MUL(INT{i%},12)),tp1%,12 BMOVE ADD(transfert%,MUL(INT{ADD(i%,2)},12)),tp2%,12 BMOVE ADD(transfert%,MUL(INT{ADD(i%,4)},12)),tp3%,12 ' c2d2d(tracer_proj2d%) ' ADD i%,6 ADD coord%,16 INC i_j& LOOP WHILE i_j&<12 {coord_polygon%}=12 draw_line(tracer_trace_tab%) ' set_writing_mode(mode_remplace|) ' RETURN > PROCEDURE info_supplementaire_objet_actif LOCAL univ% LOCAL xm,ym,zm,lm,hm,pm,rxm,rym,rzm univ%=@adresse_objet(objet_actif&) BYTE{ADD(ADD(univ%,offset_nom_objet&),21)}=0 CHAR{{OB_SPEC(adr_info_objet%,infobj00&)}}=LEFT$(CHAR{ADD(univ%,offset_nom_objet&)}+SPACE$(20),20) CHAR{{OB_SPEC(adr_info_objet%,infobj01&)}}=@nom_objet$(objet_actif&,FALSE) xm=SINGLE{ADD(univ%,2)} ym=SINGLE{ADD(univ%,6)} zm=SINGLE{ADD(univ%,10)} CHAR{{OB_SPEC(adr_info_objet%,infobj02&)}}=STR$(xm,9,2) CHAR{{OB_SPEC(adr_info_objet%,infobj03&)}}=STR$(ym,9,2) CHAR{{OB_SPEC(adr_info_objet%,infobj04&)}}=STR$(zm,9,2) lm=SINGLE{ADD(univ%,14)} hm=SINGLE{ADD(univ%,18)} pm=SINGLE{ADD(univ%,22)} CHAR{{OB_SPEC(adr_info_objet%,infobj05&)}}=STR$(lm,9,2) CHAR{{OB_SPEC(adr_info_objet%,infobj06&)}}=STR$(hm,9,2) CHAR{{OB_SPEC(adr_info_objet%,infobj07&)}}=STR$(pm,9,2) rxm=SINGLE{ADD(univ%,26)} rym=SINGLE{ADD(univ%,30)} rzm=SINGLE{ADD(univ%,34)} CHAR{{OB_SPEC(adr_info_objet%,infobj08&)}}=STR$(rxm,9,2) CHAR{{OB_SPEC(adr_info_objet%,infobj09&)}}=STR$(rym,9,2) CHAR{{OB_SPEC(adr_info_objet%,infobj10&)}}=STR$(rzm,9,2) redraw_element_fenetre(52,adr_info_objet%,infobj00&) redraw_element_fenetre(52,adr_info_objet%,infobj01&) redraw_element_fenetre(52,adr_info_objet%,infobj02&) redraw_element_fenetre(52,adr_info_objet%,infobj03&) redraw_element_fenetre(52,adr_info_objet%,infobj04&) redraw_element_fenetre(52,adr_info_objet%,infobj05&) redraw_element_fenetre(52,adr_info_objet%,infobj06&) redraw_element_fenetre(52,adr_info_objet%,infobj07&) redraw_element_fenetre(52,adr_info_objet%,infobj08&) redraw_element_fenetre(52,adr_info_objet%,infobj09&) redraw_element_fenetre(52,adr_info_objet%,infobj10&) RETURN > PROCEDURE position_objet_actif(in!) LOCAL i_j&,j&,pt&,i%,j%,max_pt&,max_ct& LOCAL ori_gx&,ori_gy& LOCAL x_f&,y_f& LOCAL univ%,adr% LOCAL nx&,ny& LOCAL lw&,lh& LOCAL trx&,try& LOCAL minx&,miny&,mrx& LOCAL maxx&,maxy&,temp&,top& LOCAL ranx,rany,ranz LOCAL panx,pany,panz LOCAL tanx,tany,tanz LOCAL lar,hau,pro,milx,mily,milz,minx,miny,minz,maxx,maxy,maxz LOCAL tx,ty,tz LOCAL fin_i& LOCAL fin_i% ' {zoo%}=zoom% {ADD(zoo%,4)}=z_correctionx% {ADD(zoo%,8)}=zoom% {ADD(zoo%,12)}=z_correctiony% ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) ori_gx&=mix& ori_gy&=miy& ' ' La, on donne le nombre de points et de faces d'une boŒte pour afficher ' le "BOUNDING_BOX" de l'objet actif IF objets_a_deplacer&>0 univ%=activation% IF NOT calcul_selection_multiple! CLR i_j& DO CARD{ADD(effacement%,SHL(CARD{ADD(deplacement_multiple%,SHL(i_j&,1))},1))}=1 INC i_j& LOOP WHILE i_j& SELECT dessin_3d| CASE vue_de_face| RESTORE actif_pour_vue_face CASE vue_de_dos| RESTORE actif_pour_vue_dos CASE vue_de_gauche| RESTORE actif_pour_vue_gauche CASE vue_de_droite| RESTORE actif_pour_vue_droite CASE vue_de_dessus| RESTORE actif_pour_vue_haut CASE vue_de_dessous| RESTORE actif_pour_vue_bas ENDSELECT CLR j& j%=transfert% DO READ tx,ty,tz {j%}=tx*1024 {ADD(j%,4)}=ty*1024 {ADD(j%,8)}=tz*1024 ADD j%,12 INC j& LOOP WHILE j&<10 IF INT{univ%}=primitive_triangle& pour_triangle_active(univ%,panx,pany,panz,tanx,tany,tanz) CLR ranx,rany,ranz ELSE panx=SINGLE{ADD(univ%,2)} pany=SINGLE{ADD(univ%,6)} panz=SINGLE{ADD(univ%,10)} tanx=SINGLE{ADD(univ%,14)} tany=SINGLE{ADD(univ%,18)} tanz=SINGLE{ADD(univ%,22)} ranx=SINGLE{ADD(univ%,26)} rany=SINGLE{ADD(univ%,30)} ranz=SINGLE{ADD(univ%,34)} ENDIF matrice_zyx(-ranx,-rany,-ranz,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=tanx {ADD(matrice%,4)}=tany {ADD(matrice%,8)}=tanz {ADD(tracer_rotattrans%,32)}=10 {ADD(tracer_rotattrans%,36)}=panx*1024 {ADD(tracer_rotattrans%,40)}=pany*1024 {ADD(tracer_rotattrans%,44)}=panz*1024 ro_tr(tracer_rotattrans%) rotation_pour_vue_2d(10) ' {ADD(tracer_proj2d%,20)}=tr_tmp% {ADD(tracer_proj2d%,28)}=vue_de_face| {ADD(tracer_proj2d%,32)}=ori_gx& {ADD(tracer_proj2d%,36)}=ori_gy& ' CLR j& j%=transfert% i%=deplace% DO {ADD(tracer_proj2d%,16)}=j% c2d2d(tracer_proj2d%) BMOVE tr_tmp%,i%,4 ADD j%,12 ADD i%,4 INC j& LOOP WHILE j&<10 ' actif_pour_vue_face: DATA -1,1,0 DATA 0,1,0 DATA 1,1,0 DATA -1,-1,0 DATA 0,-1,0 DATA 1,-1,0 DATA -1,0,0 DATA 0,0,0 DATA 1,0,0 DATA 0.5,1,0 actif_pour_vue_dos: DATA 1,1,0 DATA 0,1,0 DATA -1,1,0 DATA 1,-1,0 DATA 0,-1,0 DATA -1,-1,0 DATA 1,0,0 DATA 0,0,0 DATA -1,0,0 DATA -0.5,1,0 actif_pour_vue_gauche: DATA 0,1,1 DATA 0,1,0 DATA 0,1,-1 DATA 0,-1,1 DATA 0,-1,0 DATA 0,-1,-1 DATA 0,0,1 DATA 0,0,0 DATA 0,0,-1 DATA 0,1,-0.5 actif_pour_vue_droite: DATA 0,1,-1 DATA 0,1,0 DATA 0,1,1 DATA 0,-1,-1 DATA 0,-1,0 DATA 0,-1,1 DATA 0,0,-1 DATA 0,0,0 DATA 0,0,1 DATA 0,1,0.5 actif_pour_vue_haut: DATA -1,0,1 DATA 0,0,1 DATA 1,0,1 DATA -1,0,-1 DATA 0,0,-1 DATA 1,0,-1 DATA -1,0,0 DATA 0,0,0 DATA 1,0,0 DATA 0.5,0,1 actif_pour_vue_bas: DATA -1,0,-1 DATA 0,0,-1 DATA 1,0,-1 DATA -1,0,1 DATA 0,0,1 DATA 1,0,1 DATA -1,0,0 DATA 0,0,0 DATA 1,0,0 DATA 0.5,0,-1 ' RETURN > PROCEDURE boite_de_controle_souris(nx&,ny&) graf_mouse(m_off&,0) vdi_11(1,SUB(nx&,2),SUB(ny&,2),ADD(nx&,2),ADD(ny&,2),0,0,0,0) graf_mouse(m_on&,0) RETURN ' ------------------------------------------------------------------------------ > PROCEDURE deplacer_un_element(num&,ind!,type&) LOCAL xm,ym,acx,acy,acz,memx&,memy&,force!,sort_fen! LOCAL origx&,origy&,mem_des!,mem_fen&,mem_mod| LOCAL xf_&,yf_&,wf_&,hf_&,a_mx&,a_my&,x_f&,y_f& LOCAL distx,disty,distz,optimise! LOCAL zx&,zy&,zw&,zh&,mem_x%,mem_y% LOCAL s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x11&,y11&,x12&,y12&,x21&,y21&,x22&,y22& LOCAL adr_sr%,univ% LOCAL coef1,coef2,centre_objetx&,centre_objety&,dx,dy,j&,obj&,mrx& LOCAL univ%,px,py,pz,mpx,mpy,mpz LOCAL phi,ang_av,aphi ' retire_centrage ' IF trois_vue! la_fenetre(fenvue47&,zx&,zy&,zw&,zh&) mix&=ADD(zx&,DIV(zw&,2)) miy&=ADD(zy&,DIV(zh&,2)) x_f&=PRED(ADD(zx&,zw&)) y_f&=PRED(ADD(zy&,zh&)) IF x_f&>xmax& zw&=SUB(zw&,SUB(x_f&,xmax&)) ENDIF IF y_f&>ymax& zh&=SUB(zh&,SUB(y_f&,ymax&)) ENDIF IF NOT utilise_opengl! objc_draw(adr_fenetre%,fenvue47&,0,zx&,zy&,zw&,zh&,-1) ENDIF ENDIF ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) IF @calcul_correction z_correction(adr_fenetre%,fen_act&) ENDIF place_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& dans_quelle_vue(origx&,origy&) ' $S|,S> SELECT type& CASE type_camera& distx=SINGLE{ADD(camera%,12)}-SINGLE{camera%} disty=SINGLE{ADD(camera%,16)}-SINGLE{ADD(camera%,4)} distz=SINGLE{ADD(camera%,20)}-SINGLE{ADD(camera%,8)} acx=9999 acy=9999 acz=9999 CASE type_lumiere& adr_sr%=@adresse_source(source_active&) distx=ROUND(SINGLE{ADD(adr_sr%,20)},3)-ROUND(SINGLE{ADD(adr_sr%,8)},3) disty=ROUND(SINGLE{ADD(adr_sr%,24)},3)-ROUND(SINGLE{ADD(adr_sr%,12)},3) distz=ROUND(SINGLE{ADD(adr_sr%,28)},3)-ROUND(SINGLE{ADD(adr_sr%,16)},3) acx=99999999.999 acy=99999999.999 acz=99999999.999 CASE type_objet& ' La, on donne le nombre de points et de faces d'une boŒte pour afficher ' le "BOUNDING_BOX" de l'objet actif IF objets_a_deplacer&>0 univ%=activation% ELSE univ%=@adresse_objet(objet_actif&) ENDIF ' ! Position de l'objet dans l'univers px=SINGLE{ADD(univ%,2)} py=SINGLE{ADD(univ%,6)} pz=SINGLE{ADD(univ%,10)} mpx=px mpy=py mpz=pz CASE type_poignees& ' Point central de l'objet centre_objetx&=INT{ADD(deplace%,28)} centre_objety&=INT{ADD(deplace%,30)} ' ' La, on donne le nombre de points et de faces d'une boŒte pour afficher ' le "BOUNDING_BOX" de l'objet actif adr_face%=@adresse_face(boite_active%) IF objets_a_deplacer&>0 univ%=activation% ELSE univ%=@adresse_objet(objet_actif&) ENDIF ' $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| coef1=SINGLE{ADD(univ%,18)}/SINGLE{ADD(univ%,14)} coef2=SINGLE{ADD(univ%,22)}/SINGLE{ADD(univ%,14)} CASE vue_de_gauche|,vue_de_droite| coef1=SINGLE{ADD(univ%,18)}/SINGLE{ADD(univ%,22)} coef2=SINGLE{ADD(univ%,14)}/SINGLE{ADD(univ%,22)} CASE vue_de_dessus|,vue_de_dessous| coef1=SINGLE{ADD(univ%,22)}/SINGLE{ADD(univ%,14)} coef2=SINGLE{ADD(univ%,18)}/SINGLE{ADD(univ%,14)} ENDSELECT CASE type_rotation& ' ' La, on donne le nombre de points et de faces d'une boŒte pour afficher ' le "BOUNDING_BOX" de l'objet actif adr_face%=@adresse_face(boite_active%) univ%=@adresse_objet(objet_actif&) de_reel_vers_vue(boite_active%,univ%,8,FALSE,FALSE) ' px=SINGLE{ADD(univ%,2)} py=SINGLE{ADD(univ%,6)} pz=SINGLE{ADD(univ%,10)} afficher_coordonnees(FALSE) dans_quelle_vue(origx&,origy&) rotation_pour_vue_2d(8) ' Point central de l'objet centre_objetx&=INT{ADD(deplace%,28)} centre_objety&=INT{ADD(deplace%,30)} ' Point de rotation en X mrx&=INT{ADD(deplace%,36)} ' IF objets_a_deplacer&>0 univ%=activation% $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| ang_av=SINGLE{ADD(univ%,34)} MOD 180 ! Rz CASE vue_de_droite|,vue_de_gauche| ang_av=SINGLE{ADD(univ%,26)} MOD 180 ! Rx CASE vue_de_dessus|,vue_de_dessous| ang_av=SINGLE{ADD(univ%,30)} MOD 180 ! Ry ENDSELECT ELSE univ%=@adresse_objet(objet_actif&) $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| ang_av=SINGLE{ADD(univ%,34)} MOD 180 ! Rz CASE vue_de_droite|,vue_de_gauche| ang_av=SINGLE{ADD(univ%,26)} MOD 180 ! Rx CASE vue_de_dessus|,vue_de_dessous| ang_av=SINGLE{ADD(univ%,30)} MOD 180 ! Ry ENDSELECT ENDIF ' ' aphi : correspond … la diff‚rence qui existe entre l'angle calcul‚ ' et l'angle r‚‚l. Diff‚rence venant de la position d‚sax‚e de la ' poign‚e de rotation ' $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_gauche|,vue_de_dessus| aphi=@calcul_angle(centre_objetx&,centre_objety&)-ang_av CASE vue_de_dos|,vue_de_droite|,vue_de_dessous| aphi=(-@calcul_angle(centre_objetx&,centre_objety&))-ang_av ENDSELECT ' ENDSELECT ' memx&=global_mx& memy&=global_my& mem_mod|=dessin_3d| {zoo%}=zoom% {ADD(zoo%,4)}=z_correctionx% {ADD(zoo%,8)}=zoom% {ADD(zoo%,12)}=z_correctiony% optimise!=@test_touche_morte(TRUE,FALSE,FALSE,FALSE) IF trois_vue! AND optimise! mem_des!=dessin_rapide! dessin_rapide!=TRUE ENDIF ' pose_camera(dessin_3d|) calcul_des_angles_univer ' ecran_vers_buffer ' global_mk&=1 sort_fen!=FALSE WHILE global_mk&=1 graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) IF grille_vue! global_mx&=MUL(DIV(global_mx&,pas_grille&),pas_grille&) global_my&=MUL(DIV(global_my&,pas_grille&),pas_grille&) ENDIF $S|,S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| IF liberte_x! global_mx&=memx& ENDIF IF liberte_y! global_my&=memy& ENDIF CASE vue_de_gauche|,vue_de_droite| IF liberte_z! global_mx&=memx& ENDIF IF liberte_y! global_my&=memy& ENDIF CASE vue_de_dessus|,vue_de_dessous| IF liberte_x! global_mx&=memx& ENDIF IF liberte_z! global_my&=memy& ENDIF ENDSELECT IF ((global_mx&<>a_mx&) OR (global_my&<>a_my&)) buffer_vers_ecran(global_xf&,global_yf&,global_wf&,global_hf&) ' ========================================================================== ' Gestion du scrol lors de l'arriv‚e sur les bords de la fenˆtre force!=FALSE IF global_mx&global_xf2& ' Limite droite atteinte deplacement_au_clavier(0,FALSE) force!=TRUE ENDIF IF global_my&>global_yf2& ' Limite bas atteinte deplacement_au_clavier(3,FALSE) force!=TRUE ENDIF IF (NOT force!) AND sort_fen! objc_draw(adr_fenetre%,fen_act&,0,global_xf&,global_yf&,global_wf&,global_hf&,-1) dessin_des_axes_simples $S|,S> SELECT type& CASE type_camera& pose_source_de_lumiere(dessin_3d|) CASE type_lumiere& pose_camera(dessin_3d|) CASE type_objet& CASE type_poignees& CASE type_rotation& ENDSELECT ecran_vers_buffer sort_fen!=FALSE ELSE IF force! AND (NOT sort_fen!) sort_fen!=TRUE tri_2d!=FALSE ENDIF ' ========================================================================== {zoo%}=zoom% {ADD(zoo%,4)}=z_correctionx% {ADD(zoo%,8)}=zoom% {ADD(zoo%,12)}=z_correctiony% IF type&<>type_rotation& enleve_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) afficher_coordonnees(FALSE) place_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& ENDIF set_polyline_color_index(blanc&) dans_quelle_vue(origx&,origy&) ecran_vers_univers(global_mx&,global_my&,xm,ym) IF force! IF type&<>type_rotation& enleve_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) afficher_coordonnees(TRUE) place_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& ENDIF dessin_des_axes_simples $S|,S> SELECT type& CASE type_camera& pose_source_de_lumiere(dessin_3d|) CASE type_lumiere& pose_camera(dessin_3d|) CASE type_objet& CASE type_poignees& CASE rotation& ENDSELECT ENDIF ' $S|,S> SELECT type& CASE type_camera& $S|,S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| ' X+ … droite Y+ en haut ' X+ … gauche Y+ en haut IF ind! SINGLE{camera%}=xm SINGLE{ADD(camera%,4)}=ym IF point_vise_lie! SINGLE{ADD(camera%,12)}=SINGLE{camera%}+distx SINGLE{ADD(camera%,16)}=SINGLE{ADD(camera%,4)}+disty ENDIF ELSE SINGLE{ADD(camera%,12)}=xm SINGLE{ADD(camera%,16)}=ym ENDIF CASE vue_de_gauche|,vue_de_droite| ' Z+ … gauche Y+ en haut ' Z+ … droite Y+ en haut IF ind! SINGLE{ADD(camera%,8)}=xm SINGLE{ADD(camera%,4)}=ym IF point_vise_lie! SINGLE{ADD(camera%,20)}=SINGLE{ADD(camera%,8)}+distz SINGLE{ADD(camera%,16)}=SINGLE{ADD(camera%,4)}+disty ENDIF ELSE SINGLE{ADD(camera%,20)}=xm SINGLE{ADD(camera%,16)}=ym ENDIF CASE vue_de_dessus|,vue_de_dessous| ' Vue de haut X+ … droite Z+ en haut ' Vue de bas X+ … droite Z+ en bas IF ind! SINGLE{camera%}=xm SINGLE{ADD(camera%,8)}=ym IF point_vise_lie! SINGLE{ADD(camera%,12)}=SINGLE{camera%}+distx SINGLE{ADD(camera%,20)}=SINGLE{ADD(camera%,8)}+distz ENDIF ELSE SINGLE{ADD(camera%,12)}=xm SINGLE{ADD(camera%,20)}=ym ENDIF ENDSELECT pose_camera(dessin_3d|) calcul_des_angles_univer CASE type_lumiere& $S|,S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| ' X+ … droite Y+ en haut ' X+ … gauche Y+ en haut IF ind! SINGLE{ADD(adr_sr%,8)}=xm SINGLE{ADD(adr_sr%,12)}=ym IF point_vise_lie! SINGLE{ADD(adr_sr%,20)}=ROUND(SINGLE{ADD(adr_sr%,8)},3)+distx SINGLE{ADD(adr_sr%,24)}=ROUND(SINGLE{ADD(adr_sr%,12)},3)+disty ENDIF ELSE SINGLE{ADD(adr_sr%,20)}=xm SINGLE{ADD(adr_sr%,24)}=ym ENDIF CASE vue_de_gauche|,vue_de_droite| ' Z+ … gauche Y+ en haut ' Z+ … droite Y+ en haut IF ind! SINGLE{ADD(adr_sr%,12)}=ym SINGLE{ADD(adr_sr%,16)}=xm IF point_vise_lie! SINGLE{MUL(adr_sr%,24)}=ROUND(SINGLE{ADD(adr_sr%,12)},3)+disty SINGLE{ADD(adr_sr%,28)}=ROUND(SINGLE{ADD(adr_sr%,16)},3)+distz ENDIF ELSE SINGLE{ADD(adr_sr%,24)}=ym SINGLE{ADD(adr_sr%,28)}=xm ENDIF CASE vue_de_dessus|,vue_de_dessous| ' X+ … droite Z+ en haut ' X+ … droite Z+ en bas IF ind! SINGLE{ADD(adr_sr%,8)}=xm SINGLE{ADD(adr_sr%,16)}=ym IF point_vise_lie! SINGLE{ADD(adr_sr%,20)}=ROUND(SINGLE{ADD(adr_sr%,8)},3)+distx SINGLE{ADD(adr_sr%,28)}=ROUND(SINGLE{ADD(adr_sr%,16)},3)+distz ENDIF ELSE SINGLE{ADD(adr_sr%,20)}=xm SINGLE{ADD(adr_sr%,28)}=ym ENDIF ENDSELECT affiche_source_lumiere(source_active&,dessin_3d|) acx=ROUND(SINGLE{ADD(adr_sr%,8)},3) acy=ROUND(SINGLE{ADD(adr_sr%,12)},3) acz=ROUND(SINGLE{ADD(adr_sr%,16)},3) CASE type_objet& nouvelle_position_objet_actif(global_mx&,global_my&,univ%,mix&,miy&,kbd&) objet_actif(TRUE) CASE type_poignees& ' dx=MUL(SUB(global_mx&,centre_objetx&),1024)/zoom% dy=MUL(SUB(global_my&,centre_objety&),1024)/zoom% change_taille_objet(univ%,num1,dx,dy,coef1,coef2) ' objet_actif(TRUE) IF carreaux_visible! AND objets_a_deplacer&=0 IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) afficher_les_points_bicubic(univ%,FALSE) recupere_les_points_bicubic(univ%) modif_bez!=TRUE generation_de_bicubic redessine_le_carreaux_en_direct ENDIF ENDIF ' CASE type_rotation& ' $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_gauche|,vue_de_dessus| phi=@calcul_angle(centre_objetx&,centre_objety&)-aphi CASE vue_de_dos|,vue_de_droite|,vue_de_dessous| phi=@calcul_angle(centre_objetx&,centre_objety&)+aphi ENDSELECT ' modification_de_l_angle(univ%,phi) objet_actif(FALSE) position_objet_actif(TRUE) ' set_type_de_ligne(jaune&,1,0,0,0,-1) line(centre_objetx&,centre_objety&,global_mx&,global_my&) $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_gauche|,vue_de_dessus| CHAR{{OB_SPEC(adr_fenetre%,fenvue06&)}}=" Angle : "+STR$(phi,8,3) CASE vue_de_dos|,vue_de_droite|,vue_de_dessous| CHAR{{OB_SPEC(adr_fenetre%,fenvue06&)}}=" Angle : "+STR$(-phi,8,3) ENDSELECT enleve_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) redraw_element_fenetre(48,adr_fenetre%,fenvue06&) place_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& ' ENDSELECT ' IF (trois_vue!) AND (NOT optimise!) enleve_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) mem_mod|=dessin_3d| mem_fen&=fen_act& mem_x%=z_correctionx% mem_y%=z_correctiony% fen_act&=fenvue47& z_correction(adr_fenetre%,fen_act&) dessin_3d|=vue_en_3d| ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) buffer_vers_ecran(global_xf&,global_yf&,global_wf&,global_hf&) la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) ' place_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& dans_quelle_vue(origx&,origy&) ' tri_fi!=FALSE trait!=FALSE ' ' IF utilise_opengl! ' trace_3d_plein!=FALSE ' dernier_plein!=TRUE ' face_pleine!=TRUE ' trait!=TRUE ' ENDIF ' ' buffer_vers_ecran(global_xf&,global_yf&,global_wf&,global_hf&) dessin_generale(physique%,global_xf&,global_yf&,global_wf&,global_hf&) enleve_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) ' fen_act&=mem_fen& z_correctionx%=mem_x% z_correctiony%=mem_y% dessin_3d|=mem_mod| ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) place_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& dans_quelle_vue(origx&,origy&) ' acx=xm acy=ym acz=zm ENDIF ' a_mx&=global_mx& a_my&=global_my& ~XBIOS(&H25) ENDIF WEND IF trois_vue! AND optimise! dessin_rapide!=mem_des! ENDIF travail_a_sauver!=TRUE modif_normale!=FALSE enleve_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) ' $S|,S> SELECT type& CASE type_poignees& IF objets_a_deplacer&>0 CLR j& DO obj&=CARD{ADD(deplacement_multiple%,SHL(j&,1))} univ%=@adresse_objet(obj&) IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) afficher_les_points_bicubic(univ%,FALSE) recupere_les_points_bicubic(univ%) modif_bez!=TRUE generation_de_bicubic ENDIF recalcul_2d_pour_l_ecran(physique%,univ%,FALSE) INC j& LOOP WHILE j&0 copie_selection_multiple(distx,disty,distz) redraw_force(24,24) ELSE copie_reference!=FALSE copie_d_objet(0,0,0,0,0,0,0,0,0,0,0,0,distx,disty,distz,1,1,1,1,1) CLR debut_texture&,debut_couleur& CLR debut_liste_csg&,debut_liste_eff& CLR debut_popup_choix&,debut_popup_lum& redessin_deja_fait!=FALSE trace_3d_plein!=FALSE redimention!=FALSE tri_2d!=FALSE tri_3d!=FALSE tri_fi!=FALSE redraw_force(24,24) ENDIF ELSE IF objets_a_deplacer&>0 deplace_selection_multiple(px,py,pz) redraw_force(24,24) ELSE recalcul_2d_pour_l_ecran(physique%,univ%,TRUE) ENDIF ENDIF CASE type_rotation& IF objets_a_deplacer&>0 recherche_de_l_angle(activation%,phi,ranx,rany,ranz) tourner_selection_multiple(-ranx,-rany,-ranz) redraw_force(24,24) ENDIF modif_normale!=TRUE recalcul_2d_pour_l_ecran(physique%,@adresse_objet(objet_actif&),TRUE) travail_a_sauver!=TRUE DEFAULT tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE redessin_deja_fait!=FALSE redraw_force(24,24) ENDSELECT ' RETURN ' .............................................................................. > PROCEDURE deplace_selection_multiple(px,py,pz) LOCAL j&,obj&,univ2%,mem_act& LOCAL nx,ny,nz,disx,disy,disz LOCAL adr_poi%,fin_adr%,adr_po% ' nx=SINGLE{ADD(activation%,2)} ny=SINGLE{ADD(activation%,6)} nz=SINGLE{ADD(activation%,10)} disx=nx-px disy=ny-py disz=nz-pz {ADD(tracer_transrotat%,36)}=disx*1024 {ADD(tracer_transrotat%,40)}=disy*1024 {ADD(tracer_transrotat%,44)}=disz*1024 CLR j& DO obj&=CARD{ADD(deplacement_multiple%,SHL(j&,1))} univ2%=@adresse_objet(obj&) IF INT{univ2%}=primitive_triangle& ' Premier point SINGLE{ADD(univ2%,2)}=SINGLE{ADD(univ2%,2)}+disx SINGLE{ADD(univ2%,6)}=SINGLE{ADD(univ2%,6)}+disy SINGLE{ADD(univ2%,10)}=SINGLE{ADD(univ2%,10)}+disz ' Second point SINGLE{ADD(univ2%,14)}=SINGLE{ADD(univ2%,14)}+disx SINGLE{ADD(univ2%,18)}=SINGLE{ADD(univ2%,18)}+disy SINGLE{ADD(univ2%,22)}=SINGLE{ADD(univ2%,22)}+disz ' TroisiŠme point SINGLE{ADD(univ2%,26)}=SINGLE{ADD(univ2%,26)}+disx SINGLE{ADD(univ2%,30)}=SINGLE{ADD(univ2%,30)}+disy SINGLE{ADD(univ2%,34)}=SINGLE{ADD(univ2%,34)}+disz ELSE SINGLE{ADD(univ2%,2)}=SINGLE{ADD(univ2%,2)}+disx SINGLE{ADD(univ2%,6)}=SINGLE{ADD(univ2%,6)}+disy SINGLE{ADD(univ2%,10)}=SINGLE{ADD(univ2%,10)}+disz calcul_et_dessin_en_2d(physique%,dessin_3d|,global_xf&,global_yf&,global_wf&,global_hf&,TRUE,obj&) ENDIF INC j& LOOP WHILE j& PROCEDURE nouvelle_position_objet_actif(soux&,souy&,univ%,origx&,origy&,kbd&) LOCAL adr_poi%,k%,fin_k%,adr_pt_ctrl% LOCAL nouveaux,nouveauy LOCAL disx,disy,disz,px,py,pz LOCAL tanx,tany,tanz LOCAL panx,pany,panz ' dans_quelle_vue(origx&,origy&) ecran_vers_univers(soux&,souy&,nouveaux,nouveauy) px=SINGLE{ADD(univ%,2)} py=SINGLE{ADD(univ%,6)} pz=SINGLE{ADD(univ%,10)} $S|,S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| ' X+ … droite Y+ en haut ' X+ … gauche Y+ en haut IF INT{univ%}=primitive_triangle& pour_triangle_active(univ%,panx,pany,panz,tanx,tany,tanz) disx=nouveaux-panx disy=nouveauy-pany SINGLE{ADD(univ%,2)}=SINGLE{ADD(univ%,2)}+disx SINGLE{ADD(univ%,14)}=SINGLE{ADD(univ%,14)}+disy SINGLE{ADD(univ%,26)}=SINGLE{ADD(univ%,26)}+disx SINGLE{ADD(univ%,6)}=SINGLE{ADD(univ%,6)}+disy SINGLE{ADD(univ%,18)}=SINGLE{ADD(univ%,18)}+disy SINGLE{ADD(univ%,30)}=SINGLE{ADD(univ%,30)}+disy ELSE SINGLE{ADD(univ%,2)}=nouveaux SINGLE{ADD(univ%,6)}=nouveauy ENDIF CASE vue_de_gauche|,vue_de_droite| ' Z+ … gauche Y+ en haut ' Z+ … droite Y+ en haut IF INT{univ%}=primitive_triangle& pour_triangle_active(univ%,panx,pany,panz,tanx,tany,tanz) disy=nouveauy-pany disz=nouveaux-panz SINGLE{ADD(univ%,6)}=SINGLE{ADD(univ%,6)}+disy SINGLE{ADD(univ%,18)}=SINGLE{ADD(univ%,18)}+disy SINGLE{ADD(univ%,30)}=SINGLE{ADD(univ%,30)}+disy SINGLE{ADD(univ%,10)}=SINGLE{ADD(univ%,10)}+disz SINGLE{ADD(univ%,22)}=SINGLE{ADD(univ%,22)}+disz SINGLE{ADD(univ%,34)}=SINGLE{ADD(univ%,34)}+disz ELSE SINGLE{ADD(univ%,10)}=nouveaux SINGLE{ADD(univ%,6)}=nouveauy ENDIF CASE vue_de_dessus|,vue_de_dessous| ' X+ … droite Z+ en haut ' X+ … droite Z+ en bas IF INT{univ%}=primitive_triangle& pour_triangle_active(univ%,panx,pany,panz,tanx,tany,tanz) disx=nouveaux-panx disz=nouveauy-panz SINGLE{ADD(univ%,2)}=SINGLE{ADD(univ%,2)}+disx SINGLE{ADD(univ%,14)}=SINGLE{ADD(univ%,14)}+disx SINGLE{ADD(univ%,26)}=SINGLE{ADD(univ%,26)}+disx SINGLE{ADD(univ%,10)}=SINGLE{ADD(univ%,10)}+disz SINGLE{ADD(univ%,22)}=SINGLE{ADD(univ%,22)}+disz SINGLE{ADD(univ%,34)}=SINGLE{ADD(univ%,34)}+disz ELSE SINGLE{ADD(univ%,2)}=nouveaux SINGLE{ADD(univ%,10)}=nouveauy ENDIF ENDSELECT RETURN > PROCEDURE deplacer_point_de_controle_a_la_souris(num&) LOCAL origx&,origy&,i% LOCAL force!,sort_fen! LOCAL memx&,memy& LOCAL univ% LOCAL adr_poi% LOCAL panx%,pany%,panz% ' ' retire_centrage ecran_vers_buffer ' $S&,$S> SELECT num& CASE 0 xpt&=0 ypt&=0 CASE 1 xpt&=1 ypt&=0 CASE 2 xpt&=2 ypt&=0 CASE 3 xpt&=3 ypt&=0 CASE 4 xpt&=0 ypt&=1 CASE 5 xpt&=1 ypt&=1 CASE 6 xpt&=2 ypt&=1 CASE 7 xpt&=3 ypt&=1 CASE 8 xpt&=0 ypt&=2 CASE 9 xpt&=1 ypt&=2 CASE 10 xpt&=2 ypt&=2 CASE 11 xpt&=3 ypt&=2 CASE 12 xpt&=0 ypt&=3 CASE 13 xpt&=1 ypt&=3 CASE 14 xpt&=2 ypt&=3 CASE 15 xpt&=3 ypt&=3 ENDSELECT ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& dans_quelle_vue(origx&,origy&) ' rotation_pour_vue_2d(8) ' memx&=global_mx& memy&=global_my& ' La, on donne le nombre de points et de faces d'une boŒte pour afficher ' le "BOUNDING_BOX" de l'objet actif univ%=@adresse_objet(objet_actif&) set_clipping_rectangle(1,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) afficher_les_points_bicubic(univ%,FALSE) ' deplace_point_de_controle!=TRUE adr_poi%=@adresse_point_control(CARD{ADD(univ%,offset_force_blob&)}) centre_point_control(adr_poi%,panx%,pany%,panz%) set_clipping_rectangle(0,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) {mem_num%}=panx% {ADD(mem_num%,4)}=pany% {ADD(mem_num%,8)}=panz% ' global_amx&=-1 global_amy&=-1 sort_fen!=FALSE global_mk&=1 WHILE global_mk&=1 graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) IF grille_vue! global_mx&=MUL(DIV(global_mx&,pas_grille&),pas_grille&) global_my&=MUL(DIV(global_my&,pas_grille&),pas_grille&) ENDIF $S|,S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| IF liberte_x! global_mx&=memx& ENDIF IF liberte_y! global_my&=memy& ENDIF CASE vue_de_gauche|,vue_de_droite| IF liberte_z! global_mx&=memx& ENDIF IF liberte_y! global_my&=memy& ENDIF CASE vue_de_dessus|,vue_de_dessous| IF liberte_x! global_mx&=memx& ENDIF IF liberte_z! global_my&=memy& ENDIF ENDSELECT ' ========================================================================== ' Gestion du scrol lors de l'arriv‚e sur les bords de la fenˆtre force!=FALSE IF global_mx&global_xf2& ' Limite droite atteinte deplacement_au_clavier(0,TRUE) force!=TRUE ENDIF IF global_my&>global_yf2& ' Limite bas atteinte deplacement_au_clavier(3,TRUE) force!=TRUE ENDIF IF (NOT force!) AND sort_fen! buffer_vers_ecran(global_xf&,global_yf&,global_wf&,global_hf&) set_clipping_rectangle(1,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) dessin_des_axes_simples pose_camera(dessin_3d|) pose_source_de_lumiere(dessin_3d|) set_clipping_rectangle(0,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) ecran_vers_buffer sort_fen!=FALSE ELSE IF force! AND (NOT sort_fen!) tri_2d!=FALSE sort_fen!=TRUE ENDIF ' ========================================================================== IF ((global_mx&<>global_amx&) OR (global_my&<>global_amy&)) OR force! IF force! redraw_elem(adr_fenetre%,fen_act&) ecran_vers_buffer ENDIF buffer_vers_ecran(global_xf&,global_yf&,global_wf&,global_hf&) ' ecran_vers_univers(global_mx&,global_my&,xm,ym) adr_poi%=@adresse_point_control(CARD{ADD(univ%,offset_force_blob&)}) adr_pt%=@adr_ctrl(adr_poi%,xpt&,ypt&) $S|,S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| ' X+ … droite Y+ en haut ' X+ … gauche Y+ en haut {adr_pt%}=xm*1024 {ADD(adr_pt%,4)}=ym*1024 CASE vue_de_gauche|,vue_de_droite| ' Z+ … gauche Y+ en haut ' Z+ … droite Y+ en haut {ADD(adr_pt%,8)}=xm*1024 {ADD(adr_pt%,4)}=ym*1024 CASE vue_de_dessus|,vue_de_dessous| ' Vue de haut X+ … droite Z+ en haut ' Vue de bas X+ … droite Z+ en bas {adr_pt%}=xm*1024 {ADD(adr_pt%,8)}=ym*1024 ENDSELECT IF carreaux_visible! modif_bez!=TRUE generation_de_bicubic redessine_le_carreaux_en_direct objet_actif(TRUE) ELSE point_de_controle_en_2d(dessin_3d|,univ%,origx&,origy&,FALSE) ENDIF ' IF force! afficher_coordonnees(TRUE) set_clipping_rectangle(1,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) dessin_des_axes_simples pose_camera(dessin_3d|) pose_source_de_lumiere(dessin_3d|) set_clipping_rectangle(0,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) ENDIF global_amx&=global_mx& global_amy&=global_my& ~XBIOS(&H25) ! VSYNC ENDIF WEND deplace_point_de_controle!=FALSE ' modif_bez!=TRUE generation_de_bicubic ' tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE travail_a_sauver!=TRUE redessin_deja_fait!=FALSE redraw_force(24,24) RETURN ' .............................................................................. > PROCEDURE deplacer_les_points_bicubic(uni_v%,disx,disy,disz) LOCAL adr_po%,fin_po% ' adr_po%=@adresse_point_control(CARD{ADD(uni_v%,offset_force_blob&)}) fin_po%=ADD(adr_po%,192) DO {adr_po%}=ROUND(({adr_po%}/1024)+disx,3)*1024 {ADD(adr_po%,4)}=ROUND(({ADD(adr_po%,4)}/1024)+disy,3)*1024 {ADD(adr_po%,8)}=ROUND(({ADD(adr_po%,8)}/1024)+disz,3)*1024 ' ADD adr_po%,12 LOOP WHILE adr_po% PROCEDURE modifie_taille_carreaux(uni_v%,coefx,coefy,coefz) LOCAL adr_po%,fin_po% LOCAL ax,ay,az LOCAL px,py,pz ' ax=SINGLE{ADD(uni_v%,2)} ay=SINGLE{ADD(uni_v%,6)} az=SINGLE{ADD(uni_v%,10)} adr_po%=@adresse_point_control(CARD{ADD(uni_v%,offset_force_blob&)}) fin_po%=ADD(adr_po%,192) DO {adr_po%}=ROUND(((({adr_po%}/1024)-ax)*coefx)+ax,3)*1024 {ADD(adr_po%,4)}=ROUND(((({ADD(adr_po%,4)}/1024)-ay)*coefy)+ay,3)*1024 {ADD(adr_po%,8)}=ROUND(((({ADD(adr_po%,8)}/1024)-az)*coefz)+az,3)*1024 ' ADD adr_po%,12 LOOP WHILE adr_po% PROCEDURE modifie_rotation_carreaux(univ%) LOCAL ax%,ay%,az%,adrpo% LOCAL rx,ry,rz LOCAL disx,disy,disz ' disx=ROUND(SINGLE{ADD(univ%,2)},3) disy=ROUND(SINGLE{ADD(univ%,6)},3) disz=ROUND(SINGLE{ADD(univ%,10)},3) deplacer_les_points_bicubic(univ%,-disx,-disy,-disz) adrpo%=@adresse_point_control(CARD{ADD(univ%,offset_force_blob&)}) bmove(adrpo%,transfert%,192) rx=ROUND(SINGLE{ADD(univ%,26)},3) ry=ROUND(SINGLE{ADD(univ%,30)},3) rz=ROUND(SINGLE{ADD(univ%,34)},3) matrice_zyx(-rx,-ry,-rz,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=2 {ADD(matrice%,4)}=2 {ADD(matrice%,8)}=2 {ADD(tracer_rotattrans%,32)}=16 {ADD(tracer_rotattrans%,36)}=1024 {ADD(tracer_rotattrans%,40)}=1024 {ADD(tracer_rotattrans%,44)}=1024 ro_tr(tracer_rotattrans%) bmove(transfert%,adrpo%,192) deplacer_les_points_bicubic(univ%,disx,disy,disz) RETURN ' .............................................................................. > PROCEDURE change_taille_objet(univ%,num&,dx,dy,coef1,coef2) LOCAL ancienx,ancieny,ancienz LOCAL nouveax,nouveay,nouveaz LOCAL coefx,coefy,coefz LOCAL j&,obj&,univ2% ' IF objets_a_deplacer&>0 $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| $S|,$S> SELECT num& CASE poignee_haut_gauche|,poignee_haut_droite|,poignee_bas_gauche|,poignee_bas_droite| IF BTST(kbd&,cl_control&) nouveax=ABS(dx*2) nouveay=ABS((dx*coef1)*2) ancienx=SINGLE{ADD(univ%,14)} ancieny=SINGLE{ADD(univ%,18)} IF (nouveax<>ancienx) OR (nouveay<>ancieny) SINGLE{ADD(univ%,14)}=nouveax SINGLE{ADD(univ%,18)}=nouveay coefx=nouveax/ancienx coefy=nouveay/ancieny change_taille_selection_multiple(coefx,coefy,1,univ%) ENDIF ELSE IF BTST(kbd&,cl_shift_gauche&) nouveax=ABS(dx*2) nouveay=ABS((dx*coef1)*2) nouveaz=ABS((dx*coef2)*2) ancienx=SINGLE{ADD(univ%,14)} ancieny=SINGLE{ADD(univ%,18)} ancieny=SINGLE{ADD(univ%,22)} IF (nouveax<>ancienx) OR (nouveay<>ancieny) OR (nouveaz<>ancienz) SINGLE{ADD(univ%,14)}=nouveax SINGLE{ADD(univ%,18)}=nouveay SINGLE{ADD(univ%,22)}=nouveaz coefx=nouveax/ancienx coefy=nouveay/ancieny coefz=nouveaz/ancienz change_taille_selection_multiple(coefx,coefy,coefz,univ%) ENDIF ELSE nouveax=ABS(dx) ' nouveax=ABS(dx*2) ' nouveay=ABS(dy*2) nouveay=ABS(dx*coef1) ancienx=SINGLE{ADD(univ%,14)} ancieny=SINGLE{ADD(univ%,18)} IF (nouveax<>ancienx) OR (nouveay<>ancieny) SINGLE{ADD(univ%,14)}=nouveax SINGLE{ADD(univ%,18)}=nouveay coefx=nouveax/ancienx coefy=nouveay/ancieny change_taille_selection_multiple(coefx,coefy,1,univ%) ENDIF ENDIF CASE poignee_haut_milieu|,poignee_bas_milieu| nouveay=ABS((dx+dy)*2) ! Nouvelle taille globale ancieny=SINGLE{ADD(univ%,18)} ! Ancienne taille globale IF nouveay<>ancieny SINGLE{ADD(univ%,18)}=nouveay coefy=nouveay/ancieny change_taille_selection_multiple(1,coefy,1,univ%) ENDIF CASE poignee_milieu_gauche|,poignee_milieu_droite| nouveax=ABS((dx+dy)*2) ancienx=SINGLE{ADD(univ%,14)} IF nouveax<>ancienx SINGLE{ADD(univ%,14)}=nouveax coefx=nouveax/ancienx change_taille_selection_multiple(coefx,1,1,univ%) ENDIF ENDSELECT CASE vue_de_gauche|,vue_de_droite| $S|,$S> SELECT num& CASE poignee_haut_gauche|,poignee_haut_droite|,poignee_bas_gauche|,poignee_bas_droite| IF BTST(kbd&,cl_control&) nouveax=ABS(dx*2) nouveay=ABS((dx*coef1)*2) ancienx=SINGLE{ADD(univ%,22)} ancieny=SINGLE{ADD(univ%,18)} IF (nouveaz<>ancienz) OR (nouveay<>ancieny) SINGLE{ADD(univ%,22)}=nouveax SINGLE{ADD(univ%,18)}=nouveay coefx=nouveax/ancienx coefy=nouveay/ancieny change_taille_selection_multiple(1,coefy,coefx,univ%) ENDIF ELSE IF BTST(kbd&,cl_shift_gauche&) nouveax=ABS(dx*2) nouveay=ABS((dx*coef1)*2) nouveaz=ABS((dx*coef2)*2) ancienx=SINGLE{ADD(univ%,22)} ancieny=SINGLE{ADD(univ%,18)} ancienz=SINGLE{ADD(univ%,14)} IF (nouveax<>ancienx) OR (nouveay<>ancieny) OR (nouveaz<>ancienz) SINGLE{ADD(univ%,22)}=nouveax SINGLE{ADD(univ%,18)}=nouveay SINGLE{ADD(univ%,14)}=nouveaz coefx=nouveax/ancienx coefy=nouveay/ancieny coefz=nouveaz/ancienz change_taille_selection_multiple(coefz,coefy,coefx,univ%) ENDIF ELSE nouveax=ABS(dx*2) nouveay=ABS(dy*2) ancienx=SINGLE{ADD(univ%,22)} ancieny=SINGLE{ADD(univ%,18)} IF (nouveax<>ancienx) OR (nouveay<>ancieny) SINGLE{ADD(univ%,22)}=nouveax SINGLE{ADD(univ%,18)}=nouveay coefx=nouveax/ancienx coefy=nouveay/ancieny change_taille_selection_multiple(1,coefy,coefx,univ%) ENDIF ENDIF CASE poignee_haut_milieu|,poignee_bas_milieu| nouveay=ABS((dx+dy)*2) ! Nouvelle taille globale ancieny=SINGLE{ADD(univ%,18)} ! Ancienne taille globale IF nouveay<>ancieny SINGLE{ADD(univ%,18)}=ABS((dx+dy)*2) coefy=nouveay/ancieny change_taille_selection_multiple(1,coefy,1,univ%) ENDIF CASE poignee_milieu_gauche|,poignee_milieu_droite| nouveax=ABS((dx+dy)*2) ancienx=SINGLE{ADD(univ%,22)} IF nouveax<>ancienx SINGLE{ADD(univ%,22)}=nouveax coefx=nouveax/ancienx change_taille_selection_multiple(1,1,coefx,univ%) ENDIF ENDSELECT CASE vue_de_dessus|,vue_de_dessous| $S|,$S> SELECT num& CASE poignee_haut_gauche|,poignee_haut_droite|,poignee_bas_gauche|,poignee_bas_droite| IF BTST(kbd&,cl_control&) nouveax=ABS(dx*2) nouveay=ABS((dx*coef1)*2) ancienx=SINGLE{ADD(univ%,14)} ancieny=SINGLE{ADD(univ%,22)} IF (nouveaz<>ancienz) OR (nouveay<>ancieny) SINGLE{ADD(univ%,14)}=nouveax SINGLE{ADD(univ%,22)}=nouveay coefx=nouveax/ancienx coefy=nouveay/ancieny change_taille_selection_multiple(coefx,1,coefy,univ%) ENDIF ELSE IF BTST(kbd&,cl_shift_gauche&) nouveax=ABS(dx*2) nouveay=ABS((dx*coef1)*2) nouveaz=ABS((dx*coef2)*2) ancienx=SINGLE{ADD(univ%,14)} ancieny=SINGLE{ADD(univ%,22)} ancienz=SINGLE{ADD(univ%,18)} IF (nouveax<>ancienx) OR (nouveay<>ancieny) OR (nouveaz<>ancienz) SINGLE{ADD(univ%,14)}=nouveax SINGLE{ADD(univ%,22)}=nouveay SINGLE{ADD(univ%,18)}=nouveaz coefx=nouveax/ancienx coefy=nouveay/ancieny coefz=nouveaz/ancienz change_taille_selection_multiple(coefx,coefz,coefy,univ%) ENDIF ELSE nouveax=ABS(dx*2) nouveay=ABS(dy*2) ancienx=SINGLE{ADD(univ%,14)} ancieny=SINGLE{ADD(univ%,22)} IF (nouveax<>ancienx) OR (nouveay<>ancieny) SINGLE{ADD(univ%,14)}=nouveax SINGLE{ADD(univ%,22)}=nouveay coefx=nouveax/ancienx coefy=nouveay/ancieny change_taille_selection_multiple(coefx,1,coefy,univ%) ENDIF ENDIF CASE poignee_haut_milieu|,poignee_bas_milieu| nouveay=ABS((dx+dy)*2) ! Nouvelle taille globale ancieny=SINGLE{ADD(univ%,22)} ! Ancienne taille globale IF nouveay<>ancieny SINGLE{ADD(univ%,22)}=nouveay coefy=nouveay/ancieny change_taille_selection_multiple(1,1,coefy,univ%) ENDIF CASE poignee_milieu_gauche|,poignee_milieu_droite| nouveax=ABS((dx+dy)*2) ancienx=SINGLE{ADD(univ%,14)} IF nouveax<>ancienx SINGLE{ADD(univ%,14)}=nouveax coefx=nouveax/ancienx change_taille_selection_multiple(coefx,1,1,univ%) ENDIF ENDSELECT ENDSELECT ELSE IF INT{univ%}=primitive_triangle& ' Pour l'instant, le triangle ne peut ˆtre chang‚ … la souris ELSE $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| $S|,$S> SELECT num& CASE poignee_haut_gauche|,poignee_haut_droite|,poignee_bas_gauche|,poignee_bas_droite| IF NOT BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) IF BTST(kbd&,cl_control&) SINGLE{ADD(univ%,14)}=ABS(dx*2) SINGLE{ADD(univ%,18)}=ABS((dx*coef1)*2) ELSE IF BTST(kbd&,cl_shift_gauche&) SINGLE{ADD(univ%,14)}=ABS(dx*2) SINGLE{ADD(univ%,18)}=ABS((dx*coef1)*2) SINGLE{ADD(univ%,22)}=ABS((dx*coef2)*2) ELSE SINGLE{ADD(univ%,14)}=ABS(dx*2) SINGLE{ADD(univ%,18)}=ABS(dy*2) ENDIF ENDIF CASE poignee_haut_milieu|,poignee_bas_milieu| IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) ' L'objet est un CARREAUX DE BEZIER, on change les points de control coefy=ABS((dx+dy)*2)/SINGLE{ADD(univ%,18)} modifie_taille_carreaux(univ%,1,coefy,1) ENDIF SINGLE{ADD(univ%,18)}=ABS((dx+dy)*2) CASE poignee_milieu_gauche|,poignee_milieu_droite| IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) ' L'objet est un CARREAUX DE BEZIER, on change les points de control coefx=ABS((dx+dy)*2)/SINGLE{ADD(univ%,14)} modifie_taille_carreaux(univ%,coefx,1,1) ENDIF SINGLE{ADD(univ%,14)}=ABS((dx+dy)*2) ENDSELECT CASE vue_de_gauche|,vue_de_droite| $S|,$S> SELECT num& CASE poignee_haut_gauche|,poignee_haut_droite|,poignee_bas_gauche|,poignee_bas_droite| IF NOT BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) IF BTST(kbd&,cl_control&) SINGLE{ADD(univ%,22)}=ABS(dx*2) SINGLE{ADD(univ%,18)}=ABS((dx*coef1)*2) ELSE IF BTST(kbd&,cl_shift_gauche&) SINGLE{ADD(univ%,22)}=ABS(dx*2) SINGLE{ADD(univ%,18)}=ABS((dx*coef1)*2) SINGLE{ADD(univ%,14)}=ABS((dx*coef2)*2) ELSE SINGLE{ADD(univ%,22)}=ABS(dx*2) SINGLE{ADD(univ%,18)}=ABS(dy*2) ENDIF ENDIF CASE poignee_haut_milieu|,poignee_bas_milieu| IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) ' L'objet est un CARREAUX DE BEZIER, on change les points de control coefy=ABS((dx+dy)*2)/SINGLE{ADD(univ%,18)} modifie_taille_carreaux(univ%,1,coefy,1) ENDIF SINGLE{ADD(univ%,18)}=ABS((dx+dy)*2) CASE poignee_milieu_gauche|,poignee_milieu_droite| IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) ' L'objet est un CARREAUX DE BEZIER, on change les points de control coefz=ABS((dx+dy)*2)/SINGLE{ADD(univ%,22)} modifie_taille_carreaux(univ%,1,1,coefz) ENDIF SINGLE{ADD(univ%,22)}=ABS((dx+dy)*2) ENDSELECT CASE vue_de_dessus|,vue_de_dessous| $S|,$S> SELECT num& CASE poignee_haut_gauche|,poignee_haut_droite|,poignee_bas_gauche|,poignee_bas_droite| IF NOT BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) IF BTST(kbd&,cl_control&) SINGLE{ADD(univ%,14)}=ABS(dx*2) SINGLE{ADD(univ%,22)}=ABS((dx*coef1)*2) ELSE IF BTST(kbd&,cl_shift_gauche&) SINGLE{ADD(univ%,14)}=ABS(dx*2) SINGLE{ADD(univ%,22)}=ABS((dx*coef1)*2) SINGLE{ADD(univ%,18)}=ABS((dx*coef2)*2) ELSE SINGLE{ADD(univ%,14)}=ABS(dx*2) SINGLE{ADD(univ%,22)}=ABS(dy*2) ENDIF ENDIF CASE poignee_haut_milieu|,poignee_bas_milieu| IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) ' L'objet est un CARREAUX DE BEZIER, on change les points de control coefz=ABS((dx+dy)*2)/SINGLE{ADD(univ%,22)} modifie_taille_carreaux(univ%,1,1,coefz) ENDIF SINGLE{ADD(univ%,22)}=ABS((dx+dy)*2) CASE poignee_milieu_gauche|,poignee_milieu_droite| IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) ' L'objet est un CARREAUX DE BEZIER, on change les points de control coefx=ABS((dx+dy)*2)/SINGLE{ADD(univ%,14)} modifie_taille_carreaux(univ%,coefx,1,1) ENDIF SINGLE{ADD(univ%,14)}=ABS((dx+dy)*2) ENDSELECT ENDSELECT ENDIF ENDIF travail_a_sauver!=TRUE RETURN > PROCEDURE change_taille_selection_multiple(coefx,coefy,coefz,univ%) LOCAL j&,obj&,univ2% CLR j& DO obj&=CARD{ADD(deplacement_multiple%,SHL(j&,1))} univ2%=@adresse_objet(obj&) IF INT{univ2%}=primitive_triangle& ' Premier point SINGLE{ADD(univ2%,2)}=SINGLE{ADD(univ2%,2)}*(coefx/2) SINGLE{ADD(univ2%,6)}=SINGLE{ADD(univ2%,6)}*(coefy/2) SINGLE{ADD(univ2%,10)}=SINGLE{ADD(univ2%,10)}*(coefz/2) ' Second point SINGLE{ADD(univ2%,14)}=SINGLE{ADD(univ2%,14)}*(coefx/2) SINGLE{ADD(univ2%,18)}=SINGLE{ADD(univ2%,18)}*(coefy/2) SINGLE{ADD(univ2%,22)}=SINGLE{ADD(univ2%,22)}*(coefz/2) ' TroisiŠme point SINGLE{ADD(univ2%,26)}=SINGLE{ADD(univ2%,26)}*(coefx/2) SINGLE{ADD(univ2%,30)}=SINGLE{ADD(univ2%,30)}*(coefy/2) SINGLE{ADD(univ2%,34)}=SINGLE{ADD(univ2%,34)}*(coefz/2) ELSE ' Changement de taille sur X SINGLE{ADD(univ2%,2)}=SINGLE{ADD(univ2%,2)}-SINGLE{ADD(univ%,2)} SINGLE{ADD(univ2%,2)}=SINGLE{ADD(univ2%,2)}*coefx SINGLE{ADD(univ2%,2)}=SINGLE{ADD(univ2%,2)}+SINGLE{ADD(univ%,2)} ' Changement de taille sur Y SINGLE{ADD(univ2%,6)}=SINGLE{ADD(univ2%,6)}-SINGLE{ADD(univ%,6)} SINGLE{ADD(univ2%,6)}=SINGLE{ADD(univ2%,6)}*coefy SINGLE{ADD(univ2%,6)}=SINGLE{ADD(univ2%,6)}+SINGLE{ADD(univ%,6)} ' Changement de taille sur Z SINGLE{ADD(univ2%,10)}=SINGLE{ADD(univ2%,10)}-SINGLE{ADD(univ%,10)} SINGLE{ADD(univ2%,10)}=SINGLE{ADD(univ2%,10)}*coefz SINGLE{ADD(univ2%,10)}=SINGLE{ADD(univ2%,10)}+SINGLE{ADD(univ%,10)} ' ' IF BTST(BYTE{ADD(univ2%,offset_drapeau0&)},bit_bicubic|) ' L'objet est un CARREAUX DE BEZIER, on change les points de control ' modifie_taille_carreaux(univ2%,coefx,coefy,coefy) ' ENDIF ENDIF SINGLE{ADD(univ2%,14)}=SINGLE{ADD(univ2%,14)}*coefx SINGLE{ADD(univ2%,18)}=SINGLE{ADD(univ2%,18)}*coefy SINGLE{ADD(univ2%,22)}=SINGLE{ADD(univ2%,22)}*coefz ' INC j& LOOP WHILE j& PROCEDURE tourner_selection_multiple(ranx,rany,ranz) LOCAL j&,obj&,univ2%,adr_po% LOCAL disx,disy,disz LOCAL rnx,rny,rnz,mem_act& disx=ROUND(SINGLE{ADD(activation%,2)},3) disy=ROUND(SINGLE{ADD(activation%,6)},3) disz=ROUND(SINGLE{ADD(activation%,10)},3) ' ' On enlŠve l'ancienne rotation de la boŒte de s‚lection ' SINGLE{ADD(activation%,26)}=0 SINGLE{ADD(activation%,30)}=0 SINGLE{ADD(activation%,34)}=0 de_reel_vers_vue(boite_active%,activation%,8,FALSE,FALSE) CLR j& DO obj&=CARD{ADD(deplacement_multiple%,SHL(j&,1))} univ2%=@adresse_objet(obj&) ' ' On d‚place les objets de la distance au centre univers<->Centre s‚lection ' {transfert%}=(SINGLE{ADD(univ2%,2)}-disx)*1024 {ADD(transfert%,4)}=(SINGLE{ADD(univ2%,6)}-disy)*1024 {ADD(transfert%,8)}=(SINGLE{ADD(univ2%,10)}-disz)*1024 ' ' On tourne (et d‚place le cas ou) les objets de la s‚lection ' matrice_zyx(ranx,rany,ranz,matrice%) ' angle_2d_sur_matrice(ranx,rany,ranz) ' ******** Echelle + Rotation + Translation {matrice%}=2 {ADD(matrice%,4)}=2 {ADD(matrice%,8)}=2 {ADD(tracer_rotattrans%,32)}=1 {ADD(tracer_rotattrans%,36)}=1024 {ADD(tracer_rotattrans%,40)}=1024 {ADD(tracer_rotattrans%,44)}=1024 ro_tr(tracer_rotattrans%) ' ' On remet les objets … leur place originel ' SINGLE{ADD(univ2%,2)}=({transfert%}/1024)+disx SINGLE{ADD(univ2%,6)}=({ADD(transfert%,4)}/1024)+disy SINGLE{ADD(univ2%,10)}=({ADD(transfert%,8)}/1024)+disz ' ' On ajout l'angle de rotation avec un modulo 360 pour ‚viter les erreurs ' SINGLE{ADD(univ2%,26)}=(SINGLE{ADD(univ2%,26)}-ranx) MOD 360 SINGLE{ADD(univ2%,30)}=(SINGLE{ADD(univ2%,30)}-rany) MOD 360 SINGLE{ADD(univ2%,34)}=(SINGLE{ADD(univ2%,34)}-ranz) MOD 360 ' ' Et en cas de BICUBIC, on recalcul les points de contr“le ' calcul_et_dessin_en_2d(physique%,dessin_3d|,global_xf&,global_yf&,global_wf&,global_hf&,TRUE,obj&) INC j& LOOP WHILE j& PROCEDURE modification_de_l_angle(univ%,phi) LOCAL panx,pany,panz LOCAL panx%,pany%,panz% LOCAL ranx,rany,ranz LOCAL tanx,tany,tanz IF INT{univ%}=primitive_triangle& pour_triangle_active(univ%,panx,pany,panz,tanx,tany,tanz) panx%=panx*1024 pany%=pany*1024 panz%=panz*1024 recherche_de_l_angle(univ%,phi,ranx,rany,ranz) bmove(ADD(univ%,2),transfert%,36) matrice_xyz(ranx,rany,ranz,matrice%) ' ******** Echelle + Translation + Rotation {ADD(tracer_transrotat%,32)}=3 {ADD(tracer_transrotat%,36)}=-panx% {ADD(tracer_transrotat%,40)}=-pany% {ADD(tracer_transrotat%,44)}=-panz% tr_ro(tracer_transrotat%) matrice_xyz(0,0,0,matrice%) ' ******** Echelle + Translation + Rotation {ADD(tracer_transrotat%,36)}=panx% {ADD(tracer_transrotat%,40)}=pany% {ADD(tracer_transrotat%,44)}=panz% tr_ro(tracer_transrotat%) bmove(transfert%,ADD(univ%,2),36) ELSE recherche_de_l_angle(univ%,phi,ranx,rany,ranz) SINGLE{ADD(univ%,26)}=ranx SINGLE{ADD(univ%,30)}=rany SINGLE{ADD(univ%,34)}=ranz ENDIF RETURN > PROCEDURE recherche_de_l_angle(univ%,phi,VAR ranx,rany,ranz) ranx=SINGLE{ADD(univ%,26)} rany=SINGLE{ADD(univ%,30)} ranz=SINGLE{ADD(univ%,34)} IF BTST(kbd&,cl_alternate&) $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_gauche|,vue_de_dessus| ranx=phi rany=phi ranz=phi CASE vue_de_dos|,vue_de_droite|,vue_de_dessous| ranx=-phi rany=-phi ranz=-phi ENDSELECT ELSE $S|,$S> SELECT dessin_3d| CASE vue_de_face| IF BTST(kbd&,cl_control&) ranx=phi ELSE IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) rany=phi ELSE ranz=phi ENDIF CASE vue_de_dos| IF BTST(kbd&,cl_control&) ranx=-phi ELSE IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) rany=-phi ELSE ranz=-phi ENDIF CASE vue_de_droite| IF BTST(kbd&,cl_control&) ranz=phi ELSE IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) rany=phi ELSE ranx=-phi ENDIF CASE vue_de_gauche| IF BTST(kbd&,cl_control&) ranz=-phi ELSE IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) rany=-phi ELSE ranx=phi ENDIF CASE vue_de_dessus| IF BTST(kbd&,cl_control&) ranx=phi ELSE IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) ranz=phi ELSE rany=phi ENDIF CASE vue_de_dessous| IF BTST(kbd&,cl_control&) ranx=-phi ELSE IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) ranz=-phi ELSE rany=-phi ENDIF ENDSELECT ENDIF RETURN > PROCEDURE angle_2d_sur_matrice(xxr,yyr,zzr) IF BTST(kbd&,cl_alternate&) matrice_zyx(-xxr,-yyr,-zzr,matrice%) ELSE $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| IF BTST(kbd&,cl_control&) matrice_zyx(-xxr,0,0,matrice%) ELSE IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) matrice_zyx(0,-yyr,0,matrice%) ELSE matrice_zyx(0,0,-zzr,matrice%) ENDIF CASE vue_de_gauche|,vue_de_droite| IF BTST(kbd&,cl_control&) matrice_zyx(0,0,-zzr,matrice%) ELSE IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) matrice_zyx(0,-yyr,0,matrice%) ELSE matrice_zyx(-xxr,0,0,matrice%) ENDIF CASE vue_de_dessus|,vue_de_dessous| IF BTST(kbd&,cl_control&) matrice_zyx(-xxr,0,0,matrice%) ELSE IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) matrice_zyx(0,0,-zzr,matrice%) ELSE matrice_zyx(0,-yyr,0,matrice%) ENDIF ENDSELECT ENDIF RETURN > FUNCTION calcul_angle(xc&,yc&) LOCAL largeur,hauteur LOCAL ang_rad,ang_deg ' largeur=(global_mx&-xc&) hauteur=(yc&-global_my&) IF largeur=0 largeur=0.00001 ENDIF IF hauteur=0 hauteur=0.00001 ENDIF ' --------------------------- $S&,$S> SELECT type_de_vue| CASE vue_de_face|,vue_de_gauche|,vue_de_dessus| ang_rad=ATN(largeur/-hauteur) IF global_mx&yc& ang_rad=PI+ang_rad ENDIF ang_deg=(DEG(ang_rad)) ELSE IF global_my&>yc& ang_rad=-(PI-ang_rad) ENDIF ang_deg=(DEG(ang_rad)) ENDIF CASE vue_de_dos|,vue_de_droite|,vue_de_dessous| ang_rad=ATN(-largeur/-hauteur) IF global_mx&yc& ang_rad=ang_rad-PI ENDIF ang_deg=(DEG(ang_rad)) ELSE IF global_my&>yc& ang_rad=PI+ang_rad ENDIF ang_deg=(DEG(ang_rad)) ENDIF ENDSELECT ' --------------------------- ' RETURN ang_deg ' ENDFUNC ' ------------------------------------------------------------------------------ > FUNCTION objet_cliquer LOCAL rx&,ry&,reponse& LOCAL unn%,anc_ob&,origx&,origy& LOCAL fx&,fy&,fw&,fh& ' IF @calcul_correction z_correction(adr_fenetre%,fen_act&) ENDIF ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) origx&=mix& origy&=miy& ' dans_quelle_vue(origx&,origy&) IF @dans_point_de_control_carreau_actif>-1 ! Point de contr“le actif RETURN @dans_point_de_control_carreau_actif ENDIF IF @dans_modif_taill>-1 ! Les poign‚es de travail RETURN @dans_modif_taill ENDIF IF @dans_camera(TRUE)=TRUE ! Est ce la cam‚ra RETURN 1000 ENDIF IF @dans_source=TRUE ! Est ce une source de lumiŠre RETURN 2000 ENDIF IF @dans_camera(FALSE)=TRUE ! Est ce point de vis‚ de cam‚ra RETURN 1001 ENDIF IF @dans_point_vise_source=TRUE ! Est ce point de vis‚ de lampe RETURN 2010 ENDIF IF @dans_point_de_control_carreau_inactif>-1 ! Point de contr“le inactif RETURN @dans_point_de_control_carreau_inactif ENDIF IF @plusieurs_objets ! Plusieurs objets sous souris ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' Plusieurs objets se trouvent sous la souris ' Il faut ouvrir un popup pour choisir lequel deviendra actif ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ rx&=SUB(global_mx&,DIV(OB_W(adr_popup_autre0%,chxobjet&),2)) ry&=SUB(global_my&,DIV(OB_H(adr_popup_autre0%,chxobjet&),2)) positionner_popup(-2,fen_act&,adr_fenetre%,adr_popup_autre0%,rx&,ry&) @liste_des_objets_trouves debut_popup_plusieurs&=@chercher_dans_plusieurs IF CARD{plusieurs%}>9 debut_popup_plusieurs&=-debut_popup_plusieurs&*(debut_popup_plusieurs&=>0 AND debut_popup_plusieurs&<=SUB(CARD{plusieurs%},10))+0*(debut_popup_plusieurs&<0)-SUB(CARD{plusieurs%},10)*(debut_popup_plusieurs&>SUB(CARD{plusieurs%},10)) ELSE CLR debut_popup_plusieurs& ENDIF reponse&=@popup_choix_plusieurs(rx&,ry&) CARD{plusieurs%}=0 IF reponse&>-1 IF objet_actif&<>CARD{ADD(plusieurs%,SHL(SUCC(reponse&),1))} objet_actif&=CARD{ADD(plusieurs%,SHL(SUCC(reponse&),1))} unn%=@adresse_objet(objet_actif&) IF INT{ADD(unn%,offset_relation_csg&)}<>-1 objet_actif&=INT{ADD(unn%,offset_relation_csg&)} ENDIF calque_actif|=@calque_actif(@adresse_objet(objet_actif&)) RETURN 7000 ELSE RETURN -1 ENDIF ELSE RETURN -1 ENDIF ENDIF IF @dans_objet_non_actif>-1 ! Un objet non actif RETURN @dans_objet_non_actif ENDIF IF @dans_objet_actif>-1 ! Est ce l'objet actif RETURN @dans_objet_actif ENDIF RETURN -1 ENDFUNC > FUNCTION dans_point_de_control_carreau_actif LOCAL univ%,fa&,adr_src% LOCAL xm&,ym&,adrc% LOCAL ptx&,pty& LOCAL ox,oy,oz LOCAL minx,miny LOCAL maxx,maxy ' IF controle_visible! univ%=@adresse_objet(objet_actif&) IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) ' Tiens, un carreau de B‚zier, super, c'est ce que l'on cherche !! ' adrc%=SUB(@adresse_point_control(CARD{ADD(univ%,offset_force_blob&)}),2) de_reel_vers_vue(adrc%,univ%,16,FALSE,TRUE) ' ' bmove(@adresse_point_control(CARD{ADD(univ%,offset_force_blob&)}),transfert%,192) CLR fa& CLR pty& DO CLR ptx& DO adr_src%=@adr_ctrl(transfert%,ptx&,pty&) ox={adr_src%}/1024 oy={ADD(adr_src%,4)}/1024 oz={ADD(adr_src%,8)}/1024 cherche_dans_vue_2d(ox,oy,oz,8,8,8,xm&,ym&,minx,miny,maxx,maxy) IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy IF fa&=num_pt_ctrl& ! Clique sur le point de contr“le RETURN ADD(9100,fa&) ! actif ENDIF ENDIF INC fa& INC ptx& LOOP WHILE ptx&<4 INC pty& LOOP WHILE pty&<4 ENDIF ENDIF RETURN -1 ENDFUNC > FUNCTION dans_modif_taill IF @test_plot_de_taille(INT{deplace%},INT{ADD(deplace%,2)}) ' En haut … gauche RETURN 6000 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,4)},INT{ADD(deplace%,6)}) ' En haut au milieu RETURN 6001 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,8)},INT{ADD(deplace%,10)}) ' En haut … droite RETURN 6002 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,24)},INT{ADD(deplace%,26)}) ' A gauche au milieu RETURN 6003 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,32)},INT{ADD(deplace%,34)}) ' A droite au milieu RETURN 6004 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,12)},INT{ADD(deplace%,14)}) ' En bas … gauche RETURN 6005 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,16)},INT{ADD(deplace%,18)}) ' En bas au milieu RETURN 6006 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,20)},INT{ADD(deplace%,22)}) ' En bas … droite RETURN 6007 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,28)},INT{ADD(deplace%,30)}) ' Au milieu (D‚placement) RETURN 6008 ELSE IF @test_plot_de_taille(INT{ADD(deplace%,36)},INT{ADD(deplace%,38)}) ' Point de contr“le des rotations RETURN 8000 ENDIF RETURN -1 ENDFUNC > FUNCTION dans_camera(ind!) LOCAL xm&,ym& LOCAL minx,miny LOCAL maxx,maxy LOCAL cx,cy,cz IF ind! cx=SINGLE{camera%} cy=SINGLE{ADD(camera%,4)} cz=SINGLE{ADD(camera%,8)} ELSE cx=SINGLE{ADD(camera%,12)} cy=SINGLE{ADD(camera%,16)} cz=SINGLE{ADD(camera%,20)} ENDIF IF ind! cherche_dans_vue_2d(cx,cy,cz,20,20,20,xm&,ym&,minx,miny,maxx,maxy) ELSE cherche_dans_vue_2d(cx,cy,cz,13,13,13,xm&,ym&,minx,miny,maxx,maxy) ENDIF IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy RETURN TRUE ENDIF RETURN FALSE ENDFUNC > FUNCTION dans_source LOCAL xm&,ym&,i& LOCAL minx,miny LOCAL maxx,maxy LOCAL sx,sy,sz LOCAL adr_sr% LOCAL fin_s% CLR i& fin_s%=@adresse_source(nombre_de_source&) adr_sr%=source% DO IF BYTE{adr_sr%}=1 sx=ROUND(SINGLE{ADD(adr_sr%,8)},3) sy=ROUND(SINGLE{ADD(adr_sr%,12)},3) sz=ROUND(SINGLE{ADD(adr_sr%,16)},3) cherche_dans_vue_2d(sx,sy,sz,15,15,15,xm&,ym&,minx,miny,maxx,maxy) IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy source_active&=i& RETURN TRUE ENDIF ENDIF INC i& ADD adr_sr%,taille_source& LOOP WHILE adr_sr% FUNCTION dans_point_vise_source LOCAL xm&,ym&,i& LOCAL minx,miny LOCAL maxx,maxy LOCAL sx,sy,sz LOCAL adr_sr% LOCAL fin_s% CLR i& fin_s%=@adresse_source(nombre_de_source&) adr_sr%=source% DO IF BTST(BYTE{ADD(adr_sr%,1)},bit_spot|) IF BYTE{adr_sr%}=1 sx=ROUND(SINGLE{ADD(adr_sr%,20)},3) sy=ROUND(SINGLE{ADD(adr_sr%,24)},3) sz=ROUND(SINGLE{ADD(adr_sr%,28)},3) cherche_dans_vue_2d(sx,sy,sz,17,17,17,xm&,ym&,minx,miny,maxx,maxy) IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy source_active&=i& RETURN TRUE ENDIF ENDIF ENDIF INC i& ADD adr_sr%,taille_source& LOOP WHILE adr_sr% FUNCTION plusieurs_objets LOCAL univ%,fin_univ%,i& LOCAL xm&,ym&,nb_trouves& LOCAL ox,oy,oz LOCAL ow,oh,oz LOCAL minx,miny LOCAL maxx,maxy CLR nb_trouve& univ%=univers% fin_univ%=@adresse_objet(nombre_d_objets&) DO ' Si l'objet n'est pas masqu‚, on test sur lequel on a cliqu‚ IF NOT BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_masque|) IF INT{univ%}=primitive_triangle& pour_triangle_active(univ%,ox,oy,oz,ow,oh,op) ELSE ox=SINGLE{ADD(univ%,2)} oy=SINGLE{ADD(univ%,6)} oz=SINGLE{ADD(univ%,10)} ow=SINGLE{ADD(univ%,14)}/2 oh=SINGLE{ADD(univ%,18)}/2 op=SINGLE{ADD(univ%,22)}/2 ENDIF cherche_dans_vue_2d(ox,oy,oz,ow,oh,op,xm&,ym&,minx,miny,maxx,maxy) IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy objet_actif&=i& IF objets_a_deplacer&>0 CLR j& DO IF objet_actif&=CARD{ADD(deplacement_multiple%,SHL(j&,1))} INC nb_trouve& ENDIF INC j& LOOP WHILE j&-1 ' L'objet est dans une C.S.G., et son calque est visible IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(univ%),36)),35)}=1 INC nb_trouve& ENDIF ELSE ' L…, tout va bien et son calque est actif IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(univ%),36)),35)}=1 INC nb_trouve& ENDIF ENDIF ENDIF ENDIF IF nb_trouve&>1 RETURN TRUE ENDIF INC i& ADD univ%,taille_objet& LOOP WHILE univ% FUNCTION dans_point_de_control_carreau_inactif LOCAL univ%,fa&,adr_src% LOCAL xm&,ym&,adrc% LOCAL ptx&,pty& LOCAL ox,oy,oz LOCAL minx,miny LOCAL maxx,maxy ' IF controle_visible! univ%=@adresse_objet(objet_actif&) IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) ' Tiens, un carreau de B‚zier, super, c'est ce que l'on cherche !! ' adrc%=SUB(@adresse_point_control(CARD{ADD(univ%,offset_force_blob&)}),2) de_reel_vers_vue(adrc%,univ%,16,FALSE,TRUE) ' bmove(@adresse_point_control(CARD{ADD(univ%,offset_force_blob&)}),transfert%,192) CLR fa& CLR pty& DO CLR ptx& DO adr_src%=@adr_ctrl(transfert%,ptx&,pty&) ox={adr_src%}/1024 oy={ADD(adr_src%,4)}/1024 oz={ADD(adr_src%,8)}/1024 cherche_dans_vue_2d(ox,oy,oz,8,8,8,xm&,ym&,minx,miny,maxx,maxy) IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy IF fa&<>num_pt_ctrl& ! Clique sur le point de contr“le RETURN ADD(9000,fa&) ! inactif ENDIF ENDIF INC fa& INC ptx& LOOP WHILE ptx&<4 INC pty& LOOP WHILE pty&<4 ENDIF ENDIF RETURN -1 ENDFUNC > FUNCTION dans_objet_actif LOCAL univ% LOCAL ox,oy,oz LOCAL ow,oh,oz LOCAL minx,miny LOCAL maxx,maxy univ%=@adresse_objet(objet_actif&) IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) IF @dans_point_de_control_carreau_actif<>-1 RETURN @dans_point_de_control_carreau_actif ENDIF ENDIF IF objets_a_deplacer&>0 ox=SINGLE{ADD(activation%,2)} oy=SINGLE{ADD(activation%,6)} oz=SINGLE{ADD(activation%,10)} ow=SINGLE{ADD(activation%,14)}/2 oh=SINGLE{ADD(activation%,18)}/2 op=SINGLE{ADD(activation%,22)}/2 ELSE IF INT{univ%}=primitive_triangle& pour_triangle_active(univ%,ox,oy,oz,ow,oh,op) ELSE ox=SINGLE{ADD(univ%,2)} oy=SINGLE{ADD(univ%,6)} oz=SINGLE{ADD(univ%,10)} ow=SINGLE{ADD(univ%,14)}/2 oh=SINGLE{ADD(univ%,18)}/2 op=SINGLE{ADD(univ%,22)}/2 ENDIF ENDIF cherche_dans_vue_2d(ox,oy,oz,ow,oh,op,xm&,ym&,minx,miny,maxx,maxy) IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy IF objets_a_deplacer&>0 RETURN 9999 ELSE RETURN objet_actif& ENDIF ENDIF RETURN -1 ENDFUNC > FUNCTION dans_objet_non_actif LOCAL i&,univ%,j&,clq| LOCAL xm&,ym& LOCAL ox,oy,oz LOCAL ow,oh,oz LOCAL minx,miny LOCAL maxx,maxy LOCAL fin_u% CLR i& fin_u%=@adresse_objet(nombre_d_objets&) univ%=univers% DO ' Si l'objet n'est pas masqu‚, on test sur lequel on a cliqu‚ IF NOT BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_masque|) IF INT{univ%}=primitive_triangle& pour_triangle_active(univ%,ox,oy,oz,ow,oh,op) ELSE ox=SINGLE{ADD(univ%,2)} oy=SINGLE{ADD(univ%,6)} oz=SINGLE{ADD(univ%,10)} ow=SINGLE{ADD(univ%,14)}/2 oh=SINGLE{ADD(univ%,18)}/2 op=SINGLE{ADD(univ%,22)}/2 ENDIF cherche_dans_vue_2d(ox,oy,oz,ow,oh,op,xm&,ym&,minx,miny,maxx,maxy) IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy objet_actif&=i& IF objets_a_deplacer&>0 CLR j& DO IF objet_actif&=CARD{ADD(deplacement_multiple%,SHL(j&,1))} RETURN objet_actif& ENDIF INC j& LOOP WHILE j&-1 ' L'objet est dans une C.S.G., on renvoie le Nø de cette derniŠre objet_actif&=INT{ADD(univ%,offset_relation_csg&)} calque_actif|=@calque_actif(@adresse_objet(objet_actif&)) RETURN 7000 ENDIF IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(univ%),36)),35)}=0 ' Si le calque de l'objet est invisible : s‚lection impossible RETURN -1 ENDIF ' L…, tout va bien, on change l'objet actif calque_actif|=@calque_actif(univ%) RETURN 7000 ENDIF ENDIF INC i& ADD univ%,taille_objet& LOOP WHILE univ% FUNCTION test_plot_de_taille(nx&,ny&) IF global_mx&=>SUB(nx&,5) AND global_mx&<=ADD(nx&,5) AND global_my&=>SUB(ny&,5) AND global_my&<=ADD(ny&,5) RETURN TRUE ENDIF RETURN FALSE ENDFUNC > FUNCTION dans_saisie_multiple(obj_act&) LOCAL i& i&=PRED(objets_a_deplacer&) DO IF CARD{ADD(deplacement_multiple%,SHL(i&,1))}=obj_act& RETURN 9999 ENDIF DEC i& LOOP WHILE i&>-1 RETURN -1 ENDFUNC ' .............................................................................. > PROCEDURE cherche_dans_vue_2d(ox,oy,oz,ow,oh,op,VAR xm&,ym&,minx,miny,maxx,maxy) $S|,S> SELECT dessin_3d| CASE vue_de_face| ' X+ … droite Y+ en haut xm&=SUB(global_mx&,origx&)*z_correctionx%/zoom% ym&=-SUB(global_my&,origy&)*z_correctiony%/zoom% minx=ox-ow miny=oy-oh maxx=ox+ow maxy=oy+oh CASE vue_de_dos| ' X+ … gauche Y+ en haut xm&=-SUB(global_mx&,origx&)*z_correctionx%/zoom% ym&=-SUB(global_my&,origy&)*z_correctiony%/zoom% minx=ox-ow miny=oy-oh maxx=ox+ow maxy=oy+oh CASE vue_de_gauche| ' Z+ … gauche Y+ en haut xm&=-SUB(global_my&,origy&)*z_correctiony%/zoom% ym&=-SUB(global_mx&,origx&)*z_correctionx%/zoom% minx=oy-oh miny=oz-op maxx=oy+oh maxy=oz+op CASE vue_de_droite| ' Z+ … droite Y+ en haut xm&=-SUB(global_my&,origy&)*z_correctiony%/zoom% ym&=SUB(global_mx&,origx&)*z_correctionx%/zoom% minx=oy-oh miny=oz-op maxx=oy+oh maxy=oz+op CASE vue_de_dessus| ' X+ … droite Z+ en haut xm&=SUB(global_mx&,origx&)*z_correctionx%/zoom% ym&=-SUB(global_my&,origy&)*z_correctiony%/zoom% minx=ox-ow miny=oz-op maxx=ox+ow maxy=oz+op CASE vue_de_dessous| ' Vue de bas X+ … droite Z+ en bas xm&=SUB(global_mx&,origx&)*z_correctionx%/zoom% ym&=SUB(global_my&,origy&)*z_correctiony%/zoom% minx=ox-ow miny=oz-op maxx=ox+ow maxy=oz+op ENDSELECT RETURN > PROCEDURE pour_triangle_active(un_i%,VAR anpx,anpy,anpz,antx,anty,antz) LOCAL px1,py1,pz1 LOCAL px2,py2,pz2 LOCAL px3,py3,pz3 px1=SINGLE{ADD(un_i%,2)} py1=SINGLE{ADD(un_i%,6)} pz1=SINGLE{ADD(un_i%,10)} px2=SINGLE{ADD(un_i%,14)} py2=SINGLE{ADD(un_i%,18)} pz2=SINGLE{ADD(un_i%,22)} px3=SINGLE{ADD(un_i%,26)} py3=SINGLE{ADD(un_i%,30)} pz3=SINGLE{ADD(un_i%,34)} antx=ROUND(MAX(px1,px2,px3)-MIN(px1,px2,px3),3) anty=ROUND(MAX(py1,py2,py3)-MIN(py1,py2,py3),3) antz=ROUND(MAX(pz1,pz2,pz3)-MIN(pz1,pz2,pz3),3) anpx=ROUND(MIN(px1,px2,px3)+(antx/2),3) anpy=ROUND(MIN(py1,py2,py3)+(anty/2),3) anpz=ROUND(MIN(pz1,pz2,pz3)+(antz/2),3) RETURN > PROCEDURE repositionne_objet(ad%,nbp%,VAR lar,hau,pro,milx,mily,milz) LOCAL x,y,z,i%,u% LOCAL fin_i% LOCAL minx,miny,minz LOCAL maxx,maxy,maxz ' minx=3.599386269725E+308 miny=3.599386269725E+308 minz=3.599386269725E+308 maxx=-3.599386269725E+308 maxy=-3.599386269725E+308 maxz=-3.599386269725E+308 fin_i%=ADD(ADD(ad%,2),MUL(nbp%,12)) i%=ADD(ad%,2) DO x=SINGLE{i%} y=SINGLE{ADD(i%,4)} z=SINGLE{ADD(i%,8)} minx=MIN(minx,x) miny=MIN(miny,y) minz=MIN(minz,z) maxx=MAX(maxx,x) maxy=MAX(maxy,y) maxz=MAX(maxz,z) ADD i%,12 LOOP WHILE i%1 {i%}=((x-milx)/(lar/2))*1024 ELSE {i%}=(x-milx)*1024 ENDIF IF hau>1 {ADD(i%,4)}=((y-mily)/(hau/2))*1024 ELSE {ADD(i%,4)}=(y-mily)*1024 ENDIF IF pro>1 {ADD(i%,8)}=((z-milz)/(pro/2))*1024 ELSE {ADD(i%,8)}=(z-milz)*1024 ENDIF ADD i%,12 LOOP WHILE i% PROCEDURE redessine_le_carreaux_en_direct LOCAL cptf%,poly%,nbf%,i%,fin_i%,r&,v&,b& ' cptf%=CARD{ADD(zone_index%,SHL(objet_actif&,1))} poly%=ADD(zone_dessin_2dfi%,MUL(cptf%,taille_zone_2dfi%)) nbf%={poly%} ' {ADD(tracer_trace_tab%,16)}=poly% i%=ADD(adr_face%,2) fin_i%=ADD(i%,MUL(nbf%,6)) DO IF true_color! inquire_color_representation(INT{ADD(poly%,2)},r&,v&,b&,vdihandle%) BYTE{ADD(tracer_param_tab%,1)}=r&*0.255 BYTE{ADD(tracer_param_tab%,2)}=v&*0.255 BYTE{ADD(tracer_param_tab%,3)}=b&*0.255 ELSE {tracer_param_tab%}=INT{ADD(poly%,2)} ENDIF draw_line(tracer_trace_tab%) ' ADD i%,6 ADD poly%,taille_zone_2dfi% LOOP WHILE i% PROCEDURE recalcul_2d_pour_l_ecran(destination%,univ%,af!) LOCAL mem_ob_ac& LOCAL x_f&,y_f& LOCAL nbp%,nbf%,adr_obje%,adr_face% ' IF modif_normale! refaire_toutes_les_normales(objet_actif&,objet_actif&,FALSE,TRUE) modif_normale!=FALSE ENDIF ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) ' tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE redessin_deja_fait!=FALSE IF dessin_3d|=vue_en_3d| calcul_et_dessin_en_2d(destination%,memoire_dessin|,global_xf&,global_yf&,global_wf&,global_hf&,TRUE,objet_actif&) ELSE calcul_et_dessin_en_2d(destination%,dessin_3d|,global_xf&,global_yf&,global_wf&,global_hf&,TRUE,objet_actif&) ENDIF IF af! AND dessin_3d|<>vue_en_3d| redraw_force(24,24) ENDIF RETURN ' .............................................................................. > PROCEDURE pose_camera(vue|) ' -------- Dessin de la cam‚ra LOCAL cx,cy,px&,py&,origx&,origy& LOCAL vx,vy,tx&,ty&,in&,adr_ca%,xl&,yl& LOCAL dx&,dy&,rap,cos,sin,ang,orie& LOCAL tanx,tany,tanz,tan,r&,v&,b&,coord% LOCAL panx,pany,panz,tp1%,tp2%,tp3%,nbpo% LOCAL pa2x,pa2y,pa2z,trans% LOCAL i&,i%,des%,adr_poin%,tp1%,tp2%,tp3% ' CLR nbpo% origx&=mix& origy&=miy& dans_quelle_vue(origx&,origy&) ' IF camera_visible! pyramide_camera ENDIF ' $S|,$S> SELECT vue| CASE vue_de_face| cx=SINGLE{camera%} cy=-SINGLE{ADD(camera%,4)} vx=SINGLE{ADD(camera%,12)} vy=-SINGLE{ADD(camera%,16)} CASE vue_de_dos| cx=-SINGLE{camera%} cy=-SINGLE{ADD(camera%,4)} vx=-SINGLE{ADD(camera%,12)} vy=-SINGLE{ADD(camera%,16)} CASE vue_de_gauche| cx=-SINGLE{ADD(camera%,8)} cy=-SINGLE{ADD(camera%,4)} vx=-SINGLE{ADD(camera%,20)} vy=-SINGLE{ADD(camera%,16)} CASE vue_de_droite| cx=SINGLE{ADD(camera%,8)} cy=-SINGLE{ADD(camera%,4)} vx=SINGLE{ADD(camera%,20)} vy=-SINGLE{ADD(camera%,16)} CASE vue_de_dessus| cx=SINGLE{camera%} cy=-SINGLE{ADD(camera%,8)} vx=SINGLE{ADD(camera%,12)} vy=-SINGLE{ADD(camera%,20)} CASE vue_de_dessous| cx=SINGLE{camera%} cy=SINGLE{ADD(camera%,8)} vx=SINGLE{ADD(camera%,12)} vy=SINGLE{ADD(camera%,20)} ENDSELECT ' {zoo%}=zoom% {ADD(zoo%,4)}=z_correctionx% {ADD(zoo%,8)}=zoom% {ADD(zoo%,12)}=z_correctiony% ' IF true_color! BYTE{ADD(tracer_param_tab%,1)}=0 ! Bleu en TRUE COLOR BYTE{ADD(tracer_param_tab%,2)}=0 BYTE{ADD(tracer_param_tab%,3)}=255 ELSE {tracer_param_tab%}=bleu& ENDIF CARD{ADD(tracer_param_tab%,8)}=1 ! Contour actif CARD{ADD(tracer_param_tab%,10)}=0 ! Tramage inactif CARD{tracer_trame_tab%}=&HFFFF {ADD(tracer_trace_tab%,16)}=coord_polygon% {ADD(tracer_trace_tab%,30)}=physique% ' tp1%=tr_tmp% tp2%=ADD(tr_tmp%,12) tp3%=ADD(tr_tmp%,24) ' coord%=ADD(coord_polygon%,4) {ADD(tracer_proj2d%,16)}=tr_tmp% {ADD(tracer_proj2d%,28)}=vue| {ADD(tracer_proj2d%,32)}=origx& {ADD(tracer_proj2d%,36)}=origy& ' IF camera_visible! bmove(ADD(objet_came%,2),transfert%,408) bmove(ADD(came_pyra%,2),ADD(transfert%,408),60) ' panx=ROUND(SINGLE{camera%},3) pany=ROUND(SINGLE{ADD(camera%,4)},3) panz=ROUND(SINGLE{ADD(camera%,8)},3) ' tanx=ROUND(SINGLE{ADD(camera%,12)},3)-panx tany=ROUND(SINGLE{ADD(camera%,16)},3)-pany tanz=ROUND(SINGLE{ADD(camera%,20)},3)-panz tan=SQR(tanx^2+tany^2+tanz^2)*2 tan=-tan*(tan<>0)-1*(tan=0) tanx=-tanx*(tanx<>0)-1*(tanx=0) tany=-tany*(tany<>0)-1*(tany=0) tanz=-tanz*(tanz<>0)-1*(tanz=0) pa2x=panx+ROUND(tanx/2,3) pa2y=pany+ROUND(tany/2,3) pa2z=panz+ROUND(tanz/2,3) ' $S|,$S< SELECT vue| CASE vue_de_face|,vue_de_dos| matrice_zyx(rotationx,rotationy,0,matrice%) CASE vue_de_gauche|,vue_de_droite|,vue_de_dessus|,vue_de_dessous| matrice_zyx(0,180,0,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=2 {ADD(matrice%,4)}=2 {ADD(matrice%,8)}=2 {ADD(tracer_rotattrans%,32)}=39 {ADD(tracer_rotattrans%,36)}=0 {ADD(tracer_rotattrans%,40)}=0 {ADD(tracer_rotattrans%,44)}=0 ro_tr(tracer_rotattrans%) matrice_zyx(-rotationx,-rotationy,0,matrice%) ENDSELECT ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' ******** Echelle + Rotation + Translation pour la cam‚ra {matrice%}=70 {ADD(matrice%,4)}=70 {ADD(matrice%,8)}=70 {ADD(tracer_rotattrans%,32)}=34 {ADD(tracer_rotattrans%,36)}=panx*1024 {ADD(tracer_rotattrans%,40)}=pany*1024 {ADD(tracer_rotattrans%,44)}=panz*1024 ro_tr(tracer_rotattrans%) ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ {ADD(tracer_rotattrans%,20)}=ADD(transfert%,408) {ADD(tracer_rotattrans%,24)}=ADD(transfert%,408) ' ******** Echelle + Rotation + Translation pour le c“ne de cam‚ra {matrice%}=tan {ADD(matrice%,4)}=tan {ADD(matrice%,8)}=tan {ADD(tracer_rotattrans%,32)}=5 {ADD(tracer_rotattrans%,36)}=pa2x*1024 {ADD(tracer_rotattrans%,40)}=pa2y*1024 {ADD(tracer_rotattrans%,44)}=pa2z*1024 ro_tr(tracer_rotattrans%) {ADD(tracer_rotattrans%,20)}=transfert% {ADD(tracer_rotattrans%,24)}=transfert% ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ i%=@adresse_face(objet_came%) CLR i& DO IF i&>53 IF i&=54 i%=@adresse_face(came_pyra%) ENDIF trans%=ADD(transfert%,408) ELSE trans%=transfert% ENDIF {coord%}=tracer_param_tab% {ADD(tracer_proj2d%,20)}=ADD(coord%,4) BMOVE ADD(trans%,MUL(CARD{i%},12)),tp1%,12 BMOVE ADD(trans%,MUL(CARD{ADD(i%,2)},12)),tp2%,12 BMOVE tp1%,tp3%,12 ' c2d2d(tracer_proj2d%) ' INC nbpo% ADD coord%,16 ADD i%,4 INC i& LOOP WHILE i&<58 ENDIF px&=ADD(origx&,cx*zoom%/z_correctionx%) py&=ADD(origy&,cy*zoom%/z_correctiony%) ' {coord%}=tracer_param_tab% INT{ADD(coord%,4)}=px& INT{ADD(coord%,6)}=py& INT{ADD(coord%,8)}=ADD(origx&,vx*zoom%/z_correctionx%) INT{ADD(coord%,10)}=ADD(origy&,vy*zoom%/z_correctiony%) INT{ADD(coord%,12)}=px& INT{ADD(coord%,14)}=py& INC nbpo% ADD coord%,16 ' IF NOT camera_visible! {coord%}=tracer_param_tab% INT{ADD(coord%,4)}=SUB(px&,5) INT{ADD(coord%,6)}=SUB(py&,5) INT{ADD(coord%,8)}=ADD(px&,5) INT{ADD(coord%,10)}=ADD(py&,5) INT{ADD(coord%,12)}=SUB(px&,5) INT{ADD(coord%,14)}=SUB(py&,5) INC nbpo% ADD coord%,16 ' {coord%}=tracer_param_tab% INT{ADD(coord%,4)}=SUB(px&,5) INT{ADD(coord%,6)}=ADD(py&,5) INT{ADD(coord%,8)}=ADD(px&,5) INT{ADD(coord%,10)}=SUB(py&,5) INT{ADD(coord%,12)}=SUB(px&,5) INT{ADD(coord%,14)}=ADD(py&,5) INC nbpo% ENDIF ' {coord_polygon%}=nbpo% draw_line(tracer_trace_tab%) ' RETURN > PROCEDURE pose_source_de_lumiere(vue|) ' -------- Dessin des sources de lumiŠres LOCAL lum&,adr_s%,fin_s% ' fin_s%=@adresse_source(nombre_de_source&) adr_s%=source% CLR lum& DO IF BYTE{adr_s%}=1 affiche_source_lumiere(lum&,vue|) ENDIF ADD adr_s%,taille_source& INC lum& LOOP WHILE adr_s% PROCEDURE affiche_source_lumiere(lum&,vue|) ' -------- Dessin des sources de lumiŠres LOCAL cx,cy,px&,py&,origx&,origy& LOCAL vx,vy,xv&,yv&,spot!,rotation_spotx,rotation_spoty LOCAL adr_sr%,panx,pany,panz,norme,adr_ca% LOCAL nbp%,nbf%,adr_face%,adr_obje% LOCAL tx&,ty&,dx&,dy&,z_ox,z_oy LOCAL tanx,tany,tanz,tan,r&,v&,b&,coord%,nbpo% LOCAL panx,pany,panz,ptx&,pty&,tp1%,tp2%,tp3% LOCAL i&,i%,fin_i%,des%,adr_poin%,j&,fin_j& LOCAL lamp_nbp& ' IF z_correctionx%<>0 z_ox=zoom%/z_correctionx% ENDIF IF z_correctiony%<>0 z_oy=zoom%/z_correctiony% ENDIF set_type_de_ligne(jaune&,1,1,0,0,-1) set_remplissage(2,8,jaune&,-1) ' {zoo%}=zoom% {ADD(zoo%,4)}=z_correctionx% {ADD(zoo%,8)}=zoom% {ADD(zoo%,12)}=z_correctiony% ' IF true_color! inquire_color_representation(jaune&,r&,v&,b&,vdihandle%) BYTE{ADD(tracer_param_tab%,1)}=r&*0.255 BYTE{ADD(tracer_param_tab%,2)}=v&*0.255 BYTE{ADD(tracer_param_tab%,3)}=b&*0.255 ELSE {tracer_param_tab%}=jaune& ENDIF CARD{ADD(tracer_param_tab%,8)}=1 ! Contour actif CARD{ADD(tracer_param_tab%,10)}=0 ! Tramage inactif CARD{tracer_trame_tab%}=&HFFFF {ADD(tracer_trace_tab%,16)}=coord_polygon% {ADD(tracer_trace_tab%,30)}=physique% ' origx&=mix& origy&=miy& dans_quelle_vue(origx&,origy&) ' tp1%=tr_tmp% tp2%=ADD(tr_tmp%,12) tp3%=ADD(tr_tmp%,24) ' {ADD(tracer_proj2d%,16)}=tr_tmp% {ADD(tracer_proj2d%,28)}=vue| {ADD(tracer_proj2d%,32)}=origx& {ADD(tracer_proj2d%,36)}=origy& ' adr_sr%=@adresse_source(lum&) CLR nbpo% coord%=ADD(coord_polygon%,4) ' spot!=BTST(BYTE{ADD(adr_sr%,1)},bit_spot|) coordonnee_source_de_lumiere(vue|,adr_sr%,spot!,cx,cy,vx,vy) px&=origx&+(cx*z_ox) py&=origy&+(cy*z_oy) graf_mouse(m_off&,0) vdi_11(5,px&,py&,0,0,5,5,0,0) graf_mouse(m_on&,0) IF spot! ' L…, c'est le dessin du lamp_nbp&=32 ! projecteur qui est objet_projecteur ! utilis‚ ' ' Le lien du spot a son disque xv&=origx&+(vx*z_ox) yv&=origy&+(vy*z_oy) ' {coord%}=tracer_param_tab% INT{ADD(coord%,4)}=px& INT{ADD(coord%,6)}=py& INT{ADD(coord%,8)}=xv& INT{ADD(coord%,10)}=yv& INT{ADD(coord%,12)}=px& INT{ADD(coord%,14)}=py& ' INC nbpo% ADD coord%,16 tx&=xv& ty&=yv& ELSE ' Par d‚faut, le dessin lamp_nbp&=26 ! du soleil est activ‚. objet_soleil ' tx&=origx& ty&=origy& ENDIF IF camera_visible! calcul_des_angles_spot(adr_sr%,rotation_spotx,rotation_spoty) bmove(ADD(objet_proj%,2),transfert%,MUL(lamp_nbp&,12)) panx=ROUND(SINGLE{ADD(adr_sr%,8)},3) pany=ROUND(SINGLE{ADD(adr_sr%,12)},3) panz=ROUND(SINGLE{ADD(adr_sr%,16)},3) $S|,$S< SELECT vue| CASE vue_de_face|,vue_de_dos| matrice_zyx(rotation_spotx,rotation_spoty,0,matrice%) CASE vue_de_gauche|,vue_de_droite|,vue_de_dessus|,vue_de_dessous| matrice_zyx(0,180,0,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=2 {ADD(matrice%,4)}=2 {ADD(matrice%,8)}=2 {ADD(tracer_rotattrans%,32)}=lamp_nbp& {ADD(tracer_rotattrans%,36)}=0 {ADD(tracer_rotattrans%,40)}=0 {ADD(tracer_rotattrans%,44)}=0 ro_tr(tracer_rotattrans%) matrice_zyx(-rotation_spotx,-rotation_spoty,0,matrice%) ENDSELECT ' ******** Echelle + Rotation + Translation {matrice%}=70 {ADD(matrice%,4)}=70 {ADD(matrice%,8)}=70 {ADD(tracer_rotattrans%,32)}=lamp_nbp& {ADD(tracer_rotattrans%,36)}=panx*1024 {ADD(tracer_rotattrans%,40)}=pany*1024 {ADD(tracer_rotattrans%,44)}=panz*1024 ro_tr(tracer_rotattrans%) ' i%=@adresse_face(objet_proj%) CLR i& DO {coord%}=tracer_param_tab% {ADD(tracer_proj2d%,20)}=ADD(coord%,4) ' BMOVE ADD(transfert%,MUL(CARD{i%},12)),tp1%,12 BMOVE ADD(transfert%,MUL(CARD{ADD(i%,2)},12)),tp2%,12 BMOVE tp1%,tp3%,12 ' c2d2d(tracer_proj2d%) ' INC nbpo% ADD coord%,16 ADD i%,4 INC i& LOOP WHILE i&<40 IF spot! cone_spot(adr_sr%) bmove(ADD(spot_cone%,2),transfert%,156) tanx=ROUND(SINGLE{ADD(adr_sr%,20)},3)-ROUND(SINGLE{ADD(adr_sr%,8)},3) tany=ROUND(SINGLE{ADD(adr_sr%,24)},3)-ROUND(SINGLE{ADD(adr_sr%,12)},3) tanz=ROUND(SINGLE{ADD(adr_sr%,28)},3)-ROUND(SINGLE{ADD(adr_sr%,16)},3) tan=SQR(tanx^2+tany^2+tanz^2)*2 tan=-tan*(tan<>0)-1*(tan=0) tanx=-tanx*(tanx<>0)-1*(tanx=0) tany=-tany*(tany<>0)-1*(tany=0) tanz=-tanz*(tanz<>0)-1*(tanz=0) panx=ROUND(SINGLE{ADD(adr_sr%,8)},3)+(tanx/2) pany=ROUND(SINGLE{ADD(adr_sr%,12)},3)+(tany/2) panz=ROUND(SINGLE{ADD(adr_sr%,16)},3)+(tanz/2) $S|,$S< SELECT vue| CASE vue_de_face|,vue_de_dos| matrice_zyx(rotation_spotx,rotation_spoty,0,matrice%) CASE vue_de_gauche|,vue_de_droite|,vue_de_dessus|,vue_de_dessous| matrice_zyx(0,180,0,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=2 {ADD(matrice%,4)}=2 {ADD(matrice%,8)}=2 {ADD(tracer_rotattrans%,32)}=13 {ADD(tracer_rotattrans%,36)}=0 {ADD(tracer_rotattrans%,40)}=0 {ADD(tracer_rotattrans%,44)}=0 ro_tr(tracer_rotattrans%) matrice_zyx(-rotation_spotx,-rotation_spoty,0,matrice%) ENDSELECT ' ******** Echelle + Rotation + Translation {matrice%}=tan {ADD(matrice%,4)}=tan {ADD(matrice%,8)}=tan {ADD(tracer_rotattrans%,32)}=13 {ADD(tracer_rotattrans%,36)}=panx*1024 {ADD(tracer_rotattrans%,40)}=pany*1024 {ADD(tracer_rotattrans%,44)}=panz*1024 ro_tr(tracer_rotattrans%) i%=@adresse_face(spot_cone%) CLR i& DO {coord%}=tracer_param_tab% {ADD(tracer_proj2d%,20)}=ADD(coord%,4) ' BMOVE ADD(transfert%,MUL(CARD{i%},12)),tp1%,12 BMOVE ADD(transfert%,MUL(CARD{ADD(i%,2)},12)),tp2%,12 BMOVE tp1%,tp3%,12 ' c2d2d(tracer_proj2d%) ' INC nbpo% ADD coord%,16 ADD i%,4 INC i& LOOP WHILE i&<16 ENDIF ENDIF {coord_polygon%}=nbpo% draw_line(tracer_trace_tab%) ' Le num‚ro de la lampe pour s'y retrouver plus facilement membfill(commande%,3,0) CHAR{commande%}=STR$(SUCC(lum&)) set_text_mode(jaune&,0,0,4,-1,vdihandle%) set_writing_mode(mode_xor|) text(SUB(px&,4),ADD(py&,2),commande%) set_writing_mode(mode_remplace|) ' RETURN > PROCEDURE dessin_des_axes_simples LOCAL origx&,origy& ' set_writing_mode(mode_transparent|) set_text_mode(noir&,0,0,4,-1,vdihandle%) ' origx&=mix& origy&=miy& ' $S|,S> SELECT dessin_3d| CASE vue_de_face| ADD origx&,deplacement_en_x& ADD origy&,deplacement_en_y& CHAR{commande%}="X"+CHR$(0) text(SUB(global_xf2&,6),ADD(origy&,6),commande%) CHAR{commande%}="Y"+CHR$(0) text(ADD(origx&,3),ADD(global_yf&,5),commande%) CASE vue_de_dos| SUB origx&,deplacement_en_x& ADD origy&,deplacement_en_y& CHAR{commande%}="X"+CHR$(0) text(ADD(global_xf&,3),ADD(origy&,6),commande%) CHAR{commande%}="Y"+CHR$(0) text(ADD(origx&,3),ADD(global_yf&,5),commande%) CASE vue_de_gauche| SUB origx&,deplacement_en_z& ADD origy&,deplacement_en_y& CHAR{commande%}="Z"+CHR$(0) text(ADD(global_xf&,3),ADD(origy&,6),commande%) CHAR{commande%}="Y"+CHR$(0) text(ADD(origx&,3),ADD(global_yf&,5),commande%) CASE vue_de_droite| ADD origx&,deplacement_en_z& ADD origy&,deplacement_en_y& CHAR{commande%}="Z"+CHR$(0) text(SUB(global_xf2&,6),ADD(origy&,6),commande%) CHAR{commande%}="Y"+CHR$(0) text(ADD(origx&,3),ADD(global_yf&,5),commande%) CASE vue_de_dessus| ADD origx&,deplacement_en_x& ADD origy&,deplacement_en_z& CHAR{commande%}="Z"+CHR$(0) text(ADD(origx&,3),ADD(global_yf&,5),commande%) CHAR{commande%}="X"+CHR$(0) text(SUB(global_xf2&,6),ADD(origy&,6),commande%) CASE vue_de_dessous| ADD origx&,deplacement_en_x& SUB origy&,deplacement_en_z& CHAR{commande%}="X"+CHR$(0) text(SUB(global_xf2&,6),ADD(origy&,6),commande%) CHAR{commande%}="Z"+CHR$(0) text(ADD(origx&,3),global_yf2&,commande%) ENDSELECT CHAR{commande%}="0"+CHR$(0) text(ADD(origx&,3),ADD(origy&,6),commande%) ' {ADD(tracer_trace_tab%,16)}=coord_polygon% {ADD(tracer_trace_tab%,30)}=physique% {coord_polygon%}=0 {ADD(coord_polygon%,4)}=tracer_param_axe% ' INT{ADD(coord_polygon%,8)}=global_xf& INT{ADD(coord_polygon%,10)}=origy& INT{ADD(coord_polygon%,12)}=global_xf2& INT{ADD(coord_polygon%,14)}=origy& draw_line(tracer_trace_tab%) ' INT{ADD(coord_polygon%,8)}=origx& INT{ADD(coord_polygon%,10)}=global_yf& INT{ADD(coord_polygon%,12)}=origx& INT{ADD(coord_polygon%,14)}=global_yf2& draw_line(tracer_trace_tab%) ' set_writing_mode(mode_remplace|) ' RETURN ' ****************************************************************************** > PROCEDURE mesurer_des_distances ! C'est toujours utile de savoir LOCAL x_f&,y_f& LOCAL clic& LOCAL px0,py0,px1,py1 CLR px1,py1,clic& px0=-32768 py0=-32768 graf_mouse(reticule_mince&,0) ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) ' videsouris CHAR{{OB_SPEC(adr_fenetre%,fenvue02&)}}=CHAR{OB_SPEC(adr_divers%,distance&)} redraw_element_fenetre(48,adr_fenetre%,fenvue02&) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) IF global_mk&=1 IF global_mx&>global_xf& AND global_my&>global_yf& AND global_mx&global_amx& OR global_my&<>global_amy& $S&,$S> SELECT clic& CASE 0 afficher_coordonnees(FALSE) set_clipping_rectangle(1,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) croix_de_depart(px0,py0) set_clipping_rectangle(0,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) CASE 1 afficher_distances(px0,py0,px1,py1) set_clipping_rectangle(1,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) croix_de_depart(px0,py0) set_writing_mode(mode_xor|) IF global_amx&<>-1 OR global_amy&<>-1 ligne_de_distance(px0,py0,global_amx&,global_amy&) ENDIF ligne_de_distance(px0,py0,global_mx&,global_my&) set_clipping_rectangle(0,global_xf&,global_yf&,global_xf2&,global_yf2&,0,0) set_writing_mode(mode_remplace|) ENDSELECT global_amx&=global_mx& global_amy&=global_my& ENDIF EXIT IF clic&=2 OR global_mk&=2 LOOP IF clic&>0 ENDIF videsouris CHAR{{OB_SPEC(adr_fenetre%,fenvue02&)}}=CHAR{titre_en_cours%} redraw_element_fenetre(48,adr_fenetre%,fenvue02&) graf_mouse(fleche&,0) souris|=6 asouris|=6 redraw_force(24,24) videsouris un_clic!=TRUE RETURN > PROCEDURE afficher_distances(px0,py0,VAR px,py) LOCAL adr%,origx&,origy&,vecteur LOCAL dx,dy LOCAL cx&,cy&,cw&,ch& LOCAL dx,dy,xm,ym,zm,x&,y& ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) ' IF global_mx&>global_xf& AND global_my&>global_yf& AND global_mx& SELECT dessin_3d| CASE vue_de_face| ' X+ … droite Y+ en haut origx&=mix&+deplacement_en_x& origy&=miy&+deplacement_en_y& xm=SUB(global_mx&,origx&)*z_correctionx%/zoom% ym=-SUB(global_my&,origy&)*z_correctiony%/zoom% IF px0<>-32768 OR py0<>-32768 dx=ABS(xm-px0) dy=ABS(ym-py0) vecteur=SQR(dx^2+dy^2) CHAR{adr%}=" X Y Dx : "+STR$(dx,10,3)+" Dy : "+STR$(dy,10,3)+" Longeur : "+STR$(vecteur,10,3) ELSE CHAR{adr%}=" X : "+STR$(xm,10,3)+" Y : "+STR$(ym,10,3)+" " ENDIF px=xm py=ym CASE vue_de_dos| ' X+ … gauche Y+ en haut origx&=mix&-deplacement_en_x& origy&=miy&+deplacement_en_y& xm=-SUB(global_mx&,origx&)*z_correctionx%/zoom% ym=-SUB(global_my&,origy&)*z_correctiony%/zoom% IF px0<>-32768 OR py0<>-32768 dx=ABS(xm-px0) dy=ABS(ym-py0) vecteur=SQR(dx^2+dy^2) CHAR{adr%}=" X Y Dx : "+STR$(dx,10,3)+" Dy : "+STR$(dy,10,3)+" Longeur : "+STR$(vecteur,10,3) ELSE CHAR{adr%}=" X : "+STR$(xm,10,3)+" Y : "+STR$(ym,10,3)+" " ENDIF px=xm py=ym CASE vue_de_gauche| ' Z+ … gauche Y+ en haut origx&=mix&-deplacement_en_z& origy&=miy&+deplacement_en_y& zm=-SUB(global_mx&,origx&)*z_correctionx%/zoom% ym=-SUB(global_my&,origy&)*z_correctiony%/zoom% IF px0<>-32768 OR py0<>-32768 dx=ABS(zm-px0) dy=ABS(ym-py0) vecteur=SQR(dx^2+dy^2) CHAR{adr%}=" Z Y Dz : "+STR$(dx,10,3)+" Dy : "+STR$(dy,10,3)+" Longeur : "+STR$(vecteur,10,3) ELSE CHAR{adr%}=" Z : "+STR$(zm,10,3)+" Y : "+STR$(ym,10,3)+" " ENDIF px=zm py=ym CASE vue_de_droite| ' Z+ … droite Y+ en haut origx&=mix&+deplacement_en_z& origy&=miy&+deplacement_en_y& zm=SUB(global_mx&,origx&)*z_correctionx%/zoom% ym=-SUB(global_my&,origy&)*z_correctiony%/zoom% IF px0<>-32768 OR py0<>-32768 dx=ABS(zm-px0) dy=ABS(ym-py0) vecteur=SQR(dx^2+dy^2) CHAR{adr%}=" Z Y Dz : "+STR$(dx,10,3)+" Dy : "+STR$(dy,10,3)+" Longeur : "+STR$(vecteur,10,3) ELSE CHAR{adr%}=" Z : "+STR$(zm,10,3)+" Y : "+STR$(ym,10,3)+" " ENDIF px=zm py=ym CASE vue_de_dessus| ' X+ … droite Z+ en haut origx&=mix&+deplacement_en_x& origy&=miy&+deplacement_en_z& xm=SUB(global_mx&,origx&)*z_correctionx%/zoom% zm=-SUB(global_my&,origy&)*z_correctiony%/zoom% IF px0<>-32768 OR py0<>-32768 dx=ABS(xm-px0) dy=ABS(zm-py0) vecteur=SQR(dx^2+dy^2) CHAR{adr%}=" X Z Dx : "+STR$(dx,10,3)+" Dz : "+STR$(dy,10,3)+" Longeur : "+STR$(vecteur,10,3) ELSE CHAR{adr%}=" X : "+STR$(xm,10,3)+" Z : "+STR$(zm,10,3)+" " ENDIF px=xm py=zm CASE vue_de_dessous| ' X+ … droite Z+ en bas origx&=mix&+deplacement_en_x& origy&=miy&-deplacement_en_z& xm=SUB(global_mx&,origx&)*z_correctionx%/zoom% zm=SUB(global_my&,origy&)*z_correctiony%/zoom% IF px0<>-32768 OR py0<>-32768 dx=ABS(xm-px0) dy=ABS(zm-py0) vecteur=SQR(dx^2+dy^2) CHAR{adr%}=" X Z Dx : "+STR$(dx,10,3)+" Dz : "+STR$(dy,10,3)+" Longeur : "+STR$(vecteur,10,3) ELSE CHAR{adr%}=" X : "+STR$(xm,10,3)+" Z : "+STR$(zm,10,3)+" " ENDIF px=xm py=zm ENDSELECT CHAR{{OB_SPEC(adr_fenetre%,fenvue06&)}}=CHAR{adr%} redraw_element_fenetre(48,adr_fenetre%,fenvue06&) ENDIF RETURN > PROCEDURE croix_de_depart(px0,py0) LOCAL rx&,ry& coordonnees_sur_ecran(px0,py0,rx&,ry&) set_type_de_ligne(jaune&,3,1,0,0,-1) line(SUB(rx&,5),SUB(ry&,5),ADD(rx&,5),ADD(ry&,5)) line(SUB(rx&,5),ADD(ry&,5),ADD(rx&,5),SUB(ry&,5)) RETURN > PROCEDURE ligne_de_distance(px0,py0,sx&,sy&) LOCAL rx&,ry& coordonnees_sur_ecran(px0,py0,rx&,ry&) set_type_de_ligne(noir&,1,3,0,0,-1) line(rx&,ry&,sx&,sy&) set_type_de_ligne(noir&,1,1,0,0,-1) line(SUB(sx&,5),sy&,ADD(sx&,5),sy&) line(sx&,SUB(sy&,5),sx&,ADD(sy&,5)) RETURN > PROCEDURE coordonnees_sur_ecran(pxo,pyo,VAR ix&,iy&) LOCAL rx,ry,origx&,origy&,milx&,mily& LOCAL cx&,cy&,cx&,cy& ' la_fenetre(fen_act&,global_xf&,global_yf&,global_wf&,global_hf&) calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) milx&=mix& mily&=miy& ' $S|,$S> SELECT dessin_3d| CASE vue_de_face| origx&=milx&+deplacement_en_x& origy&=mily&+deplacement_en_y& rx=pxo ry=-pyo CASE vue_de_dos| origx&=milx&-deplacement_en_x& origy&=mily&+deplacement_en_y& rx=-pxo ry=-pyo CASE vue_de_gauche| origx&=milx&-deplacement_en_z& origy&=mily&+deplacement_en_y& rx=-pxo ry=-pyo CASE vue_de_droite| origx&=milx&+deplacement_en_z& origy&=mily&+deplacement_en_y& rx=pxo ry=-pyo CASE vue_de_dessus| origx&=milx&+deplacement_en_x& origy&=mily&+deplacement_en_z& rx=pxo ry=-pyo CASE vue_de_dessous| origx&=milx&+deplacement_en_x& origy&=mily&-deplacement_en_z& rx=pxo ry=pyo ENDSELECT IF ROUND(origx&+(rx*zoom%/z_correctionx%))>32000 ix&=32000 ELSE IF ROUND(origx&+(rx*zoom%/z_correctionx%))<-32000 ix&=-32000 ELSE ix&=ROUND(origx&+(rx*zoom%/z_correctionx%)) ENDIF IF ROUND(origy&+(ry*zoom%/z_correctiony%))>32000 ix&=32000 ELSE IF ROUND(origy&+(ry*zoom%/z_correctiony%))<-32000 iy&=-32000 ELSE iy&=ROUND(origy&+(ry*zoom%/z_correctiony%)) ENDIF RETURN > PROCEDURE ecrire_zoom_dans_outils(ind!) CHAR{{OB_SPEC(adr_outils%,izoom&)}}=STR$(zoom%/1024,6,2) IF ind! redraw_element_fenetre(2,adr_outils%,izoom&) ENDIF RETURN ' ****************************** Les primitives ******************************** > PROCEDURE segment ' **************************************************************************** ' **** Primitive de base : Le segment de droite ' **** 2 points ' **** taille : (2 * 12 octets) + 2 octets ' **** soit : 26 octets ' **** 2 faces de 3 points chacunes ' **** taille : (2 * 6 octets) + 2 octets ' **** soit : 14 octets ' **** Taille totale : 40 octets ' **************************************************************************** ' D‚calage d'offset : 0 LOCAL adrp%,adrf%,i%,x,y,z ' adrp%={objet%} CARD{adrp%}=1 ' ---------------------------------------------------------------------------- RESTORE segmentdata i%=ADD(adrp%,2) READ x,y,z {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ADD i%,12 READ x,y,z {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ' ---------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) CARD{adrf%}=1 ' i%=ADD(adrf%,2) CARD{i%}=0 CARD{ADD(i%,2)}=1 CARD{ADD(i%,4)}=0 ADD i%,6 CARD{i%}=1 CARD{ADD(i%,2)}=0 CARD{ADD(i%,4)}=1 ' ---------------------------------------------------------------------------- segmentdata: ' Les points DATA -1,0,0 DATA 1,0,0 ' RETURN > PROCEDURE boite(rapp&) ' **************************************************************************** ' **** Primitive de base : La boŒte ' **** : Le tronc de pyramide ' **** : La pyramide ' **** 8 points ' **** taille : (8 * 12 octets) + 2 octets ' **** soit : 98 octets ' **** 12 faces de 3 points chacunes ' **** taille : (12 * 6 octets) + 2 octets ' **** soit : 74 octets ' **** Taille totale : 172 octets ' **************************************************************************** ' D‚calage d'offset : 4 LOCAL adrp%,adrf%,i%,x,y,z,i&,x& ' adrp%={ADD(objet%,4)} CARD{adrp%}=7 ' ---------------------------------------------------------------------------- RESTORE boitedata i%=ADD(adrp%,2) CLR i& DO READ x,y,z IF y=1 {i%}=x*1024*(rapp&/100) {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024*(rapp&/100) ELSE {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ENDIF ADD i%,12 INC i& LOOP WHILE i&<8 ' ---------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) CARD{adrf%}=11 ' i%=ADD(adrf%,2) CLR i& DO READ x& CARD{i%}=x& READ x& CARD{ADD(i%,2)}=x& READ x& CARD{ADD(i%,4)}=x& ADD i%,6 INC i& LOOP WHILE i&<12 ' ---------------------------------------------------------------------------- boitedata: ' Les points DATA -1, 1,-1 DATA 1, 1,-1 DATA 1,-1,-1 DATA -1,-1,-1 DATA -1, 1, 1 DATA 1, 1, 1 DATA 1,-1, 1 DATA -1,-1, 1 ' Les faces DATA 0,1,2 DATA 2,3,0 ' DATA 4,7,6 DATA 6,5,4 ' DATA 1,5,6 DATA 6,2,1 ' DATA 0,3,7 DATA 7,4,0 ' DATA 0,4,5 DATA 5,1,0 ' DATA 3,2,6 DATA 6,7,3 ' RETURN > PROCEDURE sphere LOCAL x&,x,y,z ' **************************************************************************** ' **** Primitive de base : La sphŠre ' **** Nouvelle version g‚od‚sique depuis de 05/11/2000 ' **** ' **** 102 points ' **** taille : (102 * 12 octets) + 2 octets ' **** soit : 1226 octets ' **** 200 faces de 3 points chacunes ' **** total de 200 faces ' **** taille : (200 * 6 octets) + 2 octets ' **** soit : 1202 octets ' **** Taille totale : 2428 octets ' **************************************************************************** ' **** Primitive de base : La sphŠre simplifi‚e ' **** 27 points ' **** taille : (27 * 12 octets) + 2 octets ' **** soit : 326 octets ' **** 48 faces de 3 points chacunes ' **** total de 48 faces ' **** taille : (48 * 6 octets) + 2 octets ' **** soit : 290 octets ' **** Taille totale : 616 ' **************************************************************************** ' D‚calage d'offset : 8 LOCAL adrp%,adrf%,i%,i&,angle2&,x&,j& ' adrp%={ADD(objet%,8)} IF primitives_simples! ' ---------------------------------------------------------------------------- i%=ADD(adrp%,2) {i%}=0 {ADD(i%,4)}=1*1024 {ADD(i%,8)}=0 ADD i%,12 ' -------------------------------------------------------------------------- CARD{adrp%}=26 ' angle2&=45 DO CLR j& DO {i%}=SINQ(angle2&)*SINQ(j&)*1024 {ADD(i%,4)}=COSQ(angle2&)*1024 {ADD(i%,8)}=-SINQ(angle2&)*COSQ(j&)*1024 ADD i%,12 ADD j&,45 LOOP WHILE j&<360 ADD angle2&,45 LOOP WHILE angle2&<180 ' {i%}=0 {ADD(i%,4)}=-1*1024 {ADD(i%,8)}=0 ' -------------------------------------------------------------------------- RESTORE spheredata2 adrf%=@adresse_face(adrp%) CARD{adrf%}=47 ' i%=ADD(adrf%,2) CLR i& DO READ x& CARD{i%}=x& READ x& CARD{ADD(i%,2)}=x& READ x& CARD{ADD(i%,4)}=x& ADD i%,6 INC i& LOOP WHILE i&<48 ' -------------------------------------------------------------------------- ELSE !*********************************************************************** ' -------------------------------------------------------------------------- CARD{adrp%}=101 ' RESTORE spheredata i%=ADD(adrp%,2) CLR i& DO READ x,y,z {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ADD i%,12 INC i& LOOP WHILE i&<102 ' -------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) CARD{adrf%}=199 ' i%=ADD(adrf%,2) CLR i& DO READ x& CARD{i%}=x& READ x& CARD{ADD(i%,2)}=x& READ x& CARD{ADD(i%,4)}=x& ADD i%,6 INC i& LOOP WHILE i&<200 ENDIF spheredata: ' ********** Les points DATA 0,1,0 DATA 0.309,0.949,0 DATA 0,0.949,0.309 DATA 0,-1,0 DATA 0.309,-0.949,0 DATA 0,-0.949,0.309 DATA -0.309,0.949,0 DATA -0.309,-0.949,0 DATA 0,0.949,-0.309 DATA 0,-0.949,-0.309 DATA 0.587,0.809,0 DATA 0.321,0.889,0.321 DATA 0.321,0.889,-0.321 DATA 0.587,-0.809,0 DATA 0.321,-0.889,0.321 DATA 0.321,-0.889,-0.321 DATA 0,0.809,0.587 DATA -0.321,0.889,0.321 DATA 0,-0.809,0.587 DATA -0.321,-0.889,0.321 DATA -0.587,0.809,0 DATA -0.321,0.889,-0.321 DATA -0.587,-0.809,0 DATA -0.321,-0.889,-0.321 DATA 0,0.809,-0.587 DATA 0,-0.809,-0.587 DATA 0.809,0.587,0 DATA 0.625,0.7,0.34 DATA 0.625,0.7,-0.34 DATA 0.809,-0.587,0 DATA 0.625,-0.7,0.34 DATA 0.625,-0.7,-0.34 DATA 0,0.587,0.809 DATA -0.34,0.7,0.625 DATA 0.34,0.7,0.625 DATA 0,-0.587,0.809 DATA -0.34,-0.7,0.625 DATA 0.34,-0.7,0.625 DATA -0.809,0.587,0 DATA -0.625,0.7,-0.34 DATA -0.625,0.7,0.34 DATA -0.809,-0.587,0 DATA -0.625,-0.7,-0.34 DATA -0.625,-0.7,0.34 DATA 0,0.587,-0.809 DATA 0.34,0.7,-0.625 DATA -0.34,0.7,-0.625 DATA 0,-0.587,-0.809 DATA 0.34,-0.7,-0.625 DATA -0.34,-0.7,-0.625 DATA 0.949,0.309,0 DATA 0.854,0.389,0.344 DATA 0.854,0.389,-0.344 DATA 0.949,-0.309,0 DATA 0.854,-0.389,0.344 DATA 0.854,-0.389,-0.344 DATA 0,0.309,0.949 DATA -0.344,0.389,0.854 DATA 0.344,0.389,0.854 DATA 0,-0.309,0.949 DATA -0.344,-0.389,0.854 DATA 0.344,-0.389,0.854 DATA -0.949,0.309,0 DATA -0.854,0.389,-0.344 DATA -0.854,0.389,0.344 DATA -0.949,-0.309,0 DATA -0.854,-0.389,-0.344 DATA -0.854,-0.389,0.344 DATA 0,0.309,-0.949 DATA 0.344,0.389,-0.854 DATA -0.344,0.389,-0.854 DATA 0,-0.309,-0.949 DATA 0.344,-0.389,-0.854 DATA -0.344,-0.389,-0.854 DATA 0.642,0.417,0.642 DATA 0.642,-0.417,0.642 DATA -0.642,0.417,0.642 DATA -0.642,-0.417,0.642 DATA -0.642,0.417,-0.642 DATA -0.642,-0.417,-0.642 DATA 0.642,0.417,-0.642 DATA 0.642,-0.417,-0.642 DATA 1,0,0 DATA 0.949,0,0.309 DATA 0.949,0,-0.309 DATA 0,0,1 DATA -0.309,0,0.949 DATA 0.309,0,0.949 DATA -1,0,0 DATA -0.949,0,-0.309 DATA -0.949,0,0.309 DATA 0,0,-1 DATA 0.309,0,-0.949 DATA -0.309,0,-0.949 DATA 0.809,0,0.587 DATA -0.587,0,0.809 DATA -0.809,0,-0.587 DATA 0.587,0,-0.809 DATA 0.587,0,0.809 DATA -0.809,0,0.587 DATA -0.587,0,-0.809 DATA 0.809,0,-0.587 ' --------------------- Les faces ' Demie sphŠre du haut DATA 0,2,1 DATA 0,6,2 DATA 0,8,6 DATA 0,1,8 ' DATA 1,2,11 DATA 2,16,11 DATA 2,17,16 DATA 2,6,17 DATA 6,20,17 DATA 6,21,20 DATA 6,8,21 DATA 8,24,21 DATA 8,12,24 DATA 8,1,12 DATA 1,10,12 DATA 1,11,10 ' DATA 10,11,27 DATA 11,34,27 DATA 11,16,34 DATA 16,32,34 DATA 16,33,32 DATA 16,17,33 DATA 17,40,33 DATA 17,20,40 DATA 20,38,40 DATA 20,39,38 DATA 20,21,39 DATA 21,46,39 DATA 21,24,46 DATA 24,44,46 DATA 24,45,44 DATA 24,12,45 DATA 12,28,45 DATA 12,10,28 DATA 10,26,28 DATA 10,27,26 ' DATA 26,27,51 DATA 27,74,51 DATA 27,34,74 DATA 34,58,74 DATA 34,32,58 DATA 32,56,58 DATA 32,57,56 DATA 32,33,57 DATA 33,76,57 DATA 33,40,76 DATA 40,64,76 DATA 40,38,64 DATA 38,62,64 DATA 38,63,62 DATA 38,39,63 DATA 39,78,63 DATA 39,46,78 DATA 46,70,78 DATA 46,44,70 DATA 44,68,70 DATA 44,69,68 DATA 44,45,69 DATA 45,80,69 DATA 45,28,80 DATA 28,52,80 DATA 28,26,52 DATA 26,50,52 DATA 26,51,50 ' DATA 50,51,83 DATA 51,94,83 DATA 51,74,94 DATA 74,98,94 DATA 74,58,98 DATA 58,87,98 DATA 58,56,87 DATA 56,85,87 DATA 56,86,85 DATA 56,57,86 DATA 57,95,86 DATA 57,76,95 DATA 76,99,95 DATA 76,64,99 DATA 64,90,99 DATA 64,62,90 DATA 62,88,90 DATA 62,89,88 DATA 62,63,89 DATA 63,96,89 DATA 63,78,96 DATA 78,100,96 DATA 78,70,100 DATA 70,93,100 DATA 70,68,93 DATA 68,91,93 DATA 68,92,91 DATA 68,69,92 DATA 69,97,92 DATA 69,80,97 DATA 80,101,97 DATA 80,52,101 DATA 52,84,101 DATA 52,50,84 DATA 50,82,84 DATA 50,83,82 ' Demie sphŠre du bas DATA 3,4,5 DATA 3,5,7 DATA 3,7,9 DATA 3,9,4 ' DATA 4,14,5 DATA 5,14,18 DATA 5,18,19 DATA 5,19,7 DATA 7,19,22 DATA 7,22,23 DATA 7,23,9 DATA 9,23,25 DATA 9,25,15 DATA 9,15,4 DATA 4,15,13 DATA 4,13,14 ' DATA 13,30,14 DATA 14,30,37 DATA 14,37,18 DATA 18,37,35 DATA 18,35,36 DATA 18,36,19 DATA 19,36,43 DATA 19,43,22 DATA 22,43,41 DATA 22,41,42 DATA 22,42,23 DATA 23,42,49 DATA 23,49,25 DATA 25,49,47 DATA 25,47,48 DATA 25,48,15 DATA 15,48,31 DATA 15,31,13 DATA 13,31,29 DATA 13,29,30 ' DATA 29,54,30 DATA 30,54,75 DATA 30,75,37 DATA 37,75,61 DATA 37,61,35 DATA 35,61,59 DATA 35,59,60 DATA 35,60,36 DATA 36,60,77 DATA 36,77,43 DATA 43,77,67 DATA 43,67,41 DATA 41,67,65 DATA 41,65,66 DATA 41,66,42 DATA 42,66,79 DATA 42,79,49 DATA 49,79,73 DATA 49,73,47 DATA 47,73,71 DATA 47,71,72 DATA 47,72,48 DATA 48,72,81 DATA 48,81,31 DATA 31,81,55 DATA 31,55,29 DATA 29,55,53 DATA 29,53,54 ' DATA 53,83,54 DATA 54,83,94 DATA 54,94,75 DATA 75,94,98 DATA 75,98,61 DATA 61,98,87 DATA 61,87,59 DATA 59,87,85 DATA 59,85,86 DATA 59,86,60 DATA 60,86,95 DATA 60,95,77 DATA 77,95,99 DATA 77,99,67 DATA 67,99,90 DATA 67,90,65 DATA 65,90,88 DATA 65,88,89 DATA 65,89,66 DATA 66,89,96 DATA 66,96,79 DATA 79,96,100 DATA 79,100,73 DATA 73,100,93 DATA 73,93,71 DATA 71,93,91 DATA 71,91,92 DATA 71,92,72 DATA 72,92,97 DATA 72,97,81 DATA 81,97,101 DATA 81,101,55 DATA 55,101,84 DATA 55,84,53 DATA 53,84,82 DATA 53,82,83 ' spheredata2: ' Les faces DATA 1,0,2 DATA 2,0,3 DATA 3,0,4 DATA 4,0,5 DATA 5,0,6 DATA 6,0,7 DATA 7,0,8 DATA 8,0,1 ' DATA 1, 2,10 DATA 10, 9, 1 DATA 2, 3,11 DATA 11,10, 2 DATA 3, 4,12 DATA 12,11, 3 DATA 4, 5,13 DATA 13,12, 4 DATA 5, 6,14 DATA 14,13, 5 DATA 6, 7,15 DATA 15,14, 6 DATA 7, 8,16 DATA 16,15, 7 DATA 8, 1, 9 DATA 9,16, 8 ' DATA 9,10,18 DATA 18,17, 9 DATA 10,11,19 DATA 19,18,10 DATA 11,12,20 DATA 20,19,11 DATA 12,13,21 DATA 21,20,12 DATA 13,14,22 DATA 22,21,13 DATA 14,15,23 DATA 23,22,14 DATA 15,16,24 DATA 24,23,15 DATA 16, 9,17 DATA 17,24,16 ' DATA 17,18,25 DATA 18,19,25 DATA 19,20,25 DATA 20,21,25 DATA 21,22,25 DATA 22,23,25 DATA 23,24,25 DATA 24,17,25 ' RETURN > PROCEDURE prisme ' **************************************************************************** ' **** Primitive de base : Le prisme ' **** 6 points ' **** taille : (6 * 12 octets) + 2 octets ' **** soit : 74 octets ' **** 8 faces de 3 points chacunes ' **** total de 8 faces ' **** taille : (8 * 6 octets) + 2 octets ' **** soit : 50 octets ' **** Taille totale : 124 octets ' **************************************************************************** ' D‚calage d'offset : 12 LOCAL adrp%,adrf%,i%,x,y,z,i&,x& ' adrp%={ADD(objet%,12)} CARD{adrp%}=5 ' ---------------------------------------------------------------------------- RESTORE prismedata CLR i& i%=ADD(adrp%,2) DO READ x,y,z {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ADD i%,12 INC i& LOOP WHILE i&<6 ' ---------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) CARD{adrf%}=7 ' i%=ADD(adrf%,2) CLR i& DO READ x& CARD{i%}=x& READ x& CARD{ADD(i%,2)}=x& READ x& CARD{ADD(i%,4)}=x& ADD i%,6 INC i& LOOP WHILE i&<8 ' ---------------------------------------------------------------------------- prismedata: ' Les points DATA -1,-1,-1 DATA 0, 1,-1 DATA 1,-1,-1 DATA -1,-1, 1 DATA 0, 1, 1 DATA 1,-1, 1 ' Les faces DATA 0,1,2 DATA 3,5,4 DATA 1,4,5 DATA 5,2,1 DATA 0,3,4 DATA 4,1,0 DATA 0,2,5 DATA 5,3,0 ' RETURN > PROCEDURE triangle(adr_uni%) ' **************************************************************************** ' **** Primitive de base : Le triangle ' **** 3 points ' **** taille : (3 * 12 octets) + 2 octets ' **** soit : 38 octets ' **** 2 faces de 3 points chacunes ' **** taille : (2 * 6 octets) + 2 octets ' **** soit : 14 octets ' **** Taille totale : 52 octets ' **************************************************************************** ' D‚calage d'offset : 16 LOCAL adrp%,adrf%,i% ' adrp%={ADD(objet%,16)} CARD{adrp%}=2 ' ---------------------------------------------------------------------------- i%=ADD(adrp%,2) ' {i%}=ROUND(ROUND(SINGLE{ADD(adr_uni%,2)},3)*1024) {ADD(i%,4)}=ROUND(ROUND(SINGLE{ADD(adr_uni%,6)},3)*1024) {ADD(i%,8)}=ROUND(ROUND(SINGLE{ADD(adr_uni%,10)},3)*1024) ADD i%,12 {i%}=ROUND(ROUND(SINGLE{ADD(adr_uni%,14)},3)*1024) {ADD(i%,4)}=ROUND(ROUND(SINGLE{ADD(adr_uni%,18)},3)*1024) {ADD(i%,8)}=ROUND(ROUND(SINGLE{ADD(adr_uni%,22)},3)*1024) ADD i%,12 {i%}=ROUND(ROUND(SINGLE{ADD(adr_uni%,26)},3)*1024) {ADD(i%,4)}=ROUND(ROUND(SINGLE{ADD(adr_uni%,30)},3)*1024) {ADD(i%,8)}=ROUND(ROUND(SINGLE{ADD(adr_uni%,34)},3)*1024) ' ---------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) CARD{adrf%}=1 ' i%=ADD(adrf%,2) CARD{i%}=0 CARD{ADD(i%,2)}=1 CARD{ADD(i%,4)}=2 ADD i%,6 CARD{i%}=0 CARD{ADD(i%,2)}=1 CARD{ADD(i%,4)}=2 ' ---------------------------------------------------------------------------- RETURN > PROCEDURE tronc_de_cone(rapp&) ' **************************************************************************** ' **** Primitive de base : Le tronc de c“ne ' **** 26 points ' **** taille : (26 * 12 octets) + 2 octets ' **** soit : 314 octets ' **** 48 faces de 3 points chacunes ' **** total de 48 faces ' **** taille : (48 * 6 octets) + 2 octets ' **** soit : 290 octets ' **** Taille totale : 604 octets ' **************************************************************************** ' **** Primitive de base : Le tronc de c“ne simplifi‚ ' **** 18 points ' **** taille : (18 * 12 octets) + 2 octets ' **** soit : 218 octets ' **** 32 faces de 3 points chacunes ' **** total de 32 faces ' **** taille : (32 * 6 octets) + 2 octets ' **** soit : 194 octets ' **** Taille totale : 412 octets ' **************************************************************************** ' D‚calage d'offset : 20 LOCAL adrp%,adrf%,i%,i&,pas&,lim&,angle&,x& ' adrp%={ADD(objet%,20)} IF primitives_simples! CARD{adrp%}=17 pas&=45 lim&=8 ELSE CARD{adrp%}=25 pas&=30 lim&=12 ENDIF ' ---------------------------------------------------------------------------- i%=ADD(adrp%,2) CLR i&,angle& DO {i%}=SINQ(angle&)*(rapp&/100)*1024 {ADD(i%,4)}=1*1024 {ADD(i%,8)}=COSQ(angle&)*(rapp&/100)*1024 ADD angle&,pas& ADD i%,12 INC i& LOOP WHILE i& PROCEDURE hemisphere ' **************************************************************************** ' **** Primitive de base : L'h‚misphŠre ' **** 61 points ' **** taille : (61 * 12 octets) + 2 octets ' **** soit : 734 octets ' **** 119 faces de 3 points chacunes ' **** total de 119 faces ' **** taille : (119 * 6 octets) + 2 octets ' **** soit : 716 octets ' **** Taille totale : 1450 octets ' **************************************************************************** ' **** Primitive de base : L'h‚misphŠre simplifi‚e ' **** 18 points ' **** taille : (18 * 12 octets) + 2 octets ' **** soit : 218 octets ' **** 32 faces de 3 points chacunes ' **** total de 32 faces ' **** taille : (32 * 6 octets) + 2 octets ' **** soit : 194 octets ' **** Taille totale : 412 octets ' **************************************************************************** ' D‚calage d'offset : 24 LOCAL adrp%,adrf%,adr2%,i%,angle2&,j&,x& ' adrp%={ADD(objet%,24)} IF primitives_simples! ' ---------------------------------------------------------------------------- i%=ADD(adrp%,2) {i%}=0 {ADD(i%,4)}=1*1024 {ADD(i%,8)}=0 ADD i%,12 ' ---------------------------------------------------------------------------- CARD{adrp%}=17 ' angle2&=45 DO CLR j& DO {i%}=SINQ(angle2&)*SINQ(j&)*1024 {ADD(i%,4)}=COSQ(angle2&)*1024 {ADD(i%,8)}=-SINQ(angle2&)*COSQ(j&)*1024 ADD i%,12 ADD j&,45 LOOP WHILE j&<360 ADD angle2&,45 LOOP WHILE angle2&<135 ' {i%}=0 {ADD(i%,4)}=0 {ADD(i%,8)}=0 ' CLR j& DO adr2%=ADD(ADD(ADD(adrp%,2),MUL(j&,12)),4) {adr2%}=({adr2%}-512)*2 INC j& LOOP WHILE j&<18 ' -------------------------------------------------------------------------- RESTORE hemispheredata2 adrf%=@adresse_face(adrp%) CARD{adrf%}=31 ' i%=ADD(adrf%,2) CLR i& DO READ x& CARD{i%}=x& READ x& CARD{ADD(i%,2)}=x& READ x& CARD{ADD(i%,4)}=x& ADD i%,6 INC i& LOOP WHILE i&<32 ' -------------------------------------------------------------------------- ELSE ! ********************************************************************** ' -------------------------------------------------------------------------- CARD{adrp%}=60 ' RESTORE hemispheredata i%=ADD(adrp%,2) CLR i& DO READ x,y,z {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ADD i%,12 INC i& LOOP WHILE i&<61 ' -------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) CARD{adrf%}=118 ' i%=ADD(adrf%,2) CLR i& DO READ x& CARD{i%}=x& READ x& CARD{ADD(i%,2)}=x& READ x& CARD{ADD(i%,4)}=x& ADD i%,6 INC i& LOOP WHILE i&<119 ENDIF ' ---------------------------------------------------------------------------- hemispheredata: ' ********** Les points DATA 0,1,0 DATA 0.3,0.88,0 DATA 0,0.88,-0.3 DATA -0.3,0.88,0 DATA 0,0.88,0.3 DATA 0.579,0.6,0 DATA 0.319,0.76,-0.319 DATA 0.319,0.76,0.319 DATA 0,0.6,-0.579 DATA -0.319,0.76,-0.319 DATA -0.579,0.6,0 DATA -0.319,0.76,0.319 DATA 0,0.6,0.579 DATA 0.8,0.159,0 DATA 0.619,0.399,-0.34 DATA 0.619,0.399,0.34 DATA 0,0.159,-0.8 DATA -0.34,0.399,-0.619 DATA 0.34,0.399,-0.619 DATA -0.8,0.159,0 DATA -0.619,0.399,0.34 DATA -0.619,0.399,-0.34 DATA 0,0.159,0.8 DATA 0.34,0.399,0.619 DATA -0.34,0.399,0.619 DATA 0.939,-0.399,0 DATA 0.859,-0.239,-0.34 DATA 0.859,-0.239,0.34 DATA 0,-0.399,-0.939 DATA -0.34,-0.239,-0.859 DATA 0.34,-0.239,-0.859 DATA -0.939,-0.399,0 DATA -0.859,-0.239,0.34 DATA -0.859,-0.239,-0.34 DATA 0,-0.399,0.939 DATA 0.34,-0.239,0.859 DATA -0.34,-0.239,0.859 DATA 0.64,-0.159,-0.64 DATA -0.64,-0.159,-0.64 DATA -0.64,-0.159,0.64 DATA 0.64,-0.159,0.64 DATA 1,-1,0 DATA 0.939,-1,-0.3 DATA 0.939,-1,0.3 DATA 0,-1,-1 DATA -0.3,-1,-0.939 DATA 0.3,-1,-0.939 DATA -1,-1,0 DATA -0.939,-1,0.3 DATA -0.939,-1,-0.3 DATA 0,-1,1 DATA 0.3,-1,0.939 DATA -0.3,-1,0.939 DATA 0.8,-1,-0.579 DATA -0.579,-1,-0.8 DATA -0.8,-1,0.579 DATA 0.579,-1,0.8 DATA 0.579,-1,-0.8 DATA -0.8,-1,-0.579 DATA -0.579,-1,0.8 DATA 0.8,-1,0.579 ' ********** Les faces DATA 0,1,2 DATA 0,2,3 DATA 0,3,4 DATA 0,4,1 DATA 1,6,2 DATA 2,6,8 DATA 2,8,9 DATA 2,9,3 DATA 3,9,10 DATA 3,10,11 DATA 3,11,4 DATA 4,11,12 DATA 4,12,7 DATA 4,7,1 DATA 1,7,5 DATA 1,5,6 DATA 5,14,6 DATA 6,14,18 DATA 6,18,8 DATA 8,18,16 DATA 8,16,17 DATA 8,17,9 DATA 9,17,21 DATA 9,21,10 DATA 10,21,19 DATA 10,19,20 DATA 10,20,11 DATA 11,20,24 DATA 11,24,12 DATA 12,24,22 DATA 12,22,23 DATA 12,23,7 DATA 7,23,15 DATA 7,15,5 DATA 5,15,13 DATA 5,13,14 DATA 13,26,14 DATA 14,26,37 DATA 14,37,18 DATA 18,37,30 DATA 18,30,16 DATA 16,30,28 DATA 16,28,29 DATA 16,29,17 DATA 17,29,38 DATA 17,38,21 DATA 21,38,33 DATA 21,33,19 DATA 19,33,31 DATA 19,31,32 DATA 19,32,20 DATA 20,32,39 DATA 20,39,24 DATA 24,39,36 DATA 24,36,22 DATA 22,36,34 DATA 22,34,35 DATA 22,35,23 DATA 23,35,40 DATA 23,40,15 DATA 15,40,27 DATA 15,27,13 DATA 13,27,25 DATA 13,25,26 DATA 25,42,26 DATA 26,42,53 DATA 26,53,37 DATA 37,53,57 DATA 37,57,30 DATA 30,57,46 DATA 30,46,28 DATA 28,46,44 DATA 28,44,45 DATA 28,45,29 DATA 29,45,54 DATA 29,54,38 DATA 38,54,58 DATA 38,58,33 DATA 33,58,49 DATA 33,49,31 DATA 31,49,47 DATA 31,47,48 DATA 31,48,32 DATA 32,48,55 DATA 32,55,39 DATA 39,55,59 DATA 39,59,36 DATA 36,59,52 DATA 36,52,34 DATA 34,52,50 DATA 34,50,51 DATA 34,51,35 DATA 35,51,56 DATA 35,56,40 DATA 40,56,60 DATA 40,60,27 DATA 27,60,43 DATA 27,43,25 DATA 25,43,41 DATA 25,41,42 DATA 45,44,54 DATA 44,46,54 DATA 46,57,54 DATA 57,53,54 DATA 53,42,54 DATA 42,41,54 DATA 41,43,54 DATA 43,60,54 DATA 60,56,54 DATA 56,51,54 DATA 51,50,54 DATA 50,52,54 DATA 52,59,54 DATA 59,55,54 DATA 55,48,54 DATA 48,47,54 DATA 47,49,54 DATA 49,58,54 DATA 0,0,0 ' hemispheredata2: ' Les faces DATA 1,0,2 DATA 2,0,3 DATA 3,0,4 DATA 4,0,5 DATA 5,0,6 DATA 6,0,7 DATA 7,0,8 DATA 8,0,1 ' DATA 1, 2,10 DATA 10, 9, 1 DATA 2, 3,11 DATA 11,10, 2 DATA 3, 4,12 DATA 12,11, 3 DATA 4, 5,13 DATA 13,12, 4 DATA 5, 6,14 DATA 14,13, 5 DATA 6, 7,15 DATA 15,14, 6 DATA 7, 8,16 DATA 16,15, 7 DATA 8, 1, 9 DATA 9,16, 8 ' DATA 9,10,17 DATA 10,11,17 DATA 11,12,17 DATA 12,13,17 DATA 13,14,17 DATA 14,15,17 DATA 15,16,17 DATA 16, 9,17 ' RETURN > PROCEDURE boite_arrondi(rapp&) ' **************************************************************************** ' **** Primitive de base : La boŒte … bords arrondis ' **** 24 points ' **** taille : (24 * 12 octets) + 2 octets ' **** soit : 290 octets ' **** 44 faces de 3 points chacunes ' **** soit 44 faces au total ' **** taille : (44 * 6 octets) + 2 octets ' **** soit : 266 octets ' **** Taille totale : 556 octets ' **************************************************************************** ' D‚calage d'offset : 28 LOCAL adrp%,adrf%,r%,i%,i&,x& ' r%=(1-(rapp&/100))*1024 ' adrp%={ADD(objet%,28)} CARD{adrp%}=23 ' ---------------------------------------------------------------------------- i%=ADD(adrp%,2) ! Point 0 {i%}=-r% {ADD(i%,4)}=r% {ADD(i%,8)}=-1*1024 ADD i%,12 ! Point 1 {i%}=r% {ADD(i%,4)}=r% {ADD(i%,8)}=-1*1024 ADD i%,12 ! Point 2 {i%}=r% {ADD(i%,4)}=-r% {ADD(i%,8)}=-1*1024 ADD i%,12 ! Point 3 {i%}=-r% {ADD(i%,4)}=-r% {ADD(i%,8)}=-1*1024 ADD i%,12 ! Point 4 {i%}=-1*1024 {ADD(i%,4)}=r% {ADD(i%,8)}=-r% ADD i%,12 ! Point 5 {i%}=-r% {ADD(i%,4)}=1*1024 {ADD(i%,8)}=-r% ADD i%,12 ! Point 6 {i%}=r% {ADD(i%,4)}=1*1024 {ADD(i%,8)}=-r% ADD i%,12 ! Point 7 {i%}=1*1024 {ADD(i%,4)}=r% {ADD(i%,8)}=-r% ADD i%,12 ! Point 8 {i%}=1*1024 {ADD(i%,4)}=-r% {ADD(i%,8)}=-r% ADD i%,12 ! Point 9 {i%}=r% {ADD(i%,4)}=-1*1024 {ADD(i%,8)}=-r% ADD i%,12 ! Point 10 {i%}=-r% {ADD(i%,4)}=-1*1024 {ADD(i%,8)}=-r% ADD i%,12 ! Point 11 {i%}=-1*1024 {ADD(i%,4)}=-r% {ADD(i%,8)}=-r% ADD i%,12 ! Point 12 {i%}=-1*1024 {ADD(i%,4)}=r% {ADD(i%,8)}=r% ADD i%,12 ! Point 13 {i%}=-r% {ADD(i%,4)}=1*1024 {ADD(i%,8)}=r% ADD i%,12 ! Point 14 {i%}=r% {ADD(i%,4)}=1*1024 {ADD(i%,8)}=r% ADD i%,12 ! Point 15 {i%}=1*1024 {ADD(i%,4)}=r% {ADD(i%,8)}=r% ADD i%,12 ! Point 16 {i%}=1*1024 {ADD(i%,4)}=-r% {ADD(i%,8)}=r% ADD i%,12 ! Point 17 {i%}=r% {ADD(i%,4)}=-1*1024 {ADD(i%,8)}=r% ADD i%,12 ! Point 18 {i%}=-r% {ADD(i%,4)}=-1*1024 {ADD(i%,8)}=r% ADD i%,12 ! Point 19 {i%}=-1*1024 {ADD(i%,4)}=-r% {ADD(i%,8)}=r% ADD i%,12 ! Point 20 {i%}=-r% {ADD(i%,4)}=r% {ADD(i%,8)}=1*1024 ADD i%,12 ! Point 21 {i%}=r% {ADD(i%,4)}=r% {ADD(i%,8)}=1*1024 ADD i%,12 ! Point 22 {i%}=r% {ADD(i%,4)}=-r% {ADD(i%,8)}=1*1024 ADD i%,12 ! Point 23 {i%}=-r% {ADD(i%,4)}=-r% {ADD(i%,8)}=1*1024 ' ---------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) RESTORE boitearrondisdata CARD{adrf%}=43 ' i%=ADD(adrf%,2) CLR i& DO READ x& CARD{i%}=x& READ x& CARD{ADD(i%,2)}=x& READ x& CARD{ADD(i%,4)}=x& ADD i%,6 INC i& LOOP WHILE i&<44 boitearrondisdata: ' Les faces DATA 0,1,2 DATA 2,3,0 ' DATA 0, 4, 5 DATA 5, 6, 0 DATA 0, 6, 1 DATA 1, 6, 7 DATA 1, 7, 8 DATA 8, 2, 1 DATA 2, 8, 9 DATA 9,10, 2 DATA 2,10, 3 DATA 3,10,11 DATA 3,11, 4 DATA 4, 0, 3 ' DATA 4,12,13 DATA 13, 5, 4 DATA 5,13,14 DATA 14, 6, 5 DATA 6,14,15 DATA 15, 7, 6 DATA 7,15,16 DATA 16, 8, 7 DATA 8,16,17 DATA 17, 9, 8 DATA 9,17,18 DATA 18,10, 9 DATA 10,18,19 DATA 19,11,10 DATA 11,19,12 DATA 12, 4,11 ' DATA 13,12,20 DATA 20,21,13 DATA 13,21,14 DATA 14,21,15 DATA 21,22,16 DATA 16,15,21 DATA 22,17,16 DATA 23,18,22 DATA 22,18,17 DATA 19,18,23 DATA 23,20,12 DATA 12,19,23 ' DATA 20,23,22 DATA 22,21,20 ' RETURN > PROCEDURE disque(rapp&) ' **************************************************************************** ' **** Primitive de base : Le disque ' **** 24 points ' **** taille : (24 * 12 octets) + 2 octets ' **** soit : 290 octets ' **** 24 faces de 3 points chancunes ' **** taille : (24 * 6 octets) + 2 octets ' **** soit : 146 octets ' **** Taille totale : 436 octets ' **************************************************************************** ' **** Primitive de base : Le disque ' **** 16 points ' **** taille : (16 * 12 octets) + 2 octets ' **** soit : 194 octets ' **** 16 faces de 3 points chancunes ' **** taille : (16 * 6 octets) + 2 octets ' **** soit : 98 octets ' **** Taille totale : 388 octets ' **************************************************************************** ' D‚calage d'offset : 32 LOCAL adrp%,adrf%,i%,pas&,lim&,r,x& ' r=rapp&/100 ' adrp%={ADD(objet%,32)} ' ---------------------------------------------------------------------------- i%=ADD(adrp%,2) IF primitives_simples! CARD{adrp%}=15 pas&=45 lim&=8 ELSE CARD{adrp%}=23 pas&=30 lim&=12 ENDIF ' CLR i&,angle& DO {i%}=SINQ(angle&)*1024 {ADD(i%,4)}=0 {ADD(i%,8)}=COSQ(angle&)*1024 ADD i%,12 ADD angle&,pas& INC i& LOOP WHILE i& PROCEDURE pyramide ' **************************************************************************** ' **** Primitive de base : La pyramide ' **** 5 points ' **** taille : (5 * 12 octets) + 2 octets ' **** soit : 62 octets ' **** 6 faces de 3 points chacunes ' **** total de 6 faces ' **** taille : (6 * 6 octets) + 2 octets ' **** soit : 38 octets ' **** Taille totale : 100 octets ' **************************************************************************** ' D‚calage d'offset : 36 LOCAL adrp%,adrf%,x,y,z,i%,x& ' adrp%={ADD(objet%,36)} CARD{adrp%}=4 ' RESTORE pyramidedata ' ---------------------------------------------------------------------------- i%=ADD(adrp%,2) CLR i& DO READ x,y,z {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ADD i%,12 INC i& LOOP WHILE i&<5 ' ---------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) CARD{adrp%}=5 ' i%=ADD(adr%,2) CLR i& DO READ x& CARD{i%}=x& READ x& CARD{ADD(i%,2)}=x& READ x& CARD{ADD(i%,4)}=x& ADD i%,6 INC i& LOOP WHILE i&<6 ' ---------------------------------------------------------------------------- pyramidedata: ' Les points DATA 0, 1, 0 DATA -1,-1, 1 DATA 1,-1, 1 DATA 1,-1,-1 DATA -1,-1,-1 ' Les faces DATA 0,1,2 DATA 2,3,0 DATA 0,3,4 DATA 4,1,0 DATA 1,4,3 DATA 3,2,1 ' RETURN > PROCEDURE colonne ' **************************************************************************** ' **** Primitive de base : La colonne ' **** 32 points ' **** taille : (32 * 12 octets) + 2 octets ' **** soit : 386 octets ' **** 40 faces de 3 points chacunes ' **** taille : (40 * 6 octets) + 2 octets ' **** soit : 242 octets ' **** Taille totale : 628 octets ' **************************************************************************** ' D‚calage d'offset : 40 LOCAL adrp%,adrf%,x,y,z,i%,x& ' adrp%={ADD(objet%,40)} CARD{adrp%}=31 ' RESTORE colonnedata ' ---------------------------------------------------------------------------- i%=ADD(adrp%,2) CLR i& DO READ x,y,z {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ADD i%,12 INC i& LOOP WHILE i&<16 CLR angle& DO {i%}=SINQ(angle&)*0.6*1024 {ADD(i%,4)}=0.8*1024 {ADD(i%,8)}=-COSQ(angle&)*0.6*1024 ADD i%,12 ADD angle&,45 INC i& LOOP WHILE i&<24 CLR angle& DO {i%}=SINQ(angle&)*0.6*1024 {ADD(i%,4)}=-0.8*1024 {ADD(i%,8)}=-COSQ(angle&)*0.6*1024 ADD i%,12 ADD angle&,45 INC i& LOOP WHILE i&<32 ' ---------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) CARD{adrf%}=39 ' i%=ADD(adrf%,2) CLR i& DO READ x& CARD{i%}=x& READ x& CARD{ADD(i%,2)}=x& READ x& CARD{ADD(i%,4)}=x& ADD i%,6 INC i& LOOP WHILE i&<40 ' ---------------------------------------------------------------------------- colonnedata: ' Les points ' Tˆte de la colonne DATA -1, 1,-1 DATA 1, 1,-1 DATA 1, 0.8,-1 DATA -1, 0.8,-1 DATA -1, 1, 1 DATA 1, 1, 1 DATA 1, 0.8, 1 DATA -1, 0.8, 1 ' Pied de la colonne DATA -1,-0.8,-1 DATA 1,-0.8,-1 DATA 1, -1,-1 DATA -1, -1,-1 DATA -1,-0.8, 1 DATA 1,-0.8, 1 DATA 1, -1, 1 DATA -1, -1, 1 ' Faces ' Tˆte de colonne DATA 0,1,2 DATA 2,3,0 DATA 4,7,6 DATA 6,5,4 DATA 1,5,6 DATA 6,2,1 DATA 0,3,7 DATA 7,4,0 DATA 0,4,5 DATA 5,1,0 DATA 3,2,6 DATA 6,7,3 ' Pied de colonne DATA 8, 9,10 DATA 10,11, 8 DATA 12,15,14 DATA 14,13,12 DATA 11,10,14 DATA 14,15,11 DATA 9,13,14 DATA 14,10, 9 DATA 8,11,15 DATA 15,12, 8 DATA 8,12,13 DATA 13, 9 ,8 ' Colonne DATA 16,17,25 DATA 25,24,16 DATA 17,18,26 DATA 26,25,17 DATA 18,19,27 DATA 27,26,18 DATA 19,20,28 DATA 28,27,19 DATA 20,21,29 DATA 29,28,20 DATA 21,22,30 DATA 30,29,21 DATA 22,23,31 DATA 31,30,22 DATA 23,16,24 DATA 24,31,23 ' RETURN > PROCEDURE plan ' **************************************************************************** ' **** Primitive de base : Le plan ' **** 81 points ' **** taille : (81 * 12 octets) + 2 octets ' **** soit : 974 octets ' **** 128 faces de 3 points chancunes ' **** taille : (128 * 6 octets) + 2 octets ' **** soit : 770 octets ' **** Taille totale : 1744 octets ' **************************************************************************** ' D‚calage d'offset : 44 LOCAL adrp%,adrf%,i%,x,z,i|,j|,pt& ' adrp%={ADD(objet%,44)} CARD{adrp%}=80 ' ---------------------------------------------------------------------------- i%=ADD(adrp%,2) z=1 DO x=-1 DO {i%}=x*1024 {ADD(i%,4)}=0 {ADD(i%,8)}=z*1024 ADD i%,12 x=x+0.25 LOOP WHILE x<1.25 z=z-0.25 LOOP WHILE z>-1.25 ' ---------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) CARD{adrf%}=127 ' i%=ADD(adrf%,2) CLR i| DO CLR j| DO pt&=MUL(i|,9)+j| CARD{i%}=pt& CARD{ADD(i%,2)}=SUCC(pt&) CARD{ADD(i%,4)}=ADD(pt&,10) ADD i%,6 CARD{i%}=ADD(pt&,10) CARD{ADD(i%,2)}=ADD(pt&,9) CARD{ADD(i%,4)}=pt& ADD i%,6 INC j| LOOP WHILE j|<8 INC i| LOOP WHILE i|<8 ' ---------------------------------------------------------------------------- RETURN > PROCEDURE tore(rapp&,an1&,an2&) ' **************************************************************************** ' **** Primitive de base : Le tore ' **** 144 points ' **** +12 si coup‚ ' **** taille : (156 * 12 octets) + 2 octets ' **** soit : 1874 octets ' **** 288 faces de 3 points chancunes ' **** +20 si coup‚ ' **** total de 308 faces ' **** taille : (308 * 6 octets) + 2 octets ' **** soit : 1850 octets ' **** Taille totale : 3724 octets ' **************************************************************************** ' **** Primitive de base : Le tore simplifi‚ ' **** 64 points ' **** +8 si coup‚ ' **** taille : (72 * 12 octets) + 2 octets ' **** soit : 866 octets ' **** 128 faces de 3 points chancunes ' **** +12 si coup‚ ' **** total de 140 faces ' **** taille : (140 * 6 octets) + 2 octets ' **** soit : 842 octets ' **** Taille totale : 1708 octets ' **************************************************************************** ' D‚calage d'offset : 48 LOCAL adrp%,adrf%,r1,r2,fin&,ang,j%,fin_j%,an,can,san LOCAL adr_p%,x,y,i&,j& ' an1&=ADD(an1&,180) an2&=ADD(an2&,180) ' r1=1*(rapp&/100) r2=1-r1 ' adrp%={ADD(objet%,48)} ' **************************************************************************** IF primitives_simples! ! ************ Un tor simplifi‚ **************** ' ************************************************************************** IF SUB(an2&,an1&)=360 CARD{adrp%}=63 fin&=8 ELSE CARD{adrp%}=71 fin&=9 ENDIF ang=45 ! 360/8 ' ------------------------------ Cr‚ation du disque de d‚part de rayon R2 CLR i& j%=coord_polygon% an=360 DO can=COS(RAD(an)) san=SIN(RAD(an)) {j%}=r2*can*1024 {ADD(j%,4)}=san*1024 ADD j%,8 SUB an,ang INC i& LOOP WHILE an>0 ' ------------------------------ D‚placement du cercle de d‚part de R1 unit‚ fin_j%=ADD(coord_polygon%,64) j%=coord_polygon% DO {j%}={j%}-(r1*1024) ADD j%,8 LOOP WHILE j%0 ' ------------------------------ D‚placement du cercle de d‚part de R1 unit‚ fin_j%=ADD(coord_polygon%,96) j%=coord_polygon% DO {j%}={j%}-(r1*1024) ADD j%,8 LOOP WHILE j% PROCEDURE boite_d_activation ' **************************************************************************** ' **** Primitive servant … afficher l'objet actif en l'entourant d'une boŒte ' **** pointill‚e avec ses diagonales pour en indiquer le centre. ' **** 8 points ' **** taille : (8 * 12 octets) + 2 octets ' **** soit : 98 octets ' **** 12 faces de 2 points chacunes ' **** taille : (12 * 6 octets) + 2 octets ' **** soit : 74 octets ' **** Taille totale : 172 octets ' **************************************************************************** LOCAL adrp%,adrf%,x,y,z,i%,i&,x& ' adrp%=boite_active% CARD{adrp%}=7 ' RESTORE boitedataactif ' -------------------------------------------------------------------------- i%=ADD(adrp%,2) CLR i& DO READ x,y,z {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ADD i%,12 INC i& LOOP WHILE i&<8 ' -------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) CARD{adrf%}=11 ' i%=ADD(adrf%,2) CLR i& DO READ x& CARD{i%}=x& READ x& CARD{ADD(i%,2)}=x& READ x& CARD{ADD(i%,4)}=x& ADD i%,6 INC i& LOOP WHILE i&<12 ' -------------------------------------------------------------------------- boitedataactif: ' Les points DATA -1, 1,-1 DATA 1, 1,-1 DATA 1,-1,-1 DATA -1,-1,-1 DATA -1, 1, 1 DATA 1, 1, 1 DATA 1,-1, 1 DATA -1,-1, 1 ' Les faces ' PremiŠre face de quatre points DATA 0,1,0 DATA 1,2,1 DATA 2,3,2 DATA 3,0,3 ' Seconde face de quatre points DATA 4,5,4 DATA 5,6,5 DATA 6,7,6 DATA 7,4,7 ' TroisiŠme face de quatre points DATA 0,4,0 DATA 1,5,1 ' QuatriŠme face de quatre points DATA 3,7,3 DATA 2,6,2 ' RETURN > PROCEDURE objet_soleil ' **************************************************************************** ' **** Primitive servant … afficher l'objet soleil en vue 2D et en vue ' **** subjective. ' **** 32 points (26 utilis‚s) ' **** taille : (32 * 12 octets) + 2 octets ' **** soit : 386 octets ' **** 40 faces de 2 points chacunes ' **** taille : (40 * 4 octets) octets ' **** soit : 160 octets ' **** Pour un total de 546 octets ' **************************************************************************** LOCAL adrp%,x,y,z,i%,i&,np& ' adrp%=objet_proj% CARD{adrp%}=25 ' RESTORE donneelampesoleil ' ---------------------------------------------------------------------------- i%=ADD(adrp%,2) CLR i& DO READ x,y,z {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ADD i%,12 INC i& LOOP WHILE i&<32 ' ---------------------------------------------------------------------------- RESTORE facelampesoleil i%=@adresse_face(adrp%) CLR i& DO READ np& CARD{i%}=np& ADD i%,2 READ np& CARD{i%}=np& ADD i%,2 INC i& LOOP WHILE i&<40 ' ---------------------------------------------------------------------------- donneelampesoleil: ' DATA 0, 0.25, 0 DATA 0, 0.176,-0.176 DATA 0.176, 0.176, 0 DATA -0.176, 0.176, 0 DATA 0, 0.176, 0.176 DATA 0, 0, -0.25 DATA 0.25, 0, 0 DATA -0.25, 0, 0 DATA 0, 0, 0.25 DATA 0, -0.176,-0.176 DATA 0.176,-0.176, 0 DATA -0.176,-0.176, 0 DATA 0, -0.176, 0.176 DATA 0, -0.25, 0 ' DATA 0, 0.353,-0.353 DATA 0.353, 0.353, 0 DATA -0.353, 0.353, 0 DATA 0, 0.353, 0.353 DATA 0, 0, -0.5 DATA 0.50, 0, 0 DATA -0.50, 0, 0 DATA 0, 0, 0.50 DATA 0, -0.353,-0.353 DATA 0.353,-0.353, 0 DATA -0.353,-0.353, 0 DATA 0, -0.353, 0.353 ' facelampesoleil: ' La boule du soleil DATA 0,1 DATA 0,2 DATA 0,3 DATA 0,4 DATA 1,2 DATA 2,4 DATA 4,3 DATA 3,1 DATA 1,5 DATA 2,6 ' DATA 3,7 DATA 4,8 DATA 5,6 DATA 6,8 DATA 8,7 DATA 7,5 DATA 5,9 DATA 6,10 DATA 7,11 DATA 8,12 ' DATA 9,10 DATA 10,12 DATA 12,11 DATA 11,9 DATA 9,13 DATA 10,13 DATA 11,13 DATA 12,13 ' Les rayon du soleil DATA 1,14 DATA 2,15 ' DATA 3,16 DATA 4,17 DATA 5,18 DATA 6,19 DATA 7,20 DATA 8,21 DATA 9,22 DATA 10,23 DATA 11,24 DATA 12,25 ' RETURN > PROCEDURE objet_projecteur ' **************************************************************************** ' **** Primitive servant … afficher l'objet projecteur en vue 2D et vue ' **** subjective. ' **** 32 points ' **** taille : (32 * 12 octets) + 2 octets ' **** soit : 386 octets ' **** 40 faces de 2 points chacunes ' **** taille : (40 * 4 octets) octets ' **** soit : 160 octets ' **** Pour un total de 546 octets ' **************************************************************************** LOCAL adrp%,x,y,z,i%,i&,np& ' adrp%=objet_proj% CARD{adrp%}=31 ' RESTORE donneelampe3d ' ---------------------------------------------------------------------------- i%=ADD(adrp%,2) CLR i& DO READ x,y,z {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ADD i%,12 INC i& LOOP WHILE i&<32 ' ---------------------------------------------------------------------------- RESTORE facelampe3d i%=@adresse_face(adrp%) CLR i& DO READ np& CARD{i%}=np& ADD i%,2 READ np& CARD{i%}=np& ADD i%,2 INC i& LOOP WHILE i&<40 ' ---------------------------------------------------------------------------- donneelampe3d: ' DATA -0.125,-0.25,-0.5 DATA -0.25,-0.125,-0.5 DATA -0.25,0.125,-0.5 DATA -0.125,0.25,-0.5 DATA 0.125,0.25,-0.5 DATA 0.25,0.125,-0.5 DATA 0.25,-0.125,-0.5 DATA 0.125,-0.25,-0.5 ' DATA -0.125,-0.25,0.125 DATA -0.25,-0.125,0.125 DATA -0.25,0.125,0.125 DATA -0.125,0.25,0.125 DATA 0.125,0.25,0.125 DATA 0.25,0.125,0.125 DATA 0.25,-0.125,0.125 DATA 0.125,-0.25,0.125 ' DATA -0.312,-0.125,0.125 DATA -0.375,-0.25,0.5 DATA -0.375,0.25,0.5 DATA -0.312,0.125,0.125 ' DATA -0.125,0.312,0.125 DATA -0.25,0.375,0.5 DATA 0.25,0.375,0.5 DATA 0.125,0.312,0.125 ' DATA 0.312,0.125,0.125 DATA 0.375,0.25,0.5 DATA 0.375,-0.25,0.5 DATA 0.312,-0.125,0.125 ' DATA 0.125,-0.312,0.125 DATA 0.25,-0.375,0.5 DATA -0.25,-0.375,0.5 DATA -0.125,-0.312,0.125 facelampe3d: DATA 0,1 DATA 1,2 DATA 2,3 DATA 3,4 DATA 4,5 DATA 5,6 DATA 6,7 DATA 7,0 ' DATA 8,9 DATA 9,10 DATA 10,11 DATA 11,12 DATA 12,13 DATA 13,14 DATA 14,15 DATA 15,8 ' DATA 0,8 DATA 1,9 DATA 2,10 DATA 3,11 DATA 4,12 DATA 5,13 DATA 6,14 DATA 7,15 ' DATA 16,17 DATA 17,18 DATA 18,19 DATA 19,16 ' DATA 20,21 DATA 21,22 DATA 22,23 DATA 23,20 ' DATA 24,25 DATA 25,26 DATA 26,27 DATA 27,24 ' DATA 28,29 DATA 29,30 DATA 30,31 DATA 31,28 ' RETURN > PROCEDURE cone_spot(adr_sr%) ' **************************************************************************** ' **** La zone repr‚sentant le faisceau de lumiŠre des projecteurs **** ' **** sous forme dun c“ne filaire dont le sommet et le **** ' **** projecteur **** ' **** 13 points **** ' **** taille : (13 * 12 octets) + 2 octets **** ' **** soit : 158 octets **** ' **** 16 faces de 2 points chacunes **** ' **** taille : (16 * 4 octets) **** ' **** soit : 64 octets **** ' **************************************************************************** LOCAL adrp%,adrf%,angle,rap,i% ' angle=(180-INT{ADD(adr_sr%,48)})/2 angle=-angle*(angle<>0)-1*(angle=0) rap=1/SINQ(angle) ' adrp%=spot_cone% ! Adresse des points CARD{adrp%}=12 ! Nombre de points ' ! P0 i%=ADD(adrp%,2) {i%}=0 {ADD(i%,4)}=0 {ADD(i%,8)}=-0.5*1024 ' ! P1 ADD i%,12 {i%}=0.5*1024*COSQ(angle) {ADD(i%,4)}=0 {ADD(i%,8)}=0.5*1024 ' ! P2 ADD i%,12 {i%}=0.5*(0.866)*1024*COSQ(angle) {ADD(i%,4)}=0.5*(0.5)*1024*COSQ(angle)*rap {ADD(i%,8)}=0.5*1024 ' ! P3 ADD i%,12 {i%}=0.5*(0.5)*1024*COSQ(angle) {ADD(i%,4)}=0.5*(0.866)*1024*COSQ(angle)*rap {ADD(i%,8)}=0.5*1024 ' ! P4 ADD i%,12 {i%}=0 {ADD(i%,4)}=0.5*1024*COSQ(angle)*rap {ADD(i%,8)}=0.5*1024 ' ! P5 ADD i%,12 {i%}=-0.5*(0.5)*1024*COSQ(angle) {ADD(i%,4)}=0.5*(0.866)*1024*COSQ(angle)*rap {ADD(i%,8)}=0.5*1024 ' ! P6 ADD i%,12 {i%}=-0.5*(0.866)*1024*COSQ(angle) {ADD(i%,4)}=0.5*(0.5)*1024*COSQ(angle)*rap {ADD(i%,8)}=0.5*1024 ' ! P7 ADD i%,12 {i%}=-0.5*1024*COSQ(angle) {ADD(i%,4)}=0 {ADD(i%,8)}=0.5*1024 ' ! P8 ADD i%,12 {i%}=-0.5*(0.866)*1024*COSQ(angle) {ADD(i%,4)}=-0.5*(0.5)*1024*COSQ(angle)*rap {ADD(i%,8)}=0.5*1024 ' ! P9 ADD i%,12 {i%}=-0.5*(0.5)*1024*COSQ(angle) {ADD(i%,4)}=-0.5*(0.866)*1024*COSQ(angle)*rap {ADD(i%,8)}=0.5*1024 ' ! P10 ADD i%,12 {i%}=0 {ADD(i%,4)}=-0.5*1024*COSQ(angle)*rap {ADD(i%,8)}=0.5*1024 ' ! P11 ADD i%,12 {i%}=0.5*(0.5)*1024*COSQ(angle) {ADD(i%,4)}=-0.5*(0.866)*1024*COSQ(angle)*rap {ADD(i%,8)}=0.5*1024 ' ! P12 ADD i%,12 {i%}=0.5*(0.866)*1024*COSQ(angle) {ADD(i%,4)}=-0.5*(0.5)*1024*COSQ(angle)*rap {ADD(i%,8)}=0.5*1024 ' ---------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) ! Adresse des faces i%=adrf% ' Du point 0 au point 1 CARD{i%}=0 CARD{ADD(i%,2)}=1 ' Du point 0 au point 4 ADD i%,4 CARD{i%}=0 CARD{ADD(i%,2)}=4 ' Du point 0 au point 7 ADD i%,4 CARD{i%}=0 CARD{ADD(i%,2)}=7 ' Du point 0 au point 10 ADD i%,4 CARD{i%}=0 CARD{ADD(i%,2)}=10 ' Du point 1 au point 2 ADD i%,4 CARD{i%}=1 CARD{ADD(i%,2)}=2 ' Du point 2 au point 3 ADD i%,4 CARD{i%}=2 CARD{ADD(i%,2)}=3 ' Du point 3 au point 4 ADD i%,4 CARD{i%}=3 CARD{ADD(i%,2)}=4 ' Du point 4 au point 5 ADD i%,4 CARD{i%}=4 CARD{ADD(i%,2)}=5 ' Du point 5 au point 6 ADD i%,4 CARD{i%}=5 CARD{ADD(i%,2)}=6 ' Du point 6 au point 7 ADD i%,4 CARD{i%}=6 CARD{ADD(i%,2)}=7 ' Du point 7 au point 8 ADD i%,4 CARD{i%}=7 CARD{ADD(i%,2)}=8 ' Du point 8 au point 9 ADD i%,4 CARD{i%}=8 CARD{ADD(i%,2)}=9 ' Du point 9 au point 10 ADD i%,4 CARD{i%}=9 CARD{ADD(i%,2)}=10 ' Du point 10 au point 11 ADD i%,4 CARD{i%}=10 CARD{ADD(i%,2)}=11 ' Du point 11 au point 12 ADD i%,4 CARD{i%}=11 CARD{ADD(i%,2)}=12 ' Du point 12 au point 1 ADD i%,4 CARD{i%}=12 CARD{ADD(i%,2)}=1 ' RETURN > PROCEDURE objet_camera ' **************************************************************************** ' **** Primitive servant … afficher l'objet cam‚ra en vue 2D et vue ' **** subjective. ' **** 34 points ' **** taille : (34 * 12 octets) + 2 octets ' **** soit : 410 octets ' **** 54 faces de 2 points chacunes ' **** taille : (54 * 4 octets) octets ' **** soit : 216 octets ' **** Pour un total de 626 octets ' **************************************************************************** LOCAL adrp%,x,y,z,i%,i&,np& ' adrp%=objet_came% CARD{adrp%}=33 ' RESTORE donneecamera3d ' ---------------------------------------------------------------------------- i%=ADD(adrp%,2) CLR i& DO READ x,y,z {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ADD i%,12 INC i& LOOP WHILE i&<34 ' ---------------------------------------------------------------------------- RESTORE facecamera3d i%=@adresse_face(adrp%) CLR i& DO READ np& CARD{i%}=np& ADD i%,2 READ np& CARD{i%}=np& ADD i%,2 INC i& LOOP WHILE i&<54 ' ---------------------------------------------------------------------------- donneecamera3d: ' de 0 … 7 DATA -0.062,0.125,0.25 DATA -0.125,0.062,0.25 DATA -0.125,-0.062,0.25 DATA -0.062,-0.125,0.25 DATA 0.062,-0.125,0.25 DATA 0.125,-0.062,0.25 DATA 0.125,0.062,0.25 DATA 0.062,0.125,0.25 ' de 8 … 15 DATA -0.062,0.125,0.375 DATA -0.125,0.062,0.375 DATA -0.125,-0.062,0.375 DATA -0.062,-0.125,0.375 DATA 0.062,-0.125,0.375 DATA 0.125,-0.062,0.375 DATA 0.125,0.062,0.375 DATA 0.062,0.125,0.375 ' de 16 … 23 DATA -0.125,0.25,0.5 DATA -0.25,0.125,0.5 DATA -0.25,-0.125,0.5 DATA -0.125,-0.25,0.5 DATA 0.125,-0.25,0.5 DATA 0.25,-0.125,0.5 DATA 0.25,0.125,0.5 DATA 0.125,0.25,0.5 ' de 24 … 33 DATA -0.187,0.312,0.25 DATA 0.187,0.312,0.25 DATA 0.187,0.312,-0.5 DATA -0.187,0.312,-0.5 DATA -0.187,-0.375,0.25 DATA 0.187,-0.375,0.25 DATA 0.187,-0.375,-0.312 DATA 0.187,-0.25,-0.5 DATA -0.187,-0.25,-0.5 DATA -0.187,-0.375,-0.312 ' facecamera3d: ' de 0 … 7 DATA 0,1 DATA 1,2 DATA 2,3 DATA 3,4 DATA 4,5 DATA 5,6 DATA 6,7 DATA 7,0 ' de 8 … 15 DATA 8,9 DATA 9,10 DATA 10,11 DATA 11,12 DATA 12,13 DATA 13,14 DATA 14,15 DATA 15,8 ' de 16 … 23 DATA 0,8 DATA 1,9 DATA 2,10 DATA 3,11 DATA 4,12 DATA 5,13 DATA 6,14 DATA 7,15 ' de 24 … 31 DATA 16,17 DATA 17,18 DATA 18,19 DATA 19,20 DATA 20,21 DATA 21,22 DATA 22,23 DATA 23,16 ' de 32 … 39 DATA 8,16 DATA 9,17 DATA 10,18 DATA 11,19 DATA 12,20 DATA 13,21 DATA 14,22 DATA 15,23 ' de 40 … 43 DATA 24,25 DATA 25,26 DATA 26,27 DATA 27,24 ' de 44 … 49 DATA 28,29 DATA 29,30 DATA 30,31 DATA 31,32 DATA 32,33 DATA 33,28 ' de 50 … 53 DATA 24,28 DATA 25,29 DATA 26,31 DATA 27,32 ' RETURN > PROCEDURE pyramide_camera ' **************************************************************************** ' **** La zone repr‚sentant le faisceau de la cam‚ra **** ' **** sous forme d'une pyramide carr‚e dont le sommet et **** ' **** la cam‚ra **** ' **** 5 points **** ' **** taille : (5 * 12 octets) + 2 octets **** ' **** soit : 62 octets **** ' **** 4 faces de 2 points chacunes **** ' **** taille : (4 * 4 octets) **** ' **** soit : 16 octets **** ' **************************************************************************** LOCAL adr%,angle LOCAL rap ' LOCAL adrp%,adrf%,angle,rap,i% ' angle=90-DEG(ATN(0.5/(focale&/400))) angle=-angle*(angle<>0)-1*(angle=0) rap=1/SINQ(angle) ' adrp%=came_pyra% ! Adresse des points CARD{adrp%}=4 ! Nombre de points ' -------------------------------------------------------------------------- i%=ADD(adrp%,2) ' Sommet de devant {i%}=0 {ADD(i%,4)}=0 {ADD(i%,8)}=-0.5*1024 ' ArriŠre Bas gauche ADD i%,12 {i%}=-0.5*(COSQ(angle)*rap)*1024 {ADD(i%,4)}=-0.5*(COSQ(angle)*rap)*1024 {ADD(i%,8)}=0.5*1024 ' ArriŠre Bas droit ADD i%,12 {i%}=0.5*(COSQ(angle)*rap)*1024 {ADD(i%,4)}=-0.5*(COSQ(angle)*rap)*1024 {ADD(i%,8)}=0.5*1024 ' ArriŠre haut droit ADD i%,12 {i%}=0.5*(COSQ(angle)*rap)*1024 {ADD(i%,4)}=0.5*(COSQ(angle)*rap)*1024 {ADD(i%,8)}=0.5*1024 ' ArriŠre Haut gauche ADD i%,12 {i%}=-0.5*(COSQ(angle)*rap)*1024 {ADD(i%,4)}=0.5*(COSQ(angle)*rap)*1024 {ADD(i%,8)}=0.5*1024 ' -------------------------------------------------------------------------- adrf%=@adresse_face(adrp%) ! Adresse des faces i%=adrf% ' Du point 0 au point 1 CARD{i%}=0 CARD{ADD(i%,2)}=1 ' Du point 0 au point 2 ADD i%,4 CARD{i%}=0 CARD{ADD(i%,2)}=2 ' Du point 0 au point 3 ADD i%,4 CARD{i%}=0 CARD{ADD(i%,2)}=3 ' Du point 0 au point 4 ADD i%,4 CARD{i%}=0 CARD{ADD(i%,2)}=4 ' -------------------------------------------------------------------------- RETURN > PROCEDURE boite_de_remplacement(adr_p%) LOCAL x,y,z LOCAL i% LOCAL i&,x& RESTORE boitedata ' ------------ On commence par tout les points ------------------------------- CARD{adr_p%}=7 i%=ADD(adr_p%,2) CLR i& DO READ x,y,z {i%}=x*1024 {ADD(i%,4)}=y*1024 {ADD(i%,8)}=z*1024 ADD i%,12 INC i& LOOP WHILE i&<8 ' ------------ Puis, on fini par les facettes -------------------------------- adrf%=@adresse_face(adr_p%) CARD{adrf%}=11 ' i%=ADD(adrf%,2) CLR i& DO READ x& CARD{i%}=x& READ x& CARD{ADD(i%,2)}=x& READ x& CARD{ADD(i%,4)}=x& ADD i%,6 INC i& LOOP WHILE i&<12 ' ---------------------------------------------------------------------------- RETURN > PROCEDURE points_des_carreaux ' **************************************************************************** ' **** Primitive servant … afficher les points de contr“le des carreaux ' **** de B‚zier ' **** 16 points ' **** taille : (16 * 4 octets) ' **** soit : 64 octets ' **** 24 faces de 2 points chacunes ' **** taille : (24 * 4 octets) octets ' **** soit : 96 octets ' **** Pour un total de 160 octets ' **************************************************************************** LOCAL adrp%,x&,y&,i& ' adrp%=ADD(dessin_carreaux%,64) RESTORE les_carreaux CLR i& DO READ x&,y& ' INT{adrp%}=x& ADD adrp%,2 INT{adrp%}=y& ADD adrp%,2 ' INC i& LOOP WHILE i&<24 ' les_carreaux: ' DATA 0, 1, 1, 2, 2, 3 DATA 4, 5, 5, 6, 6, 7 DATA 8, 9, 9,10,10,11 DATA 12,13,13,14,14,15 DATA 0, 4, 4, 8, 8,12 DATA 1, 5, 5, 9, 9,13 DATA 2, 6, 6,10,10,14 DATA 3, 7, 7,11,11,15 ' RETURN ' ********************** Gestion des couleurs ********************************** > FUNCTION old_ouvrir_couleurs_predefinies(adr_col%) IF @gestion_couleurs_predefinies(adr_col%) RETURN TRUE ELSE RETURN FALSE ENDIF ENDFUNC ' > FUNCTION old_gestion_couleurs_predefinies(adr_col%) LOCAL fx&,fy&,fw&,fh&,c&,j&,mem_j& LOCAL rx&,ry&,rw&,rh&,milx&,mily&,pr_f& LOCAL mem_coul&,mem_roug&,mem_vert&,mem_bleu&,mem_tran&,mem_lum& LOCAL teinte&,luminosite&,saturation&,ro&,ve&,bl& LOCAL mvtx&,mvty&,val&,fi& LOCAL dx&,dy&,cos,sin,rap,ang1& LOCAL evnt& ' videsouris ' mem_coul&=CARD{adr_col%} mem_roug&=BYTE{ADD(adr_col%,2)} mem_vert&=BYTE{ADD(adr_col%,3)} mem_bleu&=BYTE{ADD(adr_col%,4)} ' IF adr_col%<>mem_num% mem_tran&=BYTE{ADD(adr_col%,5)} ' ENDIF form_center(adr_predefinie%,fx&,fy&,fw&,fh&) fx&=SHL(SHR(fx&,4),4) OB_X(adr_predefinie%,0)=fx& form_dial(0,fx&,fy&,ADD(fw&,4),ADD(fh&,4),fx&,fy&,ADD(fw&,4),ADD(fh&,4)) ' pr_f&=@wind_create(0,px&,py&,pw&,ph&) IF pr_f&>-1 wind_open(pr_f&,px&,py&,pw&,ph&) ENDIF ' objc_draw(adr_predefinie%,0,12,fx&,fy&,fw&,fh&,-1) lire_couleurs(adr_col%,TRUE) mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) DO ' Appel fonction xform_do() juste pour la fenˆtre concern‚e evnt&=@xform_do(&X110011,adr_predefinie%,0) IF BTST(evnt&,0) ! EVENEMENT CLAVIER IF key&=&H11B ' ESC CLR evnt& objet&=annprede& objc_change(adr_predefinie%,objet&) evnt&=2 ELSE CLR evnt& ENDIF ENDIF IF BTST(evnt&,1) ! EVENEMENT DE CLIC SOURIS $S&,$S> SELECT objet& CASE cheprede& videsouris objc_change(adr_predefinie%,objet&) IF @recherche_couleur_predefinie(adr_col%) CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,CARD{adr_col%}) lire_couleurs(adr_col%,TRUE) ENDIF CASE rouetesa& IF global_amx&<>global_mx& OR global_amy&<>global_my& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_offset(adr_predefinie%,rouetesa&,rx&,ry&) rw&=OB_W(adr_predefinie%,rouetesa&) rh&=OB_H(adr_predefinie%,rouetesa&) milx&=ADD(rx&,DIV(rw&,2)) mily&=ADD(ry&,DIV(rh&,2)) dx&=global_mx&-milx& dy&=global_my&-mily& rap=SQR(dx&^2+dy&^2) IF rap=0 saturation&=0 ELSE cos=dx&/rap sin=dy&/rap IF sin<=0 ang1&=ABS(DEG(ACOS(cos))-180) ELSE ang1&=DEG(ACOS(cos))+180 ENDIF ENDIF teinte&=ROUND(ang1&/360*255) teinte&=-teinte&*(teinte&=>0 AND teinte&<=255)-255*(teinte&>255) saturation&=ROUND(rap/64*255) saturation&=-saturation&*(saturation&=>0 AND saturation&<=255)-255*(saturation&>255) tsl_rvb(teinte&,saturation&,luminosite&,ro&,ve&,bl&) ' IF luminosite&=0 luminosite&=mem_lum& ' ENDIF BYTE{ADD(adr_col%,2)}=ro& BYTE{ADD(adr_col%,3)}=ve& BYTE{ADD(adr_col%,4)}=bl& couleurs_definies(adr_col%,CARD{adr_col%},TRUE) global_amx&=global_mx& global_amy&=global_my& ENDIF CASE bficcolo& videsouris objc_change(adr_predefinie%,objet&) positionner_popup(-1,objet&,adr_predefinie%,adr_popup_autre3%,rx&,ry&) debut_couleur&=CARD{adr_col%} IF total_couleur&>9 debut_couleur&=-debut_couleur&*(debut_couleur&=>0 AND debut_couleur&<=SUB(total_couleur&,10))+0*(debut_couleur&<0)-SUB(total_couleur&,10)*(debut_couleur&>SUB(total_couleur&,10)) ENDIF reponse&=@popup_de_couleur(rx&,ry&,adr_predefinie%) IF reponse&>-1 CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,reponse&) CARD{adr_col%}=reponse& lire_couleurs(adr_col%,TRUE) ENDIF CASE ajoupred& videsouris objc_change(adr_predefinie%,objet&) ajout_de_definition(adr_col%,1) CASE modipred& videsouris objc_change(adr_predefinie%,objet&) modif_de_definition(adr_col%,1) CASE effapred& videsouris objc_change(adr_predefinie%,objet&) efface_une_definition(adr_col%,1) lire_couleurs(adr_col%,TRUE) CASE asceroug& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_offset(adr_predefinie%,carrroug&,mvtx&,mvty&) ro&=BYTE{ADD(adr_col%,2)} ADD ro&,26*(global_my&>mvty&)-26*(global_my&0 AND ro&<=255)+0*(ro&<0)-255*(ro&>255) position_curseur_vertical(adr_predefinie%,asceroug&,carrroug&,ro&,TRUE) BYTE{ADD(adr_col%,2)}=ro& redessin_partiel_rvb(adr_col%) mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE ascevert& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_offset(adr_predefinie%,carrvert&,mvtx&,mvty&) ve&=BYTE{ADD(adr_col%,3)} ADD ve&,26*(global_my&>mvty&)-26*(global_my&0 AND ve&<=255)+0*(ve&<0)-255*(ve&>255) position_curseur_vertical(adr_predefinie%,ascevert&,carrvert&,ve&,TRUE) BYTE{ADD(adr_col%,3)}=ve& redessin_partiel_rvb(adr_col%) mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE ascebleu& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_offset(adr_predefinie%,carrbleu&,mvtx&,mvty&) bl&=BYTE{ADD(adr_col%,4)} ADD bl&,26*(global_my&>mvty&)-26*(global_my&0 AND bl&<=255)+0*(bl&<0)-255*(bl&>255) position_curseur_vertical(adr_predefinie%,ascebleu&,carrbleu&,bl&,TRUE) BYTE{ADD(adr_col%,4)}=bl& redessin_partiel_rvb(adr_col%) mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE ascetran& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_offset(adr_predefinie%,carrtran&,mvtx&,mvty&) val&=BYTE{ADD(adr_col%,5)} ADD val&,26*(global_my&>mvty&)-26*(global_my&0 AND val&<=255)+0*(val&<0)-255*(val&>255) BYTE{ADD(adr_col%,5)}=val& position_curseur_vertical(adr_predefinie%,ascetran&,carrtran&,val&,TRUE) CASE ascelumi& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_offset(adr_predefinie%,carrlumi&,mvtx&,mvty&) rvb_tsl(BYTE{ADD(adr_col%,2)},BYTE{ADD(adr_col%,3)},BYTE{ADD(adr_col%,4)},teinte&,saturation&,luminosite&) ADD luminosite&,26*(global_my&>mvty&)-26*(global_my&0 AND luminosite&<=255)+0*(luminosite&<0)-255*(luminosite&>255) position_curseur_vertical(adr_predefinie%,ascelumi&,carrlumi&,luminosite&,TRUE) redessin_partiel_tls(adr_col%,teinte&,luminosite&,saturation&) redessin_partiel_rvb(adr_col%) mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE carrtein& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrtein&,0,100,3,0) rvb_tsl(BYTE{ADD(adr_col%,2)},BYTE{ADD(adr_col%,3)},BYTE{ADD(adr_col%,4)},teinte&,saturation&,luminosite&) teinte&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrtein&)}})*2.55) teinte&=-teinte&*(teinte&=>0 AND teinte&<=255)+0*(teinte&<0)-255*(teinte&>255) objc_change(adr_predefinie%,carrtein&) redessin_partiel_tls(adr_col%,teinte&,luminosite&,saturation&) redessin_partiel_rvb(adr_col%) CASE carrsatu& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrsatu&,0,100,3,0) rvb_tsl(BYTE{ADD(adr_col%,2)},BYTE{ADD(adr_col%,3)},BYTE{ADD(adr_col%,4)},teinte&,saturation&,luminosite&) saturation&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrsatu&)}})*2.55) saturation&=-saturation&*(saturation&=>0 AND saturation&<=255)+0*(saturation&<0)-255*(saturation&>255) objc_change(adr_predefinie%,carrsatu&) redessin_partiel_tls(adr_col%,teinte&,luminosite&,saturation&) redessin_partiel_rvb(adr_col%) CASE lumicarr& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' IF global_mk&=2 OR click&=2 objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrlumi&,0,100,3,0) rvb_tsl(BYTE{ADD(adr_col%,2)},BYTE{ADD(adr_col%,3)},BYTE{ADD(adr_col%,4)},teinte&,saturation&,luminosite&) luminosite&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}})*2.55) luminosite&=-luminosite&*(luminosite&=>0 AND luminosite&<=255)+0*(luminosite&<0)-255*(luminosite&>255) position_curseur_vertical(adr_predefinie%,ascelumi&,carrlumi&,luminosite&,TRUE) redessin_partiel_tls(adr_col%,teinte&,luminosite&,saturation&) redessin_partiel_rvb(adr_col%) ELSE objc_change(adr_predefinie%,objet&) deplace_curseur_vertical(adr_predefinie%,ascelumi&,carrlumi&,adr_col%) redessin_partiel_rvb(adr_col%) ENDIF mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE rougcarr& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' IF global_mk&=2 OR click&=2 objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrroug&,0,100,3,0) ro&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrroug&)}})*2.55) ro&=-ro&*(ro&=>0 AND ro&<=255)+0*(ro&<0)-255*(ro&>255) BYTE{ADD(adr_col%,2)}=ro& position_curseur_vertical(adr_predefinie%,asceroug&,carrroug&,ro&,TRUE) redessin_partiel_rvb(adr_col%) ELSE objc_change(adr_predefinie%,objet&) deplace_curseur_vertical(adr_predefinie%,asceroug&,carrroug&,adr_col%) ENDIF mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE vertcarr& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' IF global_mk&=2 OR click&=2 objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrvert&,0,100,3,0) ve&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrvert&)}})*2.55) ve&=-ve&*(ve&=>0 AND ve&<=255)+0*(ve&<0)-255*(ve&>255) BYTE{ADD(adr_col%,3)}=ve& position_curseur_vertical(adr_predefinie%,ascevert&,carrvert&,ve&,TRUE) redessin_partiel_rvb(adr_col%) ELSE objc_change(adr_predefinie%,objet&) deplace_curseur_vertical(adr_predefinie%,ascevert&,carrvert&,adr_col%) ENDIF mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE bleucarr& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' IF global_mk&=2 OR click&=2 objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrbleu&,0,100,3,0) bl&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrbleu&)}})*2.55) bl&=-bl&*(bl&=>0 AND bl&<=255)+0*(bl&<0)-255*(bl&>255) BYTE{ADD(adr_col%,4)}=bl& position_curseur_vertical(adr_predefinie%,ascebleu&,carrbleu&,bl&,TRUE) redessin_partiel_rvb(adr_col%) ELSE objc_change(adr_predefinie%,objet&) deplace_curseur_vertical(adr_predefinie%,ascebleu&,carrbleu&,adr_col%) ENDIF mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE trancarr& ' CARD{adr_col%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' IF global_mk&=2 OR click&=2 objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrtran&,0,100,3,0) val&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrtran&)}})*2.55) BYTE{ADD(adr_col%,5)}=val& position_curseur_vertical(adr_predefinie%,ascetran&,carrtran&,val&,TRUE) ELSE objc_change(adr_predefinie%,objet&) deplace_curseur_vertical(adr_predefinie%,ascetran&,carrtran&,adr_col%) ENDIF CASE annprede& videsouris objc_change(adr_predefinie%,objet&) CARD{adr_col%}=mem_coul& BYTE{ADD(adr_col%,2)}=mem_roug& BYTE{ADD(adr_col%,3)}=mem_vert& BYTE{ADD(adr_col%,4)}=mem_bleu& IF adr_col%<>mem_num% BYTE{ADD(adr_col%,5)}=mem_tran& ENDIF form_dial(3,fx&,fy&,ADD(fw&,4),ADD(fh&,4),fx&,fy&,ADD(fw&,4),ADD(fh&,4)) ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF videsouris redraw_force(idx_info&,idx_animation&) ' RETURN FALSE CASE valprede& videsouris objc_change(adr_predefinie%,objet&) form_dial(3,fx&,fy&,ADD(fw&,4),ADD(fh&,4),fx&,fy&,ADD(fw&,4),ADD(fh&,4)) ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF videsouris redraw_force(idx_info&,idx_animation&) ' RETURN TRUE ENDSELECT CLR evnt& ENDIF LOOP ' ENDFUNC > PROCEDURE couleurs_definies(adr_col%,c&,ind!) LOCAL ro&,ve&,bl&,tra&,tte&,san&,lte&,c0 LOCAL ang&,dis&,rx&,ry&,rw&,rh&,milx&,mily& ro&=BYTE{ADD(adr_col%,2)} ve&=BYTE{ADD(adr_col%,3)} bl&=BYTE{ADD(adr_col%,4)} tra&=BYTE{ADD(adr_col%,5)} IF ind! objc_offset(adr_predefinie%,couleur&,rx&,ry&) rw&=OB_W(adr_predefinie%,couleur&) rh&=OB_H(adr_predefinie%,couleur&) affichage_couleur_tc(rx&,ry&,rw&,rh&,ro&,ve&,bl&,global_xb&,global_yb&,global_wb&,global_hb&) ENDIF rvb_tsl(ro&,ve&,bl&,tte&,san&,lte&) CHAR{{OB_SPEC(adr_predefinie%,carrtein&)}}=STR$(ROUND(tte&*0.3921),3) CHAR{{OB_SPEC(adr_predefinie%,carrsatu&)}}=STR$(ROUND(san&*0.3921),3) objc_offset(adr_predefinie%,rouetesa&,rx&,ry&) rw&=OB_W(adr_predefinie%,rouetesa&) rh&=OB_H(adr_predefinie%,rouetesa&) milx&=ADD(rx&,DIV(rw&,2)) mily&=ADD(ry&,DIV(rh&,2)) dis&=ROUND(san&/255*64) ang&=SUB(ROUND(tte&/255*360),180) OB_X(adr_predefinie%,teinsatu&)=((milx&+dis&*COSQ(ang&))-8)-rx& OB_Y(adr_predefinie%,teinsatu&)=((mily&+dis&*SINQ(ang&))-4)-ry& IF ind! objc_draw(adr_predefinie%,rouetesa&,0,rx&,ry&,rw&,rh&,-1) roue_couleur_vers_ecran(rx&,ry&,rw&,rh&) objc_draw(adr_predefinie%,teinsatu&,0,rx&,ry&,rw&,rh&,-1) redraw_elem(adr_predefinie%,carrtein&) redraw_elem(adr_predefinie%,carrsatu&) ENDIF position_curseur_vertical(adr_predefinie%,ascelumi&,carrlumi&,lte&,ind!) position_curseur_vertical(adr_predefinie%,asceroug&,carrroug&,ro&,ind!) position_curseur_vertical(adr_predefinie%,ascevert&,carrvert&,ve&,ind!) position_curseur_vertical(adr_predefinie%,ascebleu&,carrbleu&,bl&,ind!) position_curseur_vertical(adr_predefinie%,ascetran&,carrtran&,tra&,ind!) RETURN > PROCEDURE redessin_partiel_tls(adr_col%,teinte&,luminosite&,saturation&) LOCAL ang&,dis&,rx&,ry&,rw&,rh&,milx&,mily&,ro&,ve&,bl& tsl_rvb(teinte&,saturation&,luminosite&,ro&,ve&,bl&) BYTE{ADD(adr_col%,2)}=ro& BYTE{ADD(adr_col%,3)}=ve& BYTE{ADD(adr_col%,4)}=bl& CHAR{{OB_SPEC(adr_predefinie%,carrtein&)}}=STR$(ROUND(teinte&/255*100),3) CHAR{{OB_SPEC(adr_predefinie%,carrsatu&)}}=STR$(ROUND(saturation&/255*100),3) redraw_elem(adr_predefinie%,carrtein&) redraw_elem(adr_predefinie%,carrsatu&) position_curseur_vertical(adr_predefinie%,ascelumi&,carrlumi&,luminosite&,TRUE) couleurs_definies(adr_col%,INT{adr_col%},FALSE) objc_offset(adr_predefinie%,rouetesa&,rx&,ry&) rw&=OB_W(adr_predefinie%,rouetesa&) rh&=OB_H(adr_predefinie%,rouetesa&) objc_draw(adr_predefinie%,0,12,rx&,ry&,rw&,rh&,-1) RETURN > PROCEDURE redessin_partiel_rvb(adr_col%) LOCAL ang&,dis&,rx&,ry&,rw&,rh&,milx&,mily& LOCAL ro&,ve&,bl& ro&=BYTE{ADD(adr_col%,2)} ve&=BYTE{ADD(adr_col%,3)} bl&=BYTE{ADD(adr_col%,4)} couleurs_definies(adr_col%,INT{adr_col%},TRUE) RETURN ' ****************************************************************************** ' Les proc‚dures d'ouverture de fenˆtres. le handle de fenˆtre > PROCEDURE ouvrir_information ecrire_donnees_dans_info ouvrir_fenetre(idx_info&,adr_info%) RETURN > PROCEDURE ouvrir_outils ecrire_zoom_dans_outils(FALSE) ouvrir_fenetre(idx_outils&,adr_outils%) RETURN > PROCEDURE ouvrir_vue_subjective ouvrir_fenetre(idx_vue_subjective&,adr_vue_subjective%) RETURN > PROCEDURE ouvrir_modification ecrire_donnees_dans_modification ouvrir_fenetre(idx_modification&,adr_modifier%) RETURN > PROCEDURE ouvrir_couleurs_predefinies ouvrir_fenetre(idx_couleurs&,adr_predefinie%) RETURN > PROCEDURE ouvrir_lumieres ecrire_donnees_dans_lumiere ouvrir_fenetre(idx_lumieres&,adr_lumieres%) RETURN > PROCEDURE ouvrir_aide ecrire_donnees_dans_aide ouvrir_fenetre(idx_aide&,adr_aide%) RETURN > PROCEDURE ouvrir_fonctions ecrire_donnees_dans_fonctions ouvrir_fenetre(idx_fonctions&,adr_fonctions%) RETURN > PROCEDURE ouvrir_effacer ecrire_donnees_dans_effacer ouvrir_fenetre(idx_fonctions&,adr_fonctions%) RETURN > PROCEDURE ouvrir_masquage_des_objets ecrire_donnees_dans_masquage ouvrir_fenetre(idx_fonctions&,adr_fonctions%) RETURN > PROCEDURE ouvrir_creation_des_blobs ecrire_donnees_dans_blobs ouvrir_fenetre(idx_fonctions&,adr_fonctions%) RETURN > PROCEDURE ouvrir_les_calques ecrire_donnees_dans_calques ouvrir_fenetre(idx_calques&,adr_calques%) RETURN > PROCEDURE ouvrir_statistiques ecrire_donnees_dans_statistiques ouvrir_fenetre(idx_statistiques&,adr_stat%) RETURN > PROCEDURE ouvrir_merci ecrire_donnes_dans_merci ouvrir_fenetre(idx_merci&,adr_merci%) RETURN > PROCEDURE ouvrir_camera ecrire_donnees_dans_camera ouvrir_fenetre(idx_camera&,adr_camera%) RETURN > PROCEDURE ouvrir_lanceur_pov ecrire_donnees_dans_lanceur ouvrir_fenetre(idx_lanceur&,adr_lanceur%) RETURN > PROCEDURE ouvrir_parametrages ouvrir_fenetre(idx_parametrage&,adr_parametres%) RETURN > PROCEDURE ouvrir_bicubics ecrire_donnees_dans_bicubic ouvrir_fenetre(idx_bicubic&,adr_bicubics%) RETURN > PROCEDURE ouvrir_image_auteur ouvrir_fenetre(idx_auteur&,adr_auteur%) RETURN > PROCEDURE ouvrir_vue_fine ouvrir_fenetre(idx_vue_fine&,adr_vue_fine%) RETURN > PROCEDURE ouvrir_temps_passe ouvrir_fenetre(idx_temps_passe&,adr_temps_passe%) RETURN > PROCEDURE ouvrir_fenetre_de_vue(fx&,fy&,fw&,fh&) ' Ouverture fenˆtre formulaire LOCAL x&,y&,w&,h& ! Coordonn‚es du formulaire LOCAL attr& LOCAL temp&,adr% ' attr&=&X0 IF INT{ADD(hwind%,idx_vue_dbl&)}>-1 ! Si la fenˆtre formulaire est d‚j… ouverte ' On la met au premier plan wind_set(INT{ADD(hwind%,idx_vue_dbl&)},wf_top&,0,0,0,0) ELSE ! Sinon, on l'ouvre IF fx&=-1 OR fy&=-1 ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,x&,y&,w&,h&) ' Calcul de la position de la fenˆtre de vue ' par rapport … la boŒte … outils ~@wind_get(INT{ADD(hwind%,idx_outils_dbl&)},wf_currxywh&,x&,y&,w&,h&) global_xf&=SHL(SHR(ADD(ADD(x&,w&),2),2),2) global_yf&=y& global_wf&=SUB(xmax&,global_xf&) global_hf&=SUB(ymax&,global_yf&) ELSE global_xf&=fx& global_yf&=fy& global_wf&=fw& global_hf&=fh& ENDIF calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) INT{ADD(hwind%,idx_vue_dbl&)}=@wind_create(attr&,global_xf&,global_yf&,global_wf&,global_hf&) ! Cr‚er la fenˆtre IF INT{ADD(hwind%,idx_vue_dbl&)}<0 ! Si la fenˆtre n'a pu ˆtre cr‚‚e ~@afficher_alerte(adr_nofenetre%) ! Pr‚venir ELSE ! Si la fenˆtre a pu ˆtre cr‚‚e CHAR{{OB_SPEC(adr_fenetre%,fenvue02&)}}=CHAR{titre_en_cours%} adr%=OB_SPEC(adr_divers%,titre&) CHAR{{OB_SPEC(adr_fenetre%,fenvue06&)}}=CHAR{adr%} wind_open(INT{ADD(hwind%,idx_vue_dbl&)},global_xf&,global_yf&,global_wf&,global_hf&) ! Ouverture fenˆtre mise_a_la_taille_fenetre_de_vue ENDIF ENDIF RETURN > PROCEDURE ouvrir_les_calages ecrire_donnees_dans_calages ouvrir_fenetre(idx_calage&,adr_calage%) RETURN > PROCEDURE ouvrir_info_objet ouvrir_fenetre(idx_info_objet&,adr_info_objet%) RETURN > PROCEDURE ouvrir_creation_quartic ouvrir_fenetre(idx_quartic&,adr_quartic%) RETURN > PROCEDURE ouvrir_creation_quadric ouvrir_fenetre(idx_quadric&,adr_quadric%) RETURN > PROCEDURE ouvrir_bibliotheque ouvrir_fenetre(idx_bibliotheque&,adr_bibliotheque%) RETURN > PROCEDURE ouvrir_hierarchie LOCAL xx&,yy&,ww&,hh& ' analyse_scene ww&=OB_W(adr_hierarchie%,hie_sous&) hh&=OB_H(adr_hierarchie%,hie_sous&) IF ww&>largeur_hierarchie% ww&=largeur_hierarchie% ENDIF IF hh&>hauteur_hierarchie% hh&=hauteur_hierarchie% ENDIF OB_W(adr_hierarchie%,hie_sous&)=ww& OB_H(adr_hierarchie%,hie_sous&)=hh& mise_a_la_taille_hierarchie ascenceurs_hierarchie etat_bouton_hierarchie_vertical(FALSE) etat_bouton_hierarchie_horizontal(FALSE) ouvrir_fenetre(idx_hierarchie&,adr_hierarchie%) ~@wind_get(INT{ADD(hwind%,idx_hierarchie_dbl&)},wf_currxywh&,xx&,yy&,ww&,hh&) ww&=OB_W(adr_hierarchie%,0) hh&=OB_H(adr_hierarchie%,0) wind_set(INT{ADD(hwind%,idx_hierarchie_dbl&)},wf_currxywh&,xx&,yy&,ww&,hh&) ' RETURN > PROCEDURE ouvrir_animation IF INT{ADD(hwind%,idx_animation_dbl&)}=-1 mise_a_la_taille_fenetre_d_anime(TRUE) ENDIF ouvrir_fenetre(idx_animation&,adr_animation%) RETURN ' ------------------------------------------------------------------------------ > PROCEDURE ouvrir_fenetre(index_de_fenetre&,adresse%) ' Ouverture fenˆtre formulaire LOCAL x&,y&,w&,h& ! Coordonn‚es du formulaire LOCAL attr& ! Attributs GEM de la fenˆtre LOCAL temp&,adr% ' IF index_de_fenetre&=idx_couleurs& fermeture_fenetre(idx_couleurs&) ENDIF ' attr&=&X0 ' Si la fenˆtre formulaire est d‚j… ouverte, on la replace en TOP IF INT{ADD(hwind%,SHL(index_de_fenetre&,1))}>-1 wind_set(INT{ADD(hwind%,SHL(index_de_fenetre&,1))},wf_top&,0,0,0,0) ~@wind_get(INT{ADD(hwind%,SHL(index_de_fenetre&,1))},wf_workxywh&,x&,y&,w&,h&) desactiver_fenetre ELSE ! Sinon, on l'ouvre ' Lire coordonn‚es courantes du formulaire (X sur un multiple de 16) x&=OB_X(adresse%,0) y&=OB_Y(adresse%,0) w&=OB_W(adresse%,0) h&=OB_H(adresse%,0) ' En d‚duire les coordonn‚es totales de la fenˆtre wind_calc(0,attr&,x&,y&,w&,h&,global_xf&,global_yf&,global_wf&,global_hf&) global_xf&=SHL(SHR(global_xf&,2),2) ! Sur un mulitple de 8 wind_calc(1,attr&,global_xf&,global_yf&,global_wf&,global_hf&,x&,y&,w&,h&) OB_X(adresse%,0)=x& IF global_yf& PROCEDURE fermeture_fenetre(numero|) LOCAL xw&,yw&,ww&,hw& IF INT{ADD(hwind%,numero|)}>-1 IF edit& CLR edit& ENDIF ~@wind_get(INT{ADD(hwind%,numero|)},wf_currxywh&,xw&,yw&,ww&,hw&) wind_close(INT{ADD(hwind%,numero|)}) wind_delete(INT{ADD(hwind%,numero|)}) INT{ADD(hwind%,numero|)}=-1 desactiver_fenetre IF avmx&<>-1 OR avmy&<>-1 ' Enlever la souris set_input_mode(sample&) ! Mode SAMPLE input_locator(avmx&,avmy&) ! Positionner la souris set_input_mode(request&) ! Retour en mode REQUEST ' Remettre la souris avmx&=-1 avmy&=-1 ENDIF ENDIF RETURN ' ------------------------------------------------------------------------------ > PROCEDURE fermeture_des_fenetres_temporaire LOCAL actu%,fin_actu%,i&,tmp%,actu%,xw&,yw&,ww&,hw&,temp& ' ---------------------------------------------------------------- ' ---- Merci … Pierre PONTAT pour l'id‚e de cette proc‚dure. ---- ' ---- Comme quoi, on ne peus pas penser … tout. ---- ' ---------------------------------------------------------------- ~@wind_get(0,wf_top&,i&,temp&,temp&,temp&) INT{temporaire%}=i& CLR i& tmp%=ADD(temporaire%,2) actu%=hwind% fin_actu%=ADD(actu%,60) DO ! Pour toutes les fenˆtres IF INT{actu%}>-1 ! Si la fenˆtre est ouverte INT{tmp%}=1 ! On la marque en m‚moire ~@wind_get(INT{actu%},wf_currxywh&,xw&,yw&,ww&,hw&) INT{ADD(tmp%,2)}=xw& INT{ADD(tmp%,4)}=yw& INT{ADD(tmp%,6)}=ww& INT{ADD(tmp%,8)}=hw& wind_close(INT{actu%}) ! et on la ferme rapidement, c'est plus propre ! mettre_a_jour_les_redraws(xw&,yw&,ww&,hw&,FALSE) IF @un_flacon redraw_force(i&,i&) ENDIF ELSE INT{tmp%}=0 ENDIF ADD tmp%,10 ADD actu%,2 LOOP WHILE actu% PROCEDURE reouverture_des_fenetres LOCAL i&,tmp%,actu%,fin_actu%,top& top&=INT{temporaire%} tmp%=ADD(temporaire%,2) CLR i& actu%=hwind% fin_actu%=ADD(actu%,60) DO ! Pour toutes les fenˆtres IF INT{tmp%}=1 ! Si elle ‚tait ouverte, on la r‚ouvre ! wind_open(INT{actu%},INT{ADD(tmp%,2)},INT{ADD(tmp%,4)},INT{ADD(tmp%,6)},INT{ADD(tmp%,8)}) mettre_a_jour_les_redraws(INT{ADD(tmp%,2)},INT{ADD(tmp%,4)},INT{ADD(tmp%,6)},INT{ADD(tmp%,8)},TRUE) IF @un_flacon redraw_force(i&,i&) ENDIF ENDIF ADD tmp%,10 ADD actu%,2 INC i& LOOP WHILE actu% PROCEDURE ecrire_donnees_dans_info ' CHAR{{OB_SPEC(adr_info%,infomem&)}}=STR$(@memoire_dispo(0),9) IF GEMDOS(&H44,L:-1,W:0)<>-32 ! La fonction est elle accept‚e CHAR{{OB_SPEC(adr_info%,infomemt&)}}=STR$(@memoire_dispo(1),9) ELSE CHAR{{OB_SPEC(adr_info%,infomemt&)}}="ABSENTE " ENDIF ' RETURN > PROCEDURE ecrire_donnees_dans_modification LOCAL px,py,pz LOCAL pw,ph,pf LOCAL rx,ry,rz ' modif_faite!=FALSE lire_donnees(objet_actif&,px,py,pz,pw,ph,pf,rx,ry,rz,couleur_active&,blob) ecrire_donnees(objet_actif&,px,py,pz,pw,ph,pf,rx,ry,rz,blob) lire_nouvelles_donnees(a_px,a_py,a_pz,a_tx,a_ty,a_tz,a_rx,a_ry,a_rz,a_cou&,a_calq|,a_blob) ' RETURN > PROCEDURE ecrire_donnees_dans_lumiere ' membfill(mem_src%,taille_source&,0) bmove(@adresse_source(source_active&),mem_src%,taille_source&) lire_les_sources(FALSE) ' RETURN > PROCEDURE ecrire_donnees_dans_aide ' ob_flags(adr_aide%,aidesous&,aes_hidetree&,FALSE) ob_flags(adr_aide%,clavier&,aes_hidetree&,TRUE) ob_state(adr_aide%,infsupp&,aes_selected&,TRUE) ' RETURN > PROCEDURE ecrire_donnees_dans_fonctions LOCAL adr_univ%,typ&,i&,num& LOCAL adr_poi%,adr_fac% LOCAL univ2%,adr% ' flags_blobs!=FALSE flags_masquage!=FALSE flags_effacement!=FALSE fermeture_fenetre(idx_fonctions_dbl&) CLR i& DO INT{ADD(effacement%,SHL(i&,1))}=-1 INC i& LOOP WHILE i&0 compteur_csg&=objets_a_deplacer& CLR i& DO CARD{ADD(effacement%,SHL(i&,1))}=CARD{ADD(deplacement_multiple%,SHL(i&,1))} INC i& LOOP WHILE i& PROCEDURE ecrire_donnees_dans_effacer LOCAL t%,i&,ob& ' flags_blobs!=FALSE flags_masquage!=FALSE flags_effacement!=TRUE membfill(effacement%,SHL(limite_des_objets&,1),0) IF objets_a_deplacer&>0 CLR i& DO INT{ADD(effacement%,SHL(CARD{ADD(deplacement_multiple%,SHL(i&,1))},1))}=1 INC i& LOOP WHILE i& PROCEDURE ecrire_donnees_dans_masquage LOCAL t%,nume&,univ%,univ2%,csg&,i& ' flags_blobs!=FALSE flags_masquage!=TRUE flags_effacement!=FALSE fermeture_fenetre(idx_fonctions_dbl&) CLR nume& DO univ%=@adresse_objet(nume&) dans_csg&=INT{ADD(univ%,offset_relation_csg&)} IF dans_csg&<>-1 ' Si l'objet appartient … une C.S.G, l'annuler pour le masquage CARD{ADD(effacement%,SHL(nume&,1))}=2 ELSE ' Sinon, tester normalement son ‚tat du masque IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_masque|) ! L…, il est masqu‚ CARD{ADD(effacement%,SHL(nume&,1))}=1 ELSE CARD{ADD(effacement%,SHL(nume&,1))}=0 ENDIF ENDIF INC nume& LOOP WHILE nume&0 CLR i& DO IF CARD{ADD(effacement%,SHL(nume&,1))}=0 CARD{ADD(effacement%,SHL(CARD{ADD(deplacement_multiple%,SHL(i&,1))},1))}=1 ENDIF INC i& LOOP WHILE i& PROCEDURE ecrire_donnees_dans_blobs LOCAL adr_univ%,typ&,i& LOCAL adr_poi%,adr_fac% LOCAL univ2% LOCAL adr%,cpt% ' flags_blobs!=TRUE flags_masquage!=FALSE flags_effacement!=FALSE fermeture_fenetre(idx_fonctions_dbl&) CLR i& DO INT{ADD(effacement%,SHL(i&,1))}=-1 INC i& LOOP WHILE i&0 compteur_csg&=objets_a_deplacer& CLR i& DO CARD{ADD(effacement%,SHL(i&,1))}=CARD{ADD(deplacement_multiple%,SHL(i&,1))} INC i& LOOP WHILE i& PROCEDURE ecrire_donnees_dans_calques ' ~@ecrire_etat_calques mod_cal!=FALSE ' RETURN > PROCEDURE ecrire_donnees_dans_statistiques LOCAL type&,univ% LOCAL tt&,i&,blb& LOCAL t0&,t1&,t2&,t3&,t4&,t5&,t6&,t7&,t8&,t9&,t10&,t11&,t12& LOCAL impfac&,impiob&,bezier&,mont&,tour&,extr&,uni&,int&,dif&,mer& LOCAL cptquar&,cptquad& ' tt&=nombre_d_objets& CLR i& DO univ%=@adresse_objet(i&) type&=INT{univ%} IF INT{ADD(univ%,offset_csg_type&)}=-1 INC uni& ELSE IF INT{ADD(univ%,offset_csg_type&)}=-2 INC int& ELSE IF INT{ADD(univ%,offset_csg_type&)}=-3 INC dif& ELSE IF INT{ADD(univ%,offset_csg_type&)}=-4 INC mer& ELSE IF INT{ADD(univ%,offset_csg_type&)}=-5 INC blb& ELSE IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) INC bezier& ELSE IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_montagne|) INC mont& ELSE IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_facette|) INC impfac& ELSE IF BTST(BYTE{ADD(univ%,offset_drapeau1&)},bit_quadric|) INC cptquad& ELSE IF BTST(BYTE{ADD(univ%,offset_drapeau1&)},bit_quartic|) INC cptquar& ELSE $S&,S> SELECT INT{univ%} CASE 0 INC t7& CASE 1 INC t0& CASE 2 INC t1& CASE 3 INC t3& CASE 4 INC t9& CASE 5 INC t10& CASE 6 INC t4& CASE 7 INC t5& CASE 8 INC t12& CASE 9 INC t8& CASE 10 INC t6& CASE 11 INC t2& CASE 12 INC t11& ENDSELECT ENDIF INC i& LOOP WHILE i& PROCEDURE ecrire_donnes_dans_merci ' position_curseur_merci(adr_merci%,popchoperem&,popchocarem&,-position_y_remerciement&,SUB(SUB(merci_txt_2&,merci_txt_1&),12),FALSE) ' RETURN > PROCEDURE ecrire_donnees_dans_camera ' ressource_camera(FALSE,-1) ' RETURN > PROCEDURE ecrire_donnees_dans_lanceur LOCAL i&,obv& ' ob_flags(adr_lanceur%,povlarge&,aes_editable&,BTST(OB_STATE(adr_lanceur%,format1&),aes_selected&)) ob_flags(adr_lanceur%,povhaute&,aes_editable&,BTST(OB_STATE(adr_lanceur%,format1&),aes_selected&)) ob_flags(adr_lanceur%,povlarge&,aes_selectable&,BTST(OB_STATE(adr_lanceur%,format1&),aes_selected&)) ob_flags(adr_lanceur%,povhaute&,aes_selectable&,BTST(OB_STATE(adr_lanceur%,format1&),aes_selected&)) IF NOT BTST(OB_STATE(adr_lanceur%,format1&),aes_selected&) i&=format0& DO IF BTST(OB_STATE(adr_lanceur%,i&),aes_selected&) obv&=i& i&=PRED(format1&) ENDIF INC i& LOOP WHILE i& PROCEDURE ecrire_donnees_dans_bicubic LOCAL u% ' u%=@adresse_objet(objet_actif&) IF BTST(BYTE{ADD(u%,offset_drapeau0&)},bit_bicubic|) afficher_les_points_bicubic(u%,FALSE) ELSE mettre_bicubic_par_defaut ENDIF ' RETURN > PROCEDURE ecrire_donnees_dans_calages LOCAL univ% ' CHAR{{OB_SPEC(adr_calage%,SUB(numacale&,2))}}=STR$(SUCC(objet_actif&),4) CHAR{{OB_SPEC(adr_calage%,SUB(numrefe&,2))}}=STR$(SUCC(objet_actif&),4) univ%=@adresse_objet(objet_actif&) BYTE{ADD(ADD(univ%,offset_nom_objet&),21)}=0 CHAR{{OB_SPEC(adr_calage%,nomacale&)}}=LEFT$(CHAR{ADD(univ%,offset_nom_objet&)}+SPACE$(21),21) ' RETURN ' ************** Gestion des formulaires en fenˆtre GEM ************************ > PROCEDURE gestion_information LOCAL xx&,yy&,ww&,hh& objc_offset(adr_info%,souinf0&,xx&,yy&) ww&=OB_W(adr_info%,souinf0&) hh&=OB_H(adr_info%,souinf0&) $S&,$S> SELECT objet& CASE infgener&,infsyste&,sharewar& ob_state(adr_info%,infgener&,aes_selected&,objet&=infgener&) ob_state(adr_info%,infsyste&,aes_selected&,objet&=infsyste&) ob_state(adr_info%,sharewar&,aes_selected&,objet&=sharewar&) ob_flags(adr_info%,souinf0&,aes_hidetree&,objet&<>infgener&) ob_flags(adr_info%,souinf1&,aes_hidetree&,objet&<>infsyste&) ob_flags(adr_info%,souinf2&,aes_hidetree&,objet&<>sharewar&) redraw_elem(adr_info%,infgener&) redraw_elem(adr_info%,infsyste&) redraw_elem(adr_info%,sharewar&) objc_draw(adr_info%,0,12,xx&,yy&,ww&,hh&,-1) CASE merci& objc_change(adr_info%,objet&) IF BTST(kbd&,cl_control&) AND BTST(kbd&,cl_alternate&) ouvrir_image_auteur ELSE ouvrir_merci ENDIF CASE fininfo& objc_change(adr_info%,objet&) fermeture_fenetre(idx_info&) ENDSELECT RETURN > PROCEDURE gestion_outils LOCAL arbre%,reponse&,i&,azo LOCAL zx&,zy&,zw&,zh&,rx&,ry& LOCAL tot,fx&,fy&,fw&,fh& LOCAL px,py,pz,pw,ph,pf,rx,ry,rz $S&,$S> SELECT objet& CASE ioutil01& objc_change2(adr_outils%,objet&) videsouris @selection_outils(0) redraw_force(idx_outils&,idx_outils&) CASE ioutil02& objc_change2(adr_outils%,objet&) videsouris @selection_outils(1) redraw_force(idx_outils&,idx_outils&) CASE ioutil03& objc_change2(adr_outils%,objet&) videsouris @selection_outils(2) redraw_force(idx_outils&,idx_outils&) CASE icharger& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris mise_en_place_popup(chxancsc&) rx&=SUB(global_mx&,DIV(OB_W(adr_popup_divers%,chxancsc&),2)) ry&=SUB(global_my&,DIV(OB_H(adr_popup_divers%,chxancsc&),2)) positionner_popup(-2,0,0,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,ancsce01&,ancsce02&,0) IF reponse&<255 charger_une_ancienne_scene(reponse&) ENDIF ELSE videsouris charger_fichier_ebs(FALSE) mise_a_jour_des_chemins_et_nom_de_fichier mise_a_jour_de_l_objet_actif(TRUE) ENDIF redraw_force(idx_info&,idx_animation&) CASE isauver& objc_change2(adr_outils%,objet&) CHAR{masque%}="ebs"+CHR$(0) IF global_mk&=2 OR click&=2 videsouris definition_fichier(adr_parametres%,cheebs&,nom_en_cours%,FALSE,FALSE,-1) IF CHAR{nom_en_cours%}<>"" sauvegarde_fichiers_ebs(TRUE) ELSE sauver_fichier_ebs ENDIF ELSE videsouris sauver_fichier_ebs ENDIF mise_a_jour_des_chemins_et_nom_de_fichier redraw_force(24,24) CASE ispov& objc_change2(adr_outils%,objet&) IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) generation_de_scripts(FALSE) ELSE IF global_mk&=2 OR click&=2 videsouris IF INSTR(CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}},".") CHAR{msq%}="ebs"+CHR$(0) minuscule(msq%) IF RIGHT$(CHAR{titre_en_cours%},SUB(LEN(CHAR{titre_en_cours%}),LEN(LEFT$(CHAR{titre_en_cours%},RINSTR(CHAR{titre_en_cours%},"\")))))=LEFT$(CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}},INSTR(CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}},"."))+CHAR{msq%} CHAR{commande%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"modules\sauvpov3.drv"+CHR$(0) IF @s_exist(commande%) generation_de_scripts(TRUE) ELSE generation_de_scripts(FALSE) ENDIF ELSE generation_de_scripts(FALSE) ENDIF ELSE IF RIGHT$(CHAR{titre_en_cours%},SUB(LEN(CHAR{titre_en_cours%}),LEN(LEFT$(CHAR{titre_en_cours%},RINSTR(CHAR{titre_en_cours%},"\")))))=CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}} CHAR{commande%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"modules\sauvpov3.drv"+CHR$(0) IF @s_exist(commande%) generation_de_scripts(TRUE) ELSE generation_de_scripts(FALSE) ENDIF ELSE generation_de_scripts(FALSE) ENDIF ENDIF ELSE videsouris generation_de_scripts(FALSE) ENDIF ENDIF CASE iipov& objc_change2(adr_outils%,objet&) videsouris importation_d_objets mise_a_jour_de_l_objet_actif(TRUE) CASE iliste& objc_change2(adr_outils%,objet&) videsouris gestion_des_outils_externes CASE istat& objc_change2(adr_outils%,objet&) videsouris ouvrir_statistiques CASE iinfo& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris info_objet_supp!=TRUE ouvrir_info_objet ELSE videsouris ouvrir_information ENDIF CASE itrait& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris creation(0,FALSE) ouvrir_modification ELSE videsouris creation(0,TRUE) ENDIF CASE iboite& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris creation(1,FALSE) ouvrir_modification ELSE videsouris creation(1,TRUE) ENDIF CASE isphere& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris creation(2,FALSE) ouvrir_modification ELSE videsouris creation(2,TRUE) ENDIF CASE iprisme& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris creation(3,FALSE) ouvrir_modification ELSE videsouris creation(3,TRUE) ENDIF CASE ifcone& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris creation(4,FALSE) ouvrir_modification ELSE videsouris creation(4,TRUE) ENDIF CASE itroncon& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris creation(5,FALSE) ouvrir_modification ELSE videsouris creation(5,TRUE) ENDIF CASE idemisph& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris creation(6,FALSE) ouvrir_modification ELSE videsouris creation(6,TRUE) ENDIF CASE itube& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris creation(7,FALSE) ouvrir_modification ELSE videsouris creation(7,TRUE) ENDIF CASE idisque& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris creation(8,FALSE) ouvrir_modification ELSE videsouris creation(8,TRUE) ENDIF CASE ipyramid& objc_change2(adr_outils%,objet&) videsouris ~@afficher_alerte(adr_mauvaise_version%) videsouris CASE icolonne& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris creation(10,FALSE) ouvrir_modification ELSE videsouris creation(10,TRUE) ENDIF CASE iplan& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris creation(11,FALSE) ouvrir_modification ELSE videsouris creation(11,TRUE) ENDIF CASE itor& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris creation(12,FALSE) ouvrir_modification ELSE videsouris creation(12,TRUE) ENDIF CASE itourext& objc_change2(adr_outils%,objet&) videsouris generateur_exterieur(1) CASE itaille& objc_change2(adr_outils%,objet&) videsouris ouvrir_creation_des_blobs CASE imont& objc_change2(adr_outils%,objet&) videsouris generateur_exterieur(0) CASE icarreau& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris mise_en_place_popup(chxbicub&) positionner_popup(2,objet&,adr_outils%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,bicub01&,bicub02&,0) IF reponse&<>255 creation_objet_bicubic_pre_definie(reponse&) redraw_force(1,1) redraw_force(24,24) ENDIF ELSE videsouris ouvrir_bicubics ENDIF CASE icsg& objc_change2(adr_outils%,objet&) videsouris ouvrir_fonctions CASE ireel& objc_change2(adr_outils%,objet&) videsouris ouvrir_animation CASE imodif& objc_change2(adr_outils%,objet&) videsouris ouvrir_modification CASE ioption& objc_change2(adr_outils%,objet&) videsouris mise_en_place_popup(chxfnct&) positionner_popup(2,objet&,adr_outils%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,fnc01&,fnc02&,0) IF reponse&<>255 $S&,$S> SELECT reponse& CASE 0 ouvrir_effacer CASE 1 copier_objet_actif CASE 2 ouvrir_masquage_des_objets CASE 3 ouvrir_les_calques ENDSELECT ENDIF CASE icamera& objc_change2(adr_outils%,objet&) videsouris ouvrir_camera CASE ilampe& objc_change2(adr_outils%,objet&) videsouris ouvrir_lumieres CASE itexture& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 videsouris ' IF normal_camera! ' fermeture_fenetre(44) ' normal_camera!=FALSE ' mettre_a_jour_les_redraws(global_xb&,global_yb&,global_wb&,global_hb&,-1) ' ENDIF IF nombre_d_objets&>0 mise_en_place_popup(chxhalde&) positionner_popup(2,objet&,adr_outils%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,haldes01&,haldes02&,0) IF reponse&<>255 $S&,$S> SELECT reponse& CASE 0 lancement_gestion_texture ' ouvrir_textures CASE 1 lancement_gestion_texture ' ouvrir_pigment CASE 2 lancement_gestion_texture ' ouvrir_normal CASE 3 lancement_gestion_texture ' ouvrir_finish CASE 4 lancement_gestion_texture ' ouvrir_interior CASE 5 lancement_gestion_texture ' ouvrir_atmosphere ENDSELECT ENDIF ELSE lancement_gestion_texture ' ouvrir_atmosphere ENDIF ELSE videsouris ' IF normal_camera! ' fermeture_fenetre(44) ' normal_camera!=FALSE ' mettre_a_jour_les_redraws(global_xb&,global_yb&,global_wb&,global_hb&,-1) ' ENDIF IF nombre_d_objets&>0 lancement_gestion_texture ' ouvrir_textures ELSE lancement_gestion_texture ' ouvrir_atmosphere ENDIF ENDIF CASE iface& videsouris changement_de_vue(vue_de_face|) CASE idroite& videsouris changement_de_vue(vue_de_droite|) CASE ihaut& videsouris changement_de_vue(vue_de_dessus|) CASE idos& videsouris changement_de_vue(vue_de_dos|) CASE igauche& videsouris changement_de_vue(vue_de_gauche|) CASE ibas& videsouris changement_de_vue(vue_de_dessous|) CASE ifil& IF global_mk&=2 OR click&=2 videsouris IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) objc_change2(adr_outils%,objet&) ouvrir_vue_subjective ELSE changement_de_vue(11) ENDIF ELSE videsouris changement_de_vue(6) ENDIF CASE ifaces& IF global_mk&=2 OR click&=2 videsouris objc_change2(adr_outils%,objet&) IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) ouvrir_vue_subjective ELSE changement_de_vue(11) ENDIF ELSE videsouris changement_de_vue(7) ENDIF CASE iplein& objc_change2(adr_outils%,objet&) videsouris mise_en_place_popup(chxface&) positionner_popup(2,objet&,adr_outils%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,faces01&,faces02&,0) IF reponse&<>255 $S&,$S> SELECT reponse& CASE 0 ! Mode Bookgniht changement_de_vue(8) CASE 1 ! Mode Gouraud ouvrir_vue_fine changement_de_vue(9) CASE 2 ! Mode Phong ouvrir_vue_fine changement_de_vue(10) ENDSELECT ENDIF CASE izmoins& objc_change2(adr_outils%,objet&) IF zoom%>10 SUB zoom%,10 IF zoom%<10 zoom%=10 ENDIF ecrire_zoom_dans_outils(TRUE) tri_2d!=FALSE CLR global_amx&,global_amy& ENDIF CASE izplus& objc_change2(adr_outils%,objet&) IF zoom%<102389 ADD zoom%,10 ecrire_zoom_dans_outils(TRUE) CLR global_amx&,global_amy& tri_2d!=FALSE ENDIF CASE izsouris& objc_change2(adr_outils%,objet&) IF dessin_3d|0 AND total_auto! tri_2d!=FALSE redessin_deja_fait!=FALSE redraw_force(24,24) ENDIF CASE izcentre& centrage_auto!=NOT centrage_auto! ob_state(adr_outils%,izcentre&,aes_selected&,centrage_auto!) redraw_element_fenetre(2,adr_outils%,izcentre&) IF nombre_d_objets&>0 AND centrage_auto! redessin_deja_fait!=FALSE redraw_force(24,24) ENDIF CASE iimgfond& image_de_calque!=NOT image_de_calque! ob_state(adr_outils%,iimgfond&,aes_selected&,image_de_calque!) redraw_element_fenetre(2,adr_outils%,iimgfond&) redessin_deja_fait!=FALSE redraw_force(24,24) CASE izredraw& objc_change2(adr_outils%,objet&) IF global_mk&=2 OR click&=2 IF fl_timer! temps_des_calcul!=TRUE ouvrir_temps_passe ELSE redessin_deja_fait!=FALSE redraw_force(24,24) ENDIF ELSE redessin_deja_fait!=FALSE redraw_force(24,24) ENDIF CASE izoom& objc_change2(adr_outils%,objet&) azo%=zoom% IF global_mk&=2 OR click&=2 videsouris ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_workxywh&,fx&,fy&,fw&,fh&) ADD global_mx&,16 IF global_my&PRED(ADD(fx&,fw&)) global_mx&=SUB(PRED(ADD(fx&,fw&)),OB_W(adr_popup_autre2%,0)) ENDIF IF PRED(ADD(global_my&,OB_H(adr_popup_autre2%,0)))>PRED(ADD(fy&,fh&)) global_my&=SUB(PRED(ADD(fy&,fh&)),OB_H(adr_popup_autre2%,0)) ENDIF debut_popup_valeur&=VAL(CHAR{{OB_SPEC(adr_outils%,objet&)}}) IF debut_popup_valeur&=>992 debut_popup_valeur&=992 ENDIF global_mx&=SHL(SHR(global_mx&,4),4) reponse&=@popup_de_valeur(global_mx&,global_my&,1,999,0) IF reponse&<>1000 CHAR{{OB_SPEC(adr_outils%,izoom&)}}=STR$(ROUND(reponse&/100,2),6,2) ENDIF ELSE saisie_d_une_composante(adr_outils%,izoom&,0,999.99,6,2) ENDIF IF LEN(CHAR{{OB_SPEC(adr_outils%,izoom&)}})=0 CHAR{{OB_SPEC(adr_outils%,izoom&)}}="10" ENDIF zoom%=ROUND(VAL(CHAR{{OB_SPEC(adr_outils%,izoom&)}}),2)*1024 IF zoom%<10 zoom%=10 ENDIF IF zoom%<>azo% ecrire_zoom_dans_outils(TRUE) tri_2d!=FALSE redessin_deja_fait!=FALSE redraw_force(24,24) ENDIF ENDSELECT RETURN > PROCEDURE gestion_vue_subjective LOCAL reponse& LOCAL uni% ' $S&,$S> SELECT objet& CASE possubx&,possuby&,possubz&,subversx&,subversy&,subversz& saisie_d_une_composante(adr_vue_subjective%,objet&,-32768,32767,10,3) CASE subposob& objc_change(adr_vue_subjective%,objet&) positionner_popup(-1,objet&,adr_vue_subjective%,adr_popup_autre0%,rx&,ry&) CLR debut_popup_choix& reponse&=@popup_de_choix(rx&,ry&,adr_vue_subjective%) IF reponse&<>-1 uni%=@adresse_objet(reponse&) CHAR{{OB_SPEC(adr_vue_subjective%,possubx&)}}=STR$(ROUND(SINGLE{ADD(uni%,2)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possuby&)}}=STR$(ROUND(SINGLE{ADD(uni%,6)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possubz&)}}=STR$(ROUND(SINGLE{ADD(uni%,10)},3),10,3) redraw_elem(adr_vue_subjective%,possubx&) redraw_elem(adr_vue_subjective%,possuby&) redraw_elem(adr_vue_subjective%,possubz&) ENDIF CASE subposob& objc_change(adr_vue_subjective%,objet&) positionner_popup(-1,objet&,adr_vue_subjective%,adr_popup_autre0%,rx&,ry&) CLR debut_popup_choix& reponse&=@popup_de_choix(rx&,ry&,adr_vue_subjective%) IF reponse&<>-1 uni%=@adresse_objet(reponse&) CHAR{{OB_SPEC(adr_vue_subjective%,possubx&)}}=STR$(ROUND(SINGLE{ADD(uni%,2)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possuby&)}}=STR$(ROUND(SINGLE{ADD(uni%,6)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possubz&)}}=STR$(ROUND(SINGLE{ADD(uni%,10)},3),10,3) redraw_elem(adr_vue_subjective%,possubx&) redraw_elem(adr_vue_subjective%,possuby&) redraw_elem(adr_vue_subjective%,possubz&) ENDIF CASE subvisob& objc_change(adr_vue_subjective%,objet&) positionner_popup(-1,objet&,adr_vue_subjective%,adr_popup_autre0%,rx&,ry&) CLR debut_popup_choix& reponse&=@popup_de_choix(rx&,ry&,adr_vue_subjective%) IF reponse&<>-1 uni%=@adresse_objet(reponse&) CHAR{{OB_SPEC(adr_vue_subjective%,subversx&)}}=STR$(ROUND(SINGLE{ADD(uni%,2)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversy&)}}=STR$(ROUND(SINGLE{ADD(uni%,6)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversz&)}}=STR$(ROUND(SINGLE{ADD(uni%,10)},3),10,3) redraw_elem(adr_vue_subjective%,subversx&) redraw_elem(adr_vue_subjective%,subversy&) redraw_elem(adr_vue_subjective%,subversz&) ENDIF CASE poscampo& objc_change(adr_vue_subjective%,objet&) IF vue_subjective!=TRUE CHAR{{OB_SPEC(adr_vue_subjective%,possubx&)}}=STR$(ROUND(SINGLE{mem_subj%},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possuby&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,4)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possubz&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,8)},3),10,3) ELSE CHAR{{OB_SPEC(adr_vue_subjective%,possubx&)}}=STR$(ROUND(SINGLE{camera%},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possuby&)}}=STR$(ROUND(SINGLE{ADD(camera%,4)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possubz&)}}=STR$(ROUND(SINGLE{ADD(camera%,8)},3),10,3) ENDIF redraw_elem(adr_vue_subjective%,possubx&) redraw_elem(adr_vue_subjective%,possuby&) redraw_elem(adr_vue_subjective%,possubz&) CASE poscamvi& objc_change(adr_vue_subjective%,objet&) IF vue_subjective!=TRUE CHAR{{OB_SPEC(adr_vue_subjective%,possubx&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,12)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possuby&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,16)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possubz&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,20)},3),10,3) ELSE CHAR{{OB_SPEC(adr_vue_subjective%,possubx&)}}=STR$(ROUND(SINGLE{ADD(camera%,12)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possuby&)}}=STR$(ROUND(SINGLE{ADD(camera%,16)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possubz&)}}=STR$(ROUND(SINGLE{ADD(camera%,20)},3),10,3) ENDIF redraw_elem(adr_vue_subjective%,possubx&) redraw_elem(adr_vue_subjective%,possuby&) redraw_elem(adr_vue_subjective%,possubz&) CASE subcampo& objc_change(adr_vue_subjective%,objet&) IF vue_subjective!=TRUE CHAR{{OB_SPEC(adr_vue_subjective%,subversx&)}}=STR$(ROUND(SINGLE{mem_subj%},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversy&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,4)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversz&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,8)},3),10,3) ELSE CHAR{{OB_SPEC(adr_vue_subjective%,subversx&)}}=STR$(ROUND(SINGLE{camera%},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversy&)}}=STR$(ROUND(SINGLE{ADD(camera%,4)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversz&)}}=STR$(ROUND(SINGLE{ADD(camera%,8)},3),10,3) ENDIF redraw_elem(adr_vue_subjective%,subversx&) redraw_elem(adr_vue_subjective%,subversy&) redraw_elem(adr_vue_subjective%,subversz&) CASE subcamvi& objc_change(adr_vue_subjective%,objet&) IF vue_subjective!=TRUE CHAR{{OB_SPEC(adr_vue_subjective%,subversx&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,12)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversy&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,16)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversz&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,20)},3),10,3) ELSE CHAR{{OB_SPEC(adr_vue_subjective%,subversx&)}}=STR$(ROUND(SINGLE{ADD(camera%,12)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversy&)}}=STR$(ROUND(SINGLE{ADD(camera%,16)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversz&)}}=STR$(ROUND(SINGLE{ADD(camera%,20)},3),10,3) ENDIF redraw_elem(adr_vue_subjective%,subversx&) redraw_elem(adr_vue_subjective%,subversy&) redraw_elem(adr_vue_subjective%,subversz&) CASE poslampo& objc_change(adr_vue_subjective%,objet&) positionner_popup(-1,objet&,adr_vue_subjective%,adr_popup_autre1%,rx&,ry&) CLR debut_popup_lum& reponse&=@popup_de_lumiere(rx&,ry&,adr_vue_subjective%) IF reponse&<>-1 uni%=@adresse_source(reponse&) CHAR{{OB_SPEC(adr_vue_subjective%,possubx&)}}=STR$(ROUND(SINGLE{ADD(uni%,8)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possuby&)}}=STR$(ROUND(SINGLE{ADD(uni%,12)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possubz&)}}=STR$(ROUND(SINGLE{ADD(uni%,16)},3),10,3) redraw_elem(adr_vue_subjective%,possubx&) redraw_elem(adr_vue_subjective%,possuby&) redraw_elem(adr_vue_subjective%,possubz&) ENDIF CASE poslamvi& objc_change(adr_vue_subjective%,objet&) positionner_popup(-1,objet&,adr_vue_subjective%,adr_popup_autre1%,rx&,ry&) CLR debut_popup_lum& reponse&=@popup_de_lumiere(rx&,ry&,adr_vue_subjective%) IF reponse&<>-1 uni%=@adresse_source(reponse&) CHAR{{OB_SPEC(adr_vue_subjective%,possubx&)}}=STR$(ROUND(SINGLE{ADD(uni%,20)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possuby&)}}=STR$(ROUND(SINGLE{ADD(uni%,24)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,possubz&)}}=STR$(ROUND(SINGLE{ADD(uni%,28)},3),10,3) redraw_elem(adr_vue_subjective%,possubx&) redraw_elem(adr_vue_subjective%,possuby&) redraw_elem(adr_vue_subjective%,possubz&) ENDIF CASE sublampo& objc_change(adr_vue_subjective%,objet&) positionner_popup(-1,objet&,adr_vue_subjective%,adr_popup_autre1%,rx&,ry&) CLR debut_popup_lum& reponse&=@popup_de_lumiere(rx&,ry&,adr_vue_subjective%) IF reponse&<>-1 uni%=@adresse_source(reponse&) CHAR{{OB_SPEC(adr_vue_subjective%,subversx&)}}=STR$(ROUND(SINGLE{ADD(uni%,8)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversy&)}}=STR$(ROUND(SINGLE{ADD(uni%,12)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversz&)}}=STR$(ROUND(SINGLE{ADD(uni%,16)},3),10,3) redraw_elem(adr_vue_subjective%,subversx&) redraw_elem(adr_vue_subjective%,subversy&) redraw_elem(adr_vue_subjective%,subversz&) ENDIF CASE sublamvi& objc_change(adr_vue_subjective%,objet&) positionner_popup(-1,objet&,adr_vue_subjective%,adr_popup_autre1%,rx&,ry&) CLR debut_popup_lum& reponse&=@popup_de_lumiere(rx&,ry&,adr_vue_subjective%) IF reponse&<>-1 uni%=@adresse_source(reponse&) CHAR{{OB_SPEC(adr_vue_subjective%,subversx&)}}=STR$(ROUND(SINGLE{ADD(uni%,20)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversy&)}}=STR$(ROUND(SINGLE{ADD(uni%,24)},3),10,3) CHAR{{OB_SPEC(adr_vue_subjective%,subversz&)}}=STR$(ROUND(SINGLE{ADD(uni%,28)},3),10,3) redraw_elem(adr_vue_subjective%,subversx&) redraw_elem(adr_vue_subjective%,subversy&) redraw_elem(adr_vue_subjective%,subversz&) ENDIF CASE annusubj& objc_change(adr_vue_subjective%,objet&) fermeture_fenetre(idx_vue_subjective_dbl&) videsouris redraw_force(idx_info&,idx_animation&) CASE valisubj& objc_change(adr_vue_subjective%,objet&) videsouris changement_de_vue(11) redraw_force(idx_info&,idx_animation&) ENDSELECT RETURN > PROCEDURE gestion_modifications LOCAL i&,j&,fin_j&,reponse&,flag0|,flag1| LOCAL univ%,choix&,univ2%,smo! LOCAL p1,ob_spec%,coefid LOCAL adr_poi% LOCAL nbx&,nby&,pasx,pasy,c& LOCAL xc&,yc&,wc&,hc&,x&,y& LOCAL px,py,pz LOCAL pw,ph,pf LOCAL rx,ry,rz LOCAL px&,py& LOCAL rx&,ry&,rz& LOCAL numero&,deps%,depd%,dept% LOCAL adr_p%,adr_f%,num_ob&,mem_ob_ac& LOCAL xp&,yp&,wp&,hp&,memo,ob&,te_color& LOCAL coefx,coefy,coefz,memor%,nu% LOCAL nbp%,nbf%,adr_obje%,adr_face% $S&,$S> SELECT objet& CASE modthrbl& ob&=objet& memo=VAL(CHAR{{OB_SPEC(adr_modifier%,objet&)}}) saisie_d_une_composante(adr_modifier%,objet&,0.00001,0.99999,8,5) IF memo<>VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}}) modif_normale!=FALSE modif_faite!=TRUE ENDIF CASE modforbl& ob&=objet& memo=VAL(CHAR{{OB_SPEC(adr_modifier%,objet&)}}) saisie_d_une_composante(adr_modifier%,objet&,-1,1,8,5) IF memo<>VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}}) modif_normale!=FALSE modif_faite!=TRUE ENDIF CASE modtaide& videsouris CASE annupere& objc_change(adr_modifier%,objet&) CHAR{{OB_SPEC(adr_modifier%,SUB(modipere&,2))}}="-1" univ%=@adresse_objet(objet_actif&) CARD{ADD(univ%,offset_pere&)}=0 redraw_elem(adr_modifier%,modipere&) CASE modipere& objc_change(adr_modifier%,objet&) positionner_popup(idx_modification_dbl&,objet&,adr_modifier%,adr_popup_autre0%,rx&,ry&) debut_popup_choix&=PRED(VAL(CHAR{{OB_SPEC(adr_modifier%,SUB(modipere&,2))}})) IF nombre_d_objets&>9 debut_popup_choix&=-debut_popup_choix&*(debut_popup_choix&=>0 AND debut_popup_choix&<=SUB(nombre_d_objets&,10))+0*(debut_popup_choix&<0)-SUB(nombre_d_objets&,10)*(debut_popup_choix&>SUB(nombre_d_objets&,10)) ELSE CLR debut_popup_choix& ENDIF reponse&=@popup_de_choix(rx&,ry&,0) IF reponse&<>-1 IF reponse&<>objet_actif& CHAR{{OB_SPEC(adr_modifier%,SUB(modipere&,2))}}=STR$(SUCC(reponse&),3) univ%=@adresse_objet(objet_actif&) CARD{ADD(univ%,offset_pere&)}=SUCC(reponse&) ' ********************************************************************** ' **** Zone de d‚finition de la liaison des deux objets **** ' ********************************************************************** univ2%=@adresse_liaison(objet_actif&) CARD{univ2%}=0 ! Flags de liaison {ADD(univ2%,2)}=0 !\ {ADD(univ2%,6)}=0 ! > Coordonn‚es de la {ADD(univ2%,10)}=0 !/ liaison {ADD(univ2%,14)}=0 !\ - {ADD(univ2%,18)}=0 !/ + Limite Translation X {ADD(univ2%,22)}=0 !\ - {ADD(univ2%,26)}=0 !/ + Limite Translation Y {ADD(univ2%,30)}=0 !\ - {ADD(univ2%,34)}=0 !/ + Limite Translation Z INT{ADD(univ2%,38)}=0 !\ - INT{ADD(univ2%,40)}=0 !/ + Limite Rotation X INT{ADD(univ2%,42)}=0 !\ - INT{ADD(univ2%,44)}=0 !/ + Limite Rotation Y INT{ADD(univ2%,46)}=0 !\ - INT{ADD(univ2%,48)}=0 !/ + Limite Rotation Z ' ********************************************************************** redraw_elem(adr_modifier%,modipere&) ENDIF ENDIF CASE ensmooth& BYTE{ADD(@adresse_objet(objet_actif&),offset_drapeau1&)}=BCHG(BYTE{ADD(@adresse_objet(objet_actif&),offset_drapeau1&)},bit_smooth|) smo!=BTST(BYTE{ADD(@adresse_objet(objet_actif&),offset_drapeau1&)},bit_smooth|) ob_state(adr_modifier%,objet&,aes_selected&,smo!) redraw_elem(adr_modifier%,objet&) IF objets_a_deplacer&>0 CLR i& DO j&=CARD{ADD(deplacement_multiple%,SHL(i&,1))} IF smo! BYTE{ADD(@adresse_objet(j&),offset_drapeau1&)}=BSET(BYTE{ADD(@adresse_objet(j&),offset_drapeau1&)},bit_smooth|) ELSE BYTE{ADD(@adresse_objet(j&),offset_drapeau1&)}=BCLR(BYTE{ADD(@adresse_objet(j&),offset_drapeau1&)},bit_smooth|) ENDIF INC i& LOOP WHILE i&0 CLR i& DO j&=CARD{ADD(deplacement_multiple%,SHL(i&,1))} IF smo! BYTE{ADD(@adresse_objet(j&),offset_drapeau0&)}=BSET(BYTE{ADD(@adresse_objet(j&),offset_drapeau0&)},bit_in_out|) ELSE BYTE{ADD(@adresse_objet(j&),offset_drapeau0&)}=BCLR(BYTE{ADD(@adresse_objet(j&),offset_drapeau0&)},bit_in_out|) ENDIF INC i& LOOP WHILE i&255 CHAR{{OB_SPEC(adr_modifier%,modicalq&)}}=STR$(SUCC(reponse&),2) modif_normale!=FALSE modif_faite!=TRUE redraw_elem(adr_modifier%,calqmodi&) ENDIF univ%=@adresse_objet(objet_actif&) CASE modcoul& mise_en_place_popup(chxcoul&) positionner_popup(idx_modification_dbl&,objet&,adr_modifier%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,coul0&,coul15&,0) IF reponse&<>255 AND reponse&<>a_cou& ob_spec%=OB_SPEC(adr_modifier%,modcoul&) te_color&=INT{ADD(ob_spec%,18)} te_color&=te_color& AND -128 te_color&=te_color& OR 112 ! Trame pleine te_color&=te_color& OR reponse& ! Couleur de l'objet INT{ADD(ob_spec%,18)}=te_color& CHAR{{OB_SPEC(adr_modifier%,modcoul&)}}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(coul0&,reponse&))}} modif_normale!=FALSE modif_faite!=TRUE redraw_elem(adr_modifier%,modcoul&) ENDIF CASE typmod& IF NOT BTST(OB_STATE(adr_modifier%,typmod&),aes_disable&) objc_change(adr_modifier%,objet&) mise_en_place_popup(chxprimi&) positionner_popup(idx_modification_dbl&,objet&,adr_modifier%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,pop0&,pop1&,0) IF reponse&<>255 changer_de_type_a_l_objet_actif(reponse&) ENDIF ENDIF CASE rappcone& objc_change(adr_modifier%,objet&) ob&=objet& memo=VAL(CHAR{{OB_SPEC(adr_modifier%,objet&)}}) IF global_mk&=2 OR click&=2 positionner_popup(idx_modification_dbl&,objet&,adr_modifier%,adr_popup_autre2%,rx&,ry&) debut_popup_valeur&=VAL(CHAR{{OB_SPEC(adr_modifier%,objet&)}}) IF debut_popup_valeur&=>93 debut_popup_valeur&=93 ENDIF reponse&=@popup_de_valeur(rx&,ry&,0,100,0) IF reponse&<>1000 CHAR{{OB_SPEC(adr_modifier%,objet&)}}=STR$(reponse&) redraw_elem(adr_modifier%,objet&) ENDIF ELSE saisie_d_une_composante(adr_modifier%,objet&,0,100,3,0) ENDIF objc_change(adr_modifier%,ob&) IF memo<>VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}}) modif_normale!=TRUE modif_faite!=TRUE ENDIF CASE modtora1&,modtora2& ob&=objet& memo=VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}}) IF global_mk&=2 OR click&=2 positionner_popup(idx_modification_dbl&,ob&,adr_modifier%,adr_popup_autre2%,rx&,ry&) debut_popup_valeur&=VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}}) IF debut_popup_valeur&=>353 debut_popup_valeur&=353 ENDIF reponse&=@popup_de_valeur(rx&,ry&,-360,360,0) IF reponse&<>1000 CHAR{{OB_SPEC(adr_modifier%,ob&)}}=STR$(reponse&,4) redraw_elem(adr_modifier%,ob&) ENDIF ELSE saisie_d_une_composante(adr_modifier%,ob&,-360,360,4,0) ENDIF IF memo<>VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}}) modif_normale!=TRUE modif_faite!=TRUE ENDIF CASE nummod& objc_change(adr_modifier%,objet&) positionner_popup(idx_modification_dbl&,objet&,adr_modifier%,adr_popup_autre0%,rx&,ry&) debut_popup_choix&=PRED(VAL(CHAR{{OB_SPEC(adr_modifier%,modnum&)}})) IF nombre_d_objets&>9 debut_popup_choix&=-debut_popup_choix&*(debut_popup_choix&=>0 AND debut_popup_choix&<=SUB(nombre_d_objets&,10))+0*(debut_popup_choix&<0)-SUB(nombre_d_objets&,10)*(debut_popup_choix&>SUB(nombre_d_objets&,10)) ELSE CLR debut_popup_choix& ENDIF reponse&=@popup_de_choix(rx&,ry&,0) IF reponse&<>-1 changer_d_objet_actif(reponse&) ENDIF CASE modifnom& saisie_d_une_ligne(adr_modifier%,objet&,valmod&,0,0,22,0) objc_change(adr_modifier%,objet&) modif_normale!=FALSE modif_faite!=TRUE CASE modpx&,modpy&,modpz& ob&=objet& memo=VAL(CHAR{{OB_SPEC(adr_modifier%,objet&)}}) saisie_d_une_composante(adr_modifier%,objet&,-32768,32767,10,3) IF memo<>VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}}) modif_normale!=FALSE modif_faite!=TRUE ENDIF CASE modtx& ob&=objet& memo=VAL(CHAR{{OB_SPEC(adr_modifier%,objet&)}}) saisie_d_une_composante(adr_modifier%,objet&,0.001,65535,9,3) IF memo<>VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}}) modif_normale!=TRUE modif_faite!=TRUE IF BTST(OB_STATE(adr_modifier%,modtaide&),aes_selected&) coefid=VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}})/memo CHAR{{OB_SPEC(adr_modifier%,modty&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_modifier%,modty&)}})*coefid,9,3) CHAR{{OB_SPEC(adr_modifier%,modtz&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_modifier%,modtz&)}})*coefid,9,3) redraw_elem(adr_modifier%,modty&) redraw_elem(adr_modifier%,modtz&) ENDIF ENDIF CASE modty& ob&=objet& memo=VAL(CHAR{{OB_SPEC(adr_modifier%,objet&)}}) saisie_d_une_composante(adr_modifier%,objet&,0.001,65535,9,3) IF memo<>VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}}) modif_normale!=TRUE modif_faite!=TRUE IF BTST(OB_STATE(adr_modifier%,modtaide&),aes_selected&) coefid=VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}})/memo CHAR{{OB_SPEC(adr_modifier%,modtx&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_modifier%,modtx&)}})*coefid,9,3) CHAR{{OB_SPEC(adr_modifier%,modtz&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_modifier%,modtz&)}})*coefid,9,3) redraw_elem(adr_modifier%,modtx&) redraw_elem(adr_modifier%,modtz&) ENDIF ENDIF CASE modtz& ob&=objet& memo=VAL(CHAR{{OB_SPEC(adr_modifier%,objet&)}}) saisie_d_une_composante(adr_modifier%,objet&,0.001,65535,9,3) IF memo<>VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}}) modif_normale!=TRUE modif_faite!=TRUE IF BTST(OB_STATE(adr_modifier%,modtaide&),aes_selected&) coefid=VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}})/memo CHAR{{OB_SPEC(adr_modifier%,modtx&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_modifier%,modtx&)}})*coefid,9,3) CHAR{{OB_SPEC(adr_modifier%,modty&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_modifier%,modty&)}})*coefid,9,3) redraw_elem(adr_modifier%,modtx&) redraw_elem(adr_modifier%,modty&) ENDIF ENDIF CASE trisomx1&,trisomy1&,trisomz1&,trisomx2&,trisomy2&,trisomz2&,trisomx3&,trisomy3&,trisomz3& ob&=objet& memo=VAL(CHAR{{OB_SPEC(adr_modifier%,objet&)}}) saisie_d_une_composante(adr_modifier%,objet&,-32768,32767,10,3) IF memo<>VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}}) modif_normale!=TRUE modif_faite!=TRUE ENDIF CASE modrx&,modry&,modrz& ob&=objet& memo=VAL(CHAR{{OB_SPEC(adr_modifier%,objet&)}}) saisie_d_une_composante(adr_modifier%,objet&,-360,360,8,3) IF memo<>VAL(CHAR{{OB_SPEC(adr_modifier%,ob&)}}) modif_normale!=TRUE modif_faite!=TRUE ENDIF CASE modplus& objc_change(adr_modifier%,objet&) passer_a_l_objet_suivant CASE modmoins& objc_change(adr_modifier%,objet&) passer_a_l_objet_precedent CASE encones& objc_change(adr_modifier%,objet&) modification_d_un_contour univ%=@adresse_objet(objet_actif&) test_enregistre_csg(univ%) redimention!=FALSE tri_2d!=FALSE tri_fi!=FALSE tri_3d!=FALSE trace_3d_plein!=FALSE lire_donnees(objet_actif&,px,py,pz,pw,ph,pf,rx,ry,rz,couleur_active&,blob) ecrire_donnees(objet_actif&,px,py,pz,pw,ph,pf,rx,ry,rz,blob) redessin_modification modif_normale!=FALSE modif_faite!=TRUE CASE ouvert& videsouris univ%=@adresse_objet(objet_actif&) BYTE{ADD(univ%,offset_drapeau0&)}=BCHG(BYTE{ADD(univ%,offset_drapeau0&)},bit_ouvert|) ob_state(adr_modifier%,ouvert&,aes_selected&,BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_ouvert|)) redraw_elem(adr_modifier%,ouvert&) modif_normale!=FALSE modif_faite!=TRUE CASE modcsg& objc_change(adr_modifier%,objet&) modif_csg!=TRUE univ%=@adresse_objet(objet_actif&) IF INT{ADD(univ%,offset_csg_type&)}=-5 ouvrir_creation_des_blobs ELSE ouvrir_fonctions ENDIF redimention!=FALSE tri_2d!=FALSE tri_fi!=FALSE tri_3d!=FALSE trace_3d_plein!=FALSE lire_donnees(objet_actif&,px,py,pz,pw,ph,pf,rx,ry,rz,couleur_active&,blob) ecrire_donnees(objet_actif&,px,py,pz,pw,ph,pf,rx,ry,rz,blob) redessin_modification modif_normale!=FALSE modif_faite!=TRUE CASE modbez& objc_change(adr_modifier%,objet&) univ%=@adresse_objet(objet_actif&) afficher_les_points_bicubic(univ%,FALSE) modif_bez!=TRUE ouvrir_fenetre(17,adr_bicubics%) modif_normale!=FALSE modif_faite!=TRUE CASE modquadr& objc_change(adr_modifier%,objet&) univ%=@adresse_objet(objet_actif&) adr_poi%=ADD(@adresse_point_extrude(CARD{ADD(univ%,offset_force_blob&)}),2) CHAR{{OB_SPEC(adr_quadric%,valquad0&)}}=STR$(ROUND({adr_poi%}/1024,3),9,3) CHAR{{OB_SPEC(adr_quadric%,SUCC(valquad0&))}}=STR$(ROUND({ADD(adr_poi%,4)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,2))}}=STR$(ROUND({ADD(adr_poi%,8)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,3))}}=STR$(ROUND({ADD(adr_poi%,12)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,4))}}=STR$(ROUND({ADD(adr_poi%,16)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,5))}}=STR$(ROUND({ADD(adr_poi%,20)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,6))}}=STR$(ROUND({ADD(adr_poi%,24)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,7))}}=STR$(ROUND({ADD(adr_poi%,28)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,8))}}=STR$(ROUND({ADD(adr_poi%,32)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quadric%,valquad1&)}}=STR$(ROUND({ADD(adr_poi%,36)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quadric%,nomquadr&)}}=CHAR{ADD(adr_poi%,40)} modif_quadr!=TRUE ouvrir_fenetre(28,adr_quadric%) modif_normale!=FALSE modif_faite!=TRUE CASE modquart& objc_change(adr_modifier%,objet&) univ%=@adresse_objet(objet_actif&) adr_poi%=ADD(@adresse_point_extrude(CARD{ADD(univ%,offset_force_blob&)}),2) CHAR{{OB_SPEC(adr_quartic%,valquar0&)}}=STR$(ROUND({adr_poi%}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,SUCC(valquar0&))}}=STR$(ROUND({ADD(adr_poi%,4)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,2))}}=STR$(ROUND({ADD(adr_poi%,8)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,3))}}=STR$(ROUND({ADD(adr_poi%,12)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,4))}}=STR$(ROUND({ADD(adr_poi%,16)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,5))}}=STR$(ROUND({ADD(adr_poi%,20)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,6))}}=STR$(ROUND({ADD(adr_poi%,24)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,7))}}=STR$(ROUND({ADD(adr_poi%,28)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,8))}}=STR$(ROUND({ADD(adr_poi%,32)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,9))}}=STR$(ROUND({ADD(adr_poi%,36)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,10))}}=STR$(ROUND({ADD(adr_poi%,40)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,11))}}=STR$(ROUND({ADD(adr_poi%,44)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,12))}}=STR$(ROUND({ADD(adr_poi%,48)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,13))}}=STR$(ROUND({ADD(adr_poi%,52)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,14))}}=STR$(ROUND({ADD(adr_poi%,56)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,15))}}=STR$(ROUND({ADD(adr_poi%,60)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,16))}}=STR$(ROUND({ADD(adr_poi%,64)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,17))}}=STR$(ROUND({ADD(adr_poi%,68)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,18))}}=STR$(ROUND({ADD(adr_poi%,72)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,19))}}=STR$(ROUND({ADD(adr_poi%,76)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,20))}}=STR$(ROUND({ADD(adr_poi%,80)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,21))}}=STR$(ROUND({ADD(adr_poi%,84)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,22))}}=STR$(ROUND({ADD(adr_poi%,88)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,23))}}=STR$(ROUND({ADD(adr_poi%,92)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,24))}}=STR$(ROUND({ADD(adr_poi%,96)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,25))}}=STR$(ROUND({ADD(adr_poi%,100)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,26))}}=STR$(ROUND({ADD(adr_poi%,104)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,27))}}=STR$(ROUND({ADD(adr_poi%,108)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,28))}}=STR$(ROUND({ADD(adr_poi%,112)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,29))}}=STR$(ROUND({ADD(adr_poi%,116)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,30))}}=STR$(ROUND({ADD(adr_poi%,120)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,31))}}=STR$(ROUND({ADD(adr_poi%,124)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,32))}}=STR$(ROUND({ADD(adr_poi%,128)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,33))}}=STR$(ROUND({ADD(adr_poi%,132)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,34))}}=STR$(ROUND({ADD(adr_poi%,136)}/1024,3),9,3) CHAR{{OB_SPEC(adr_quartic%,nomquart&)}}=CHAR{ADD(adr_poi%,140)} modif_quart!=TRUE ouvrir_fenetre(27,adr_quartic%) modif_normale!=FALSE modif_faite!=TRUE CASE valmod& objc_change(adr_modifier%,objet&) IF modif_faite! IF objets_a_deplacer&>0 lire_nouvelles_donnees(px,py,pz,pw,ph,pf,rx,ry,rz,couleur_active&,calq|,blob) ' IF a_rx<>rx OR a_ry<>ry OR a_rz<>rz ' tourner_selection_multiple(rx,ry,rz) ' calcul_selection_multiple!=FALSE ' ENDIF IF a_px<>px OR a_py<>py OR a_pz<>pz SINGLE{ADD(activation%,2)}=px SINGLE{ADD(activation%,6)}=py SINGLE{ADD(activation%,10)}=pz deplace_selection_multiple(a_px,a_py,a_pz) calcul_selection_multiple!=FALSE ENDIF IF pw<>a_tx OR ph<>a_ty OR pf<>a_tz coefx=pw/a_tx coefy=ph/a_ty coefz=pf/a_tz change_taille_selection_multiple(coefx,coefy,coefz,activation%) calcul_selection_multiple!=FALSE ENDIF ELSE enregistrer_modification_objet(redimention!) ENDIF redimention!=FALSE redessin_deja_fait!=FALSE tri_2d!=FALSE tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE travail_a_sauver!=TRUE ENDIF IF BTST(BYTE{ADD(@adresse_objet(objet_actif&),offset_drapeau0&)},bit_masque|) ' Si le nouvel objet est masqu‚, on le saute objet_suivant ELSE IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(@adresse_objet(objet_actif&)),36)),35)}=0 ' Si le calque contenant le nouvel objet est on le saute objet_suivant ENDIF calque_actif|=@calque_actif(@adresse_objet(objet_actif&)) fermeture_fenetre(idx_modification_dbl&) redraw_force(idx_info&,idx_animation&) ENDSELECT RETURN > PROCEDURE gestion_couleurs_predefinies LOCAL fx&,fy&,fw&,fh& LOCAL rx&,ry&,rw&,rh& LOCAL c&,j&,mem_j& LOCAL milx&,mily& LOCAL mem_coul& LOCAL mem_roug& LOCAL mem_vert& LOCAL mem_bleu& LOCAL mem_tran& LOCAL mem_lum& LOCAL teinte&,luminosite&,saturation& LOCAL ro&,ve&,bl& LOCAL mvtx&,mvty&,val&,fi& LOCAL dx&,dy&,cos,sin,rap,ang1& ' mem_coul&=CARD{couleur_en_cours%} mem_roug&=BYTE{ADD(couleur_en_cours%,2)} mem_vert&=BYTE{ADD(couleur_en_cours%,3)} mem_bleu&=BYTE{ADD(couleur_en_cours%,4)} mem_tran&=BYTE{ADD(couleur_en_cours%,5)} mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) ' $S&,$S> SELECT objet& CASE cheprede& objc_change(adr_predefinie%,objet&) IF @recherche_couleur_predefinie(couleur_en_cours%) CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,CARD{couleur_en_cours%}) lire_couleurs(couleur_en_cours%,TRUE) ENDIF CASE rouetesa& IF global_amx&<>mx& OR global_amy&<>global_my& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_offset(adr_predefinie%,rouetesa&,rx&,ry&) rw&=OB_W(adr_predefinie%,rouetesa&) rh&=OB_H(adr_predefinie%,rouetesa&) milx&=ADD(rx&,DIV(rw&,2)) mily&=ADD(ry&,DIV(rh&,2)) dx&=global_mx&-milx& dy&=global_my&-mily& rap=SQR(dx&^2+dy&^2) IF rap=0 saturation&=0 ELSE cos=dx&/rap sin=dy&/rap IF sin<=0 ang1&=ABS(DEG(ACOS(cos))-180) ELSE ang1&=DEG(ACOS(cos))+180 ENDIF ENDIF teinte&=ROUND(ang1&/360*255) teinte&=-teinte&*(teinte&=>0 AND teinte&<=255)-255*(teinte&>255) saturation&=ROUND(rap/64*255) saturation&=-saturation&*(saturation&=>0 AND saturation&<=255)-255*(saturation&>255) tsl_rvb(teinte&,saturation&,luminosite&,ro&,ve&,bl&) ' IF luminosite&=0 luminosite&=mem_lum& ' ENDIF BYTE{ADD(couleur_en_cours%,2)}=ro& BYTE{ADD(couleur_en_cours%,3)}=ve& BYTE{ADD(couleur_en_cours%,4)}=bl& couleurs_definies(couleur_en_cours%,CARD{couleur_en_cours%},TRUE) global_amx&=global_mx& global_amy&=global_my& ENDIF CASE bficcolo& objc_change(adr_predefinie%,objet&) positionner_popup(-1,objet&,adr_predefinie%,adr_popup_autre3%,rx&,ry&) debut_couleur&=CARD{couleur_en_cours%} IF total_couleur&>9 debut_couleur&=-debut_couleur&*(debut_couleur&=>0 AND debut_couleur&<=SUB(total_couleur&,10))+0*(debut_couleur&<0)-SUB(total_couleur&,10)*(debut_couleur&>SUB(total_couleur&,10)) ENDIF reponse&=@popup_de_couleur(rx&,ry&,adr_predefinie%) IF reponse&>-1 CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,reponse&) CARD{couleur_en_cours%}=reponse& lire_couleurs(couleur_en_cours%,TRUE) ENDIF videsouris CASE ajoupred& objc_change(adr_predefinie%,objet&) ajout_de_definition(couleur_en_cours%,1) CASE modipred& objc_change(adr_predefinie%,objet&) modif_de_definition(couleur_en_cours%,1) CASE effapred& objc_change(adr_predefinie%,objet&) efface_une_definition(couleur_en_cours%,1) lire_couleurs(couleur_en_cours%,TRUE) CASE asceroug& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_offset(adr_predefinie%,carrroug&,mvtx&,mvty&) ro&=BYTE{ADD(couleur_en_cours%,2)} ADD ro&,26*(global_my&>mvty&)-26*(global_my&0 AND ro&<=255)+0*(ro&<0)-255*(ro&>255) position_curseur_vertical(adr_predefinie%,asceroug&,carrroug&,ro&,TRUE) BYTE{ADD(couleur_en_cours%,2)}=ro& redessin_partiel_rvb(couleur_en_cours%) mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE ascevert& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_offset(adr_predefinie%,carrvert&,mvtx&,mvty&) ve&=BYTE{ADD(couleur_en_cours%,3)} ADD ve&,26*(global_my&>mvty&)-26*(global_my&0 AND ve&<=255)+0*(ve&<0)-255*(ve&>255) position_curseur_vertical(adr_predefinie%,ascevert&,carrvert&,ve&,TRUE) BYTE{ADD(couleur_en_cours%,3)}=ve& redessin_partiel_rvb(couleur_en_cours%) mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE ascebleu& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_offset(adr_predefinie%,carrbleu&,mvtx&,mvty&) bl&=BYTE{ADD(couleur_en_cours%,4)} ADD bl&,26*(global_my&>mvty&)-26*(global_my&0 AND bl&<=255)+0*(bl&<0)-255*(bl&>255) position_curseur_vertical(adr_predefinie%,ascebleu&,carrbleu&,bl&,TRUE) BYTE{ADD(couleur_en_cours%,4)}=bl& redessin_partiel_rvb(couleur_en_cours%) mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE ascetran& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_offset(adr_predefinie%,carrtran&,mvtx&,mvty&) val&=BYTE{ADD(couleur_en_cours%,5)} ADD val&,26*(global_my&>mvty&)-26*(global_my&0 AND val&<=255)+0*(val&<0)-255*(val&>255) BYTE{ADD(couleur_en_cours%,5)}=val& position_curseur_vertical(adr_predefinie%,ascetran&,carrtran&,val&,TRUE) CASE ascelumi& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_offset(adr_predefinie%,carrlumi&,mvtx&,mvty&) rvb_tsl(BYTE{ADD(couleur_en_cours%,2)},BYTE{ADD(couleur_en_cours%,3)},BYTE{ADD(couleur_en_cours%,4)},teinte&,saturation&,luminosite&) ADD luminosite&,26*(global_my&>mvty&)-26*(global_my&0 AND luminosite&<=255)+0*(luminosite&<0)-255*(luminosite&>255) position_curseur_vertical(adr_predefinie%,ascelumi&,carrlumi&,luminosite&,TRUE) redessin_partiel_tls(couleur_en_cours%,teinte&,luminosite&,saturation&) redessin_partiel_rvb(couleur_en_cours%) mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE carrtein& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrtein&,0,100,3,0) rvb_tsl(BYTE{ADD(couleur_en_cours%,2)},BYTE{ADD(couleur_en_cours%,3)},BYTE{ADD(couleur_en_cours%,4)},teinte&,saturation&,luminosite&) teinte&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrtein&)}})*2.55) teinte&=-teinte&*(teinte&=>0 AND teinte&<=255)+0*(teinte&<0)-255*(teinte&>255) objc_change(adr_predefinie%,carrtein&) redessin_partiel_tls(couleur_en_cours%,teinte&,luminosite&,saturation&) redessin_partiel_rvb(couleur_en_cours%) CASE carrsatu& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrsatu&,0,100,3,0) rvb_tsl(BYTE{ADD(couleur_en_cours%,2)},BYTE{ADD(couleur_en_cours%,3)},BYTE{ADD(couleur_en_cours%,4)},teinte&,saturation&,luminosite&) saturation&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrsatu&)}})*2.55) saturation&=-saturation&*(saturation&=>0 AND saturation&<=255)+0*(saturation&<0)-255*(saturation&>255) objc_change(adr_predefinie%,carrsatu&) redessin_partiel_tls(couleur_en_cours%,teinte&,luminosite&,saturation&) redessin_partiel_rvb(couleur_en_cours%) CASE lumicarr& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' IF global_mk&=2 OR click&=2 objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrlumi&,0,100,3,0) rvb_tsl(BYTE{ADD(couleur_en_cours%,2)},BYTE{ADD(couleur_en_cours%,3)},BYTE{ADD(couleur_en_cours%,4)},teinte&,saturation&,luminosite&) luminosite&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}})*2.55) luminosite&=-luminosite&*(luminosite&=>0 AND luminosite&<=255)+0*(luminosite&<0)-255*(luminosite&>255) position_curseur_vertical(adr_predefinie%,ascelumi&,carrlumi&,luminosite&,TRUE) redessin_partiel_tls(couleur_en_cours%,teinte&,luminosite&,saturation&) redessin_partiel_rvb(couleur_en_cours%) ELSE objc_change(adr_predefinie%,objet&) deplace_curseur_vertical(adr_predefinie%,ascelumi&,carrlumi&,couleur_en_cours%) redessin_partiel_rvb(couleur_en_cours%) ENDIF mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE rougcarr& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' IF global_mk&=2 OR click&=2 objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrroug&,0,100,3,0) ro&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrroug&)}})*2.55) ro&=-ro&*(ro&=>0 AND ro&<=255)+0*(ro&<0)-255*(ro&>255) BYTE{ADD(couleur_en_cours%,2)}=ro& position_curseur_vertical(adr_predefinie%,asceroug&,carrroug&,ro&,TRUE) redessin_partiel_rvb(couleur_en_cours%) ELSE objc_change(adr_predefinie%,objet&) deplace_curseur_vertical(adr_predefinie%,asceroug&,carrroug&,couleur_en_cours%) ENDIF mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE vertcarr& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' IF global_mk&=2 OR click&=2 objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrvert&,0,100,3,0) ve&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrvert&)}})*2.55) ve&=-ve&*(ve&=>0 AND ve&<=255)+0*(ve&<0)-255*(ve&>255) BYTE{ADD(couleur_en_cours%,3)}=ve& position_curseur_vertical(adr_predefinie%,ascevert&,carrvert&,ve&,TRUE) redessin_partiel_rvb(couleur_en_cours%) ELSE objc_change(adr_predefinie%,objet&) deplace_curseur_vertical(adr_predefinie%,ascevert&,carrvert&,couleur_en_cours%) ENDIF mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE bleucarr& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' IF global_mk&=2 OR click&=2 objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrbleu&,0,100,3,0) bl&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrbleu&)}})*2.55) bl&=-bl&*(bl&=>0 AND bl&<=255)+0*(bl&<0)-255*(bl&>255) BYTE{ADD(couleur_en_cours%,4)}=bl& position_curseur_vertical(adr_predefinie%,ascebleu&,carrbleu&,bl&,TRUE) redessin_partiel_rvb(couleur_en_cours%) ELSE objc_change(adr_predefinie%,objet&) deplace_curseur_vertical(adr_predefinie%,ascebleu&,carrbleu&,couleur_en_cours%) ENDIF mem_lum&=VAL(CHAR{{OB_SPEC(adr_predefinie%,carrlumi&)}}) CASE trancarr& ' CARD{couleur_en_cours%}=0 ! Couleur pr‚-d‚finie obligatoire CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,0) redraw_elem(adr_predefinie%,bficcolo&) ' IF global_mk&=2 OR click&=2 objc_change(adr_predefinie%,objet&) saisie_d_une_composante(adr_predefinie%,carrtran&,0,100,3,0) val&=ROUND(VAL(CHAR{{OB_SPEC(adr_predefinie%,carrtran&)}})*2.55) BYTE{ADD(couleur_en_cours%,5)}=val& position_curseur_vertical(adr_predefinie%,ascetran&,carrtran&,val&,TRUE) ELSE objc_change(adr_predefinie%,objet&) deplace_curseur_vertical(adr_predefinie%,ascetran&,carrtran&,couleur_en_cours%) ENDIF CASE annprede& objc_change(adr_predefinie%,objet&) CARD{couleur_en_cours%}=mem_coul& BYTE{ADD(couleur_en_cours%,2)}=mem_roug& BYTE{ADD(couleur_en_cours%,3)}=mem_vert& BYTE{ADD(couleur_en_cours%,4)}=mem_bleu& BYTE{ADD(couleur_en_cours%,5)}=mem_tran& fermeture_fenetre(idx_couleurs&) CASE valprede& objc_change(adr_predefinie%,objet&) fermeture_fenetre(idx_couleurs&) ENDSELECT ' RETURN > PROCEDURE gestion_lumieres LOCAL rx&,ry&,xr&,yr&,fi&,val&,mvtx&,mvty&,cac! LOCAL xp&,yp&,wp&,hp&,c0 LOCAL uni%,fin_s%,adr_sr% SELECT objet& CASE sournbr& objc_change(adr_lumieres%,objet&) recupere_les_sources bmove(@adresse_source(source_active&),mem_nom%,taille_source&) bmove(mem_src%,@adresse_source(source_active&),taille_source&) positionner_popup(12,objet&,adr_lumieres%,adr_popup_autre1%,rx&,ry&) debut_popup_lum&=PRED(VAL(LEFT$(CHAR{{OB_SPEC(adr_lumieres%,sourincl&)}},3))) IF nombre_de_source&>9 debut_popup_lum&=-debut_popup_lum&*(debut_popup_lum&=>0 AND debut_popup_lum&<=SUB(nombre_de_source&,10))+0*(debut_popup_lum&<0)-SUB(nombre_de_source&,10)*(debut_popup_lum&>SUB(nombre_de_source&,10)) ELSE CLR debut_popup_lum& ENDIF reponse&=@popup_de_lumiere(rx&,ry&,0) IF reponse&<>-1 IF source_active&<>reponse& recupere_les_sources bmove(mem_src%,@adresse_source(source_active&),taille_source&) source_active&=reponse& bmove(@adresse_source(source_active&),mem_src%,taille_source&) hierachie_ok!=FALSE lire_les_sources(TRUE) travail_a_sauver!=TRUE ENDIF ELSE bmove(mem_nom%,mem_src%,taille_source&) bmove(mem_src%,@adresse_source(source_active&),taille_source&) ENDIF CASE inclsour& objc_change(adr_lumieres%,objet&) positionner_popup(12,objet&,adr_lumieres%,adr_popup_autre0%,rx&,ry&) debut_popup_choix&=PRED(VAL(CHAR{{OB_SPEC(adr_lumieres%,sourincl&)}})) IF nombre_de_source&>9 debut_popup_choix&=-debut_popup_choix&*(debut_popup_choix&=>0 AND debut_popup_choix&<=SUB(nombre_de_source&,10))+0*(debut_popup_choix&<0)-SUB(nombre_de_source&,10)*(debut_popup_choix&>SUB(nombre_de_source&,10)) ELSE CLR debut_popup_choix& ENDIF reponse&=@popup_de_choix(rx&,ry&,0) IF reponse&<>-1 CHAR{{OB_SPEC(adr_lumieres%,sourincl&)}}=STR$(SUCC(reponse&),3) INT{ADD(mem_src%,54)}=SUCC(reponse&) uni%=@adresse_objet(reponse&) CHAR{{OB_SPEC(adr_lumieres%,sourenx&)}}=STR$(ROUND(SINGLE{ADD(uni%,2)},3),10,3) CHAR{{OB_SPEC(adr_lumieres%,soureny&)}}=STR$(ROUND(SINGLE{ADD(uni%,6)},3),10,3) CHAR{{OB_SPEC(adr_lumieres%,sourenz&)}}=STR$(ROUND(SINGLE{ADD(uni%,10)},3),10,3) redraw_elem(adr_lumieres%,sourenx&) redraw_elem(adr_lumieres%,soureny&) redraw_elem(adr_lumieres%,sourenz&) redraw_elem(adr_lumieres%,inclsour&) ENDIF CASE posobjlu& objc_change(adr_lumieres%,objet&) positionner_popup(12,objet&,adr_lumieres%,adr_popup_autre0%,rx&,ry&) CLR debut_popup_choix& reponse&=@popup_de_choix(rx&,ry&,0) IF reponse&<>-1 uni%=@adresse_objet(reponse&) CHAR{{OB_SPEC(adr_lumieres%,sourenx&)}}=STR$(ROUND(SINGLE{ADD(uni%,2)},3),10,3) CHAR{{OB_SPEC(adr_lumieres%,soureny&)}}=STR$(ROUND(SINGLE{ADD(uni%,6)},3),10,3) CHAR{{OB_SPEC(adr_lumieres%,sourenz&)}}=STR$(ROUND(SINGLE{ADD(uni%,10)},3),10,3) redraw_elem(adr_lumieres%,sourenx&) redraw_elem(adr_lumieres%,soureny&) redraw_elem(adr_lumieres%,sourenz&) ENDIF CASE posvislu& objc_change(adr_lumieres%,objet&) positionner_popup(12,objet&,adr_lumieres%,adr_popup_autre0%,rx&,ry&) CLR debut_popup_choix& reponse&=@popup_de_choix(rx&,ry&,0) IF reponse&<>-1 uni%=@adresse_objet(reponse&) CHAR{{OB_SPEC(adr_lumieres%,viseenx&)}}=STR$(ROUND(SINGLE{ADD(uni%,2)},3),10,3) CHAR{{OB_SPEC(adr_lumieres%,viseeny&)}}=STR$(ROUND(SINGLE{ADD(uni%,6)},3),10,3) CHAR{{OB_SPEC(adr_lumieres%,viseenz&)}}=STR$(ROUND(SINGLE{ADD(uni%,10)},3),10,3) redraw_elem(adr_lumieres%,viseenx&) redraw_elem(adr_lumieres%,viseeny&) redraw_elem(adr_lumieres%,viseenz&) ENDIF CASE radius& IF global_mk&=1 saisie_d_une_composante(adr_lumieres%,radius&,1,180,3,0) ELSE positionner_popup(12,objet&,adr_lumieres%,adr_popup_autre2%,rx&,ry&) debut_popup_valeur&=VAL(CHAR{{OB_SPEC(adr_lumieres%,radius&)}}) IF debut_popup_valeur&=>173 debut_popup_valeur&=173 ENDIF reponse&=@popup_de_valeur(rx&,ry&,1,180,0) IF reponse&<>1000 CHAR{{OB_SPEC(adr_lumieres%,radius&)}}=STR$(reponse&,3,0) ENDIF redraw_elem(adr_lumieres%,radius&) ENDIF CASE falloff& IF global_mk&=1 saisie_d_une_composante(adr_lumieres%,falloff&,1,180,3,0) ELSE positionner_popup(12,objet&,adr_lumieres%,adr_popup_autre2%,rx&,ry&) debut_popup_valeur&=VAL(CHAR{{OB_SPEC(adr_lumieres%,falloff&)}}) IF debut_popup_valeur&=>173 debut_popup_valeur&=173 ENDIF reponse&=@popup_de_valeur(rx&,ry&,1,180,0) IF reponse&<>1000 CHAR{{OB_SPEC(adr_lumieres%,falloff&)}}=STR$(reponse&,3,0) ENDIF redraw_elem(adr_lumieres%,falloff&) ENDIF CASE sourplus& objc_change(adr_lumieres%,objet&) IF nombre_de_source&<9999 INC nombre_de_source& IF @nouvelle_zone_source(MUL(taille_source&,PRED(nombre_de_source&)),TRUE) lire_les_sources(TRUE) ELSE DEC nombre_de_source& ENDIF travail_a_sauver!=TRUE hierachie_ok!=FALSE ENDIF CASE sourmoin& objc_change(adr_lumieres%,objet&) IF nombre_de_source&>1 DEC nombre_de_source& IF @nouvelle_zone_source(MUL(taille_source&,nombre_de_source&),TRUE) lire_les_sources(TRUE) ELSE INC nombre_de_source& ENDIF travail_a_sauver!=TRUE hierachie_ok!=FALSE ENDIF CASE souscoul& objc_change(adr_lumieres%,objet&) membfill(mem_num%,6,0) couleur_en_cours%=ADD(mem_src%,2) ' CARD{mem_num%}=CARD{ADD(mem_src%,2)} ' BYTE{ADD(mem_num%,2)}=BYTE{ADD(mem_src%,4)} ' BYTE{ADD(mem_num%,3)}=BYTE{ADD(mem_src%,5)} ' BYTE{ADD(mem_num%,4)}=BYTE{ADD(mem_src%,6)} ' BYTE{ADD(mem_num%,5)}=0 ouvrir_couleurs_predefinies ' IF @ouvrir_couleurs_predefinies(mem_num%) ' CARD{ADD(mem_src%,2)}=CARD{mem_num%} ' BYTE{ADD(mem_src%,4)}=BYTE{ADD(mem_num%,2)} ' BYTE{ADD(mem_src%,5)}=BYTE{ADD(mem_num%,3)} ' BYTE{ADD(mem_src%,6)}=BYTE{ADD(mem_num%,4)} ' ENDIF objc_offset(adr_lumieres%,souscoul&,rx&,ry&) xr&=OB_W(adr_lumieres%,souscoul&) yr&=OB_H(adr_lumieres%,souscoul&) affichage_couleur_tc(rx&,ry&,xr&,yr&,BYTE{ADD(mem_num%,2)},BYTE{ADD(mem_num%,3)},BYTE{ADD(mem_num%,4)},global_xb&,global_yb&,global_wb&,global_hb&) CASE nom_src& saisie_d_une_ligne(adr_lumieres%,nom_src&,valsour&,0,0,20,0) objc_change(adr_lumieres%,nom_src&) hierachie_ok!=FALSE CASE sourenx&,soureny&,sourenz&,viseenx&,viseeny&,viseenz&,surflarg&,surflong& saisie_d_une_composante(adr_lumieres%,objet&,-32768,32767,10,3) CASE surfadap& saisie_d_une_composante(adr_lumieres%,objet&,-32768,32767,6,0) CASE surfjitt& IF BYTE{ADD(mem_src%,7)}=1 BYTE{ADD(mem_src%,7)}=0 ELSE BYTE{ADD(mem_src%,7)}=1 ENDIF redraw_elem(adr_lumieres%,objet&) CASE soleil& objc_change(adr_lumieres%,objet&) BYTE{ADD(mem_src%,1)}=BCLR(BYTE{ADD(mem_src%,1)},bit_spot|) BYTE{ADD(mem_src%,1)}=BCLR(BYTE{ADD(mem_src%,1)},bit_surface|) BYTE{ADD(mem_src%,1)}=BCLR(BYTE{ADD(mem_src%,1)},bit_objet_lie|) recupere_les_sources lire_les_sources(TRUE) CASE projecte& objc_change(adr_lumieres%,objet&) BYTE{ADD(mem_src%,1)}=BCHG(BYTE{ADD(mem_src%,1)},bit_spot|) recupere_les_sources lire_les_sources(TRUE) CASE surface& objc_change(adr_lumieres%,objet&) BYTE{ADD(mem_src%,1)}=BCHG(BYTE{ADD(mem_src%,1)},bit_surface|) recupere_les_sources lire_les_sources(TRUE) CASE objelumi& objc_change(adr_lumieres%,objet&) BYTE{ADD(mem_src%,1)}=BCHG(BYTE{ADD(mem_src%,1)},bit_objet_lie|) recupere_les_sources lire_les_sources(TRUE) CASE souretat& objc_change(adr_lumieres%,objet&) IF BTST(kbd&,cl_shift_droit&) OR BTST(kbd&,cl_shift_gauche&) IF BYTE{mem_src%}=0 rx&=1 ELSE rx&=0 ENDIF BYTE{mem_src%}=rx& fin_s%=@adresse_source(nombre_de_source&) adr_sr%=source% DO BYTE{adr_sr%}=rx& ADD adr_sr%,taille_source& INC lum& LOOP WHILE adr_sr% PROCEDURE gestion_aide LOCAL xx&,yy&,ww&,hh& objc_offset(adr_aide%,clavier&,xx&,yy&) ww&=OB_W(adr_aide%,clavier&) hh&=OB_H(adr_aide%,clavier&) $S&,$S> SELECT objet& CASE touches& ob_flags(adr_aide%,aidesous&,aes_hidetree&,TRUE) ob_flags(adr_aide%,clavier&,aes_hidetree&,FALSE) ob_state(adr_aide%,infsupp&,aes_selected&,FALSE) redraw_elem(adr_aide%,infsupp&) objc_draw(adr_aide%,0,12,xx&,yy&,ww&,hh&,-1) CASE infsupp& ob_flags(adr_aide%,aidesous&,aes_hidetree&,FALSE) ob_flags(adr_aide%,clavier&,aes_hidetree&,TRUE) ob_state(adr_aide%,touches&,aes_selected&,FALSE) redraw_elem(adr_aide%,touches&) objc_draw(adr_aide%,0,12,xx&,yy&,ww&,hh&,-1) CASE finaide& objc_change(adr_aide%,objet&) fermeture_fenetre(14) ENDSELECT RETURN > PROCEDURE gestion_des_fonctions_des_effacements_et_des_masquages LOCAL n&,nume&,k&,i&,t%,j&,univ%,univ2% LOCAL adr_poi%,adr_fac%,num_ob&,ob& IF (NOT flags_effacement!) AND (NOT flags_masquage!) AND (NOT flags_blobs!) ' *********************************************************** ' **** Ce qui suit correspond … la gestion des fonctions **** ' *********************************************************** $S&,$S> SELECT objet& CASE fnctpere& IF NOT (BTST(OB_STATE(adr_fonctions%,fnctpere&),aes_disable&)) objc_offset(adr_fonctions%,fnctfils&,mvtx&,mvty&) ADD debut_liste_csg&,17*(global_my&mvty&) debut_liste_csg&=-debut_liste_csg&*(debut_liste_csg&=>0 AND debut_liste_csg&<=SUB(nombre_d_objets&,17))+0*(debut_liste_csg&<0)-SUB(nombre_d_objets&,17)*(debut_liste_csg&>SUB(nombre_d_objets&,17)) ecrire_les_objets_fonction(TRUE) position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_csg&,TRUE) ENDIF CASE fncttout& objc_change(adr_fonctions%,objet&) compteur_csg&=nombre_d_objets& CLR i& DO INT{ADD(effacement%,SHL(i&,1))}=i& INC i& LOOP WHILE i&"" CHAR{{OB_SPEC(adr_fonctions%,objet&)}}=STR$(PRED(compteur_csg&),3)+STR$(SUCC(nume&),3)+CHAR{ADD(@adresse_objet(nume&),offset_nom_objet&)} ELSE choix&=INT{@adresse_objet(nume&)} CHAR{{OB_SPEC(adr_fonctions%,objet&)}}=STR$(PRED(compteur_csg&),3)+STR$(SUCC(nume&),3)+@nom_objet$(choix&,TRUE) ENDIF redraw_elem(adr_fonctions%,objet&) ELSE ob_state(adr_fonctions%,objet&,aes_selected&,FALSE) replacement_de_la_zone_memoire_des_fonctions(nume&) DEC compteur_csg& ecrire_les_objets_fonction(TRUE) ENDIF ENDIF CASE fnctzero& objc_change(adr_fonctions%,objet&) IF debut_liste_csg&>0 CLR debut_liste_csg& ecrire_les_objets_fonction(TRUE) position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_csg&,TRUE) ENDIF CASE fncthau& objc_change(adr_fonctions%,objet&) IF debut_liste_csg&>0 DEC debut_liste_csg& scroll_bas_popup_general(TRUE,adr_fonctions%,debut_liste_csg&,0,nombre_d_objets&,17,sousfnct&,fnct01&,fnct02&) position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_csg&,TRUE) ecrire_les_objets_fonction(FALSE) ENDIF CASE fnctbas& objc_change(adr_fonctions%,objet&) IF ADD(debut_liste_csg&,16)17 deplace_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&) objc_change(adr_fonctions%,objet&) ENDIF CASE union& objc_change(adr_fonctions%,objet&) sauve!=FALSE fermeture_fenetre(16) type_de_csg&=-1 creation_pour_csg CASE intersec& objc_change(adr_fonctions%,objet&) sauve!=FALSE fermeture_fenetre(16) type_de_csg&=-2 creation_pour_csg CASE differen& objc_change(adr_fonctions%,objet&) sauve!=FALSE fermeture_fenetre(16) type_de_csg&=-3 creation_pour_csg CASE merge& objc_change(adr_fonctions%,objet&) fermeture_fenetre(16) sauve!=FALSE type_de_csg&=-4 creation_pour_csg CASE valfnct& objc_change(adr_fonctions%,objet&) modif_csg!=FALSE fermeture_fenetre(16) ENDSELECT ELSE IF flags_effacement! AND (NOT flags_masquage!) AND (NOT flags_blobs!) ' ************************************************************* ' **** Ce qui suit correspond … la gestion des effacements **** ' ************************************************************* $S&,$S> SELECT objet& CASE fnctpere& IF NOT (BTST(OB_STATE(adr_fonctions%,fnctpere&),aes_disable&)) objc_offset(adr_fonctions%,fnctfils&,mvtx&,mvty&) ADD debut_liste_eff&,17*(global_my&mvty&) debut_liste_eff&=-debut_liste_eff&*(debut_liste_eff&=>0 AND debut_liste_eff&<=SUB(nombre_d_objets&,17))+0*(debut_liste_eff&<0)-SUB(nombre_d_objets&,17)*(debut_liste_eff&>SUB(nombre_d_objets&,17)) ecrire_les_objets_effacer(TRUE) position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_eff&,TRUE) ENDIF CASE etout& objc_change(adr_fonctions%,objet&) CLR i& DO INT{ADD(effacement%,SHL(i&,1))}=1 INC i& LOOP WHILE i&0 CLR debut_liste_eff& position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_eff&,TRUE) redraw_elem(adr_fonctions%,fnctpere&) ecrire_les_objets_effacer(TRUE) ENDIF fermeture_fenetre(16) t%=@prendre(LEN(CHAR{{OB_SPEC(adr_fonctions%,titrfnct&)}}),TRUE,3) CHAR{t%}=CHAR{{OB_SPEC(adr_fonctions%,titrfnct&)}} CHAR{{OB_SPEC(adr_fonctions%,titrfnct&)}}=CHAR{{OB_SPEC(adr_fonctions%,titreffa&)}} CHAR{{OB_SPEC(adr_fonctions%,titreffa&)}}=CHAR{t%} libere(*t%) redraw_force(idx_info&,idx_animation&) ENDIF CASE fncthau& objc_change(adr_fonctions%,objet&) IF debut_liste_eff&>0 DEC debut_liste_eff& scroll_bas_popup_general(TRUE,adr_fonctions%,debut_liste_eff&,0,nombre_d_objets&,17,sousfnct&,lte01&,lte02&) position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_eff&,TRUE) ecrire_les_objets_effacer(FALSE) ENDIF CASE fnctbas& objc_change(adr_fonctions%,objet&) IF ADD(debut_liste_eff&,16)0 CLR debut_liste_eff& ecrire_les_objets_effacer(TRUE) position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_eff&,TRUE) ENDIF CASE fnctmaxi& objc_change(adr_fonctions%,objet&) IF ADD(debut_liste_eff&,16)17 deplace_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&) objc_change(adr_fonctions%,objet&) ENDIF CASE valfnct& objc_change(adr_fonctions%,objet&) fermeture_fenetre(16) t%=@prendre(LEN(CHAR{{OB_SPEC(adr_fonctions%,titrfnct&)}}),TRUE,3) CHAR{t%}=CHAR{{OB_SPEC(adr_fonctions%,titrfnct&)}} CHAR{{OB_SPEC(adr_fonctions%,titrfnct&)}}=CHAR{{OB_SPEC(adr_fonctions%,titreffa&)}} CHAR{{OB_SPEC(adr_fonctions%,titreffa&)}}=CHAR{t%} libere(*t%) ENDSELECT ELSE IF (NOT flags_effacement!) AND flags_masquage! AND NOT (flags_blobs!) ' *********************************************************** ' **** Ce qui suit correspond … la gestion des masquages **** ' *********************************************************** $S&,$S> SELECT objet& CASE fnctpere& IF NOT (BTST(OB_STATE(adr_fonctions%,fnctpere&),aes_disable&)) objc_offset(adr_fonctions%,fnctfils&,mvtx&,mvty&) ADD debut_liste_eff&,17*(global_my&mvty&) debut_liste_eff&=-debut_liste_eff&*(debut_liste_eff&=>0 AND debut_liste_eff&<=SUB(nombre_d_objets&,17))+0*(debut_liste_eff&<0)-SUB(nombre_d_objets&,17)*(debut_liste_eff&>SUB(nombre_d_objets&,17)) ecrire_les_objets_effacer(TRUE) position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_eff&,TRUE) ENDIF CASE etout& objc_change(adr_fonctions%,objet&) CLR i& DO IF INT{ADD(effacement%,SHL(i&,1))}<>2 INT{ADD(effacement%,SHL(i&,1))}=1 ENDIF INC i& LOOP WHILE i&2 INT{ADD(effacement%,SHL(i&,1))}=0 ENDIF INC i& LOOP WHILE i&0 DEC debut_liste_eff& scroll_bas_popup_general(TRUE,adr_fonctions%,debut_liste_eff&,0,nombre_d_objets&,17,sousfnct&,lte01&,lte02&) position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_eff&,TRUE) ecrire_les_objets_effacer(FALSE) ENDIF CASE fnctbas& objc_change(adr_fonctions%,objet&) IF ADD(debut_liste_eff&,16)0 CLR debut_liste_eff& ecrire_les_objets_effacer(TRUE) position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_eff&,TRUE) ENDIF CASE fnctmaxi& objc_change(adr_fonctions%,objet&) IF ADD(debut_liste_eff&,16)17 deplace_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&) objc_change(adr_fonctions%,objet&) ENDIF CASE valfnct& objc_change(adr_fonctions%,objet&) fermeture_fenetre(16) t%=@prendre(LEN(CHAR{{OB_SPEC(adr_fonctions%,titrfnct&)}}),TRUE,3) CHAR{t%}=CHAR{{OB_SPEC(adr_fonctions%,titrfnct&)}} CHAR{{OB_SPEC(adr_fonctions%,titrfnct&)}}=CHAR{{OB_SPEC(adr_fonctions%,titreffa&)}} CHAR{{OB_SPEC(adr_fonctions%,titreffa&)}}=CHAR{t%} libere(*t%) ENDSELECT ELSE IF (NOT flags_effacement!) AND (NOT flags_masquage!) AND flags_blobs! ' *********************************************************** ' **** Ce qui suit correspond … la gestion des BLOBS **** ' *********************************************************** $S&,$S> SELECT objet& CASE blobtres& ob&=objet& memo=VAL(CHAR{{OB_SPEC(adr_fonctions%,objet&)}}) saisie_d_une_composante(adr_fonctions%,objet&,0.00001,0.99999,8,5) CASE fnctpere& IF NOT (BTST(OB_STATE(adr_fonctions%,fnctpere&),aes_disable&)) objc_offset(adr_fonctions%,fnctfils&,mvtx&,mvty&) ADD debut_liste_csg&,17*(global_my&mvty&) debut_liste_csg&=-debut_liste_csg&*(debut_liste_csg&=>0 AND debut_liste_csg&<=SUB(nombre_d_objets&,17))+0*(debut_liste_csg&<0)-SUB(nombre_d_objets&,17)*(debut_liste_csg&>SUB(nombre_d_objets&,17)) ecrire_les_objets_fonction(TRUE) position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_csg&,TRUE) ENDIF CASE etout& objc_change(adr_fonctions%,objet&) compteur_csg&=nombre_d_objets& CLR i& DO INT{ADD(effacement%,SHL(i&,1))}=i& INC i& LOOP WHILE i&"" CHAR{{OB_SPEC(adr_fonctions%,objet&)}}=STR$(PRED(compteur_csg&),3)+STR$(SUCC(nume&),3)+CHAR{ADD(@adresse_objet(nume&),offset_nom_objet&)} ELSE choix&=INT{@adresse_objet(nume&)} CHAR{{OB_SPEC(adr_fonctions%,objet&)}}=STR$(PRED(compteur_csg&),3)+STR$(SUCC(nume&),3)+@nom_objet$(choix&,TRUE) ENDIF redraw_elem(adr_fonctions%,objet&) ELSE ob_state(adr_fonctions%,objet&,aes_selected&,FALSE) replacement_de_la_zone_memoire_des_fonctions(nume&) DEC compteur_csg& ecrire_les_objets_fonction(TRUE) ENDIF ENDIF CASE fnctzero& objc_change(adr_fonctions%,objet&) IF debut_liste_csg&>0 CLR debut_liste_csg& ecrire_les_objets_fonction(TRUE) position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_csg&,TRUE) ENDIF CASE fncthau& objc_change(adr_fonctions%,objet&) IF debut_liste_csg&>0 DEC debut_liste_csg& scroll_bas_popup_general(TRUE,adr_fonctions%,debut_liste_csg&,0,nombre_d_objets&,17,sousfnct&,fnct01&,fnct02&) position_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&,debut_liste_csg&,TRUE) ecrire_les_objets_fonction(FALSE) ENDIF CASE fnctbas& objc_change(adr_fonctions%,objet&) IF ADD(debut_liste_csg&,16)17 deplace_curseur_effacer(adr_fonctions%,fnctpere&,fnctfils&) objc_change(adr_fonctions%,objet&) ENDIF CASE icneff& ' Ayant chang‚ son texte, c'est en fait le bouton de cr‚ation des BLOBs objc_change(adr_fonctions%,objet&) ' On commence par r‚cup‚rer le nouveau treshold CHAR{{OB_SPEC(adr_modifier%,modthrbl&)}}=CHAR{{OB_SPEC(adr_fonctions%,blobtres&)}} ' Puis on remet l'ancienne barre de titre CHAR{{OB_SPEC(adr_fonctions%,titrfnct&)}}=CHAR{{OB_SPEC(adr_fonctions%,titreffa&)}} ' On ferme la fenˆtre fermeture_fenetre(16) sauve!=FALSE ' Et enfin on cr‚‚ le BLOB (comme pour les CSG) type_de_csg&=-5 creation_pour_csg CASE valfnct& objc_change(adr_fonctions%,objet&) CHAR{{OB_SPEC(adr_fonctions%,titrfnct&)}}=CHAR{{OB_SPEC(adr_fonctions%,titreffa&)}} modif_csg!=FALSE fermeture_fenetre(16) ENDSELECT ENDIF RETURN > PROCEDURE gestion_des_calques LOCAL mod&,pred|,suiv| ' $S&,$S> SELECT objet& CASE caldef01& TO caldef10& objc_change(adr_calques%,objet&) ob_state(adr_calques%,ADD(caldef01&,calque_actif|),aes_checked&,FALSE) redraw_elem(adr_calques%,ADD(caldef01&,calque_actif|)) calque_actif|=SUB(objet&,caldef01&) calque_on_off(calque_actif|,TRUE) ob_state(adr_calques%,ADD(caldef01&,calque_actif|),aes_checked&,TRUE) redraw_elem(adr_calques%,objet&) mod_cal!=TRUE CASE calnom01& TO calnom10& saisie_d_une_ligne(adr_calques%,objet&,sortcalq&,0,0,33,0) objc_change(adr_calques%,objet&) mod_cal!=TRUE CASE cavion01& TO cavion10& calque_on_off(SUB(objet&,cavion01&),TRUE) mod_cal!=TRUE CASE caviof01& TO caviof10& calque_on_off(SUB(objet&,caviof01&),FALSE) ca|=SUB(objet&,caviof01&) IF ca|=calque_actif| ! Ah! je rend invisible le calque actif ' il faut changer de calque actif pred|=11 ! Recherche du plus proche calque cpt|=ca| ! visible pr‚c‚dent DO IF BTST(OB_STATE(adr_calques%,ADD(cavion01&,cpt|)),aes_selected&) pred|=cpt| ENDIF EXIT IF (cpt|=0) OR (pred|=cpt|) DEC cpt| pred|=11 LOOP ' suiv|=11 ! Recherche du plus proche calque cpt|=ca| ! visible suivant DO IF BTST(OB_STATE(adr_calques%,ADD(cavion01&,cpt|)),aes_selected&) suiv|=cpt| ENDIF EXIT IF (cpt|=9) OR (suiv|=cpt|) INC cpt| suiv|=11 LOOP ' IF pred|=11 AND suiv|=11 ! Aucun autre calque n'est visible CLR calque_actif| ! Le premier par d‚faut ELSE IF SUB(ca|,pred|)SUB(suiv|,ca|) ' Le calque suivant est plus prŠs ' que le calque pr‚c‚dent, on le prend calque_actif|=suiv| ELSE IF SUB(ca|,pred|)=SUB(suiv|,ca|) ' Les calques suivant et pr‚c‚dent sont ' … mˆme distance. On prend le pr‚c‚dent ' par d‚faut calque_actif|=pred| ENDIF ob_state(adr_calques%,ADD(caldef01&,ca|),aes_checked&,FALSE) redraw_elem(adr_calques%,ADD(caldef01&,ca|)) calque_on_off(calque_actif|,TRUE) ob_state(adr_calques%,ADD(caldef01&,calque_actif|),aes_checked&,TRUE) redraw_elem(adr_calques%,ADD(caldef01&,calque_actif|)) ENDIF mod_cal!=TRUE CASE calcou01& TO calcou10& objc_change(adr_calques%,objet&) ca|=SUB(objet&,calcou01&) mise_en_place_popup(chxcoul&) positionner_popup(-1,objet&,adr_calques%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,coul0&,coul15&,0) IF reponse&<>255 ob_spec%=OB_SPEC(adr_calques%,objet&) te_color&=INT{ADD(ob_spec%,18)} te_color&=te_color& AND -128 te_color&=te_color& OR 112 ! Trame pleine te_color&=te_color& OR reponse& ! Couleur de l'objet INT{ADD(ob_spec%,18)}=te_color& CHAR{{OB_SPEC(adr_calques%,objet&)}}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(coul0&,reponse&))}} BYTE{ADD(ADD(nom_calque%,MUL(ca|,36)),34)}=reponse& mod_cal!=TRUE ENDIF redraw_elem(adr_calques%,0) CASE touscalq& objc_change(adr_calques%,objet&) tous_les_calques_visibles mod&=@ecrire_etat_calques redraw_elem(adr_calques%,0) mod_cal!=TRUE CASE uncalq& objc_change(adr_calques%,objet&) les_calque_invisibles_sauf(calque_actif|) mod&=@ecrire_etat_calques redraw_elem(adr_calques%,0) mod_cal!=TRUE CASE annucalq& objc_change(adr_calques%,objet&) fermeture_fenetre(18) CASE sortcalq& objc_change(adr_calques%,objet&) ~@lire_etat_calques redimention!=FALSE tri_3d!=FALSE trace_3d_plein!=FALSE tri_2d!=FALSE tri_fi!=FALSE redessin_deja_fait!=FALSE IF nombre_d_objets&>1 objet_precedent objet_suivant ENDIF fermeture_fenetre(18) ENDSELECT ' RETURN > PROCEDURE gestion_statistiques LOCAL x&,y&,w&,h& $S&,$S> SELECT objet& CASE i0& TO i12& objc_change(adr_stat%,objet&) objc_offset(adr_stat%,objet&,x&,y&) w&=OB_W(adr_stat%,objet&) h&=OB_H(adr_stat%,objet&) objc_draw(adr_stat%,PRED(i0&),12,x&,y&,w&,h&,-1) IF VAL(CHAR{{OB_SPEC(adr_stat%,objet&)}})>0 statistiques_par_objet(objet&,VAL(CHAR{{OB_SPEC(adr_stat%,objet&)}})) ENDIF CASE valstat& objc_change(adr_stat%,objet&) fermeture_fenetre(20) ENDSELECT RETURN > PROCEDURE gestion_merci LOCAL ht&,mvtx&,mvty&,tot_inf& LOCAL zx&,zy&,zh&,zw& ' ht&=OB_H(adr_merci%,merci_txt_1&) tot_inf&=SUB(SUB(merci_txt_2&,merci_txt_1&),12) ' $S&,$S> SELECT objet& CASE okmerci& objc_change(adr_merci%,objet&) fermeture_fenetre(22) CASE popchozerem& IF NOT (BTST(OB_STATE(adr_merci%,objet&),aes_disable&)) IF position_y_remerciement&<0 CLR position_y_remerciement& position_curseur_merci(adr_merci%,popchoperem&,popchocarem&,-position_y_remerciement&,tot_inf&,TRUE) effacer_texte_merci_non_vue ' objc_offset(adr_merci%,inf_contenu&,zx&,zy&) zw&=OB_W(adr_merci%,inf_contenu&) zh&=OB_H(adr_merci%,inf_contenu&) objc_draw(adr_merci%,inf_contenu&,1,zx&,zy&,zw&,zh&,-1) ' objc_offset(adr_merci%,popchozerem&,zx&,zy&) zw&=OB_W(adr_merci%,popchozerem&) zh&=OB_H(adr_merci%,popchozerem&)*4 objc_draw(adr_merci%,0,5,zx&,zy&,zw&,zh&,-1) ' videsouris ENDIF objc_change(adr_merci%,objet&) ENDIF CASE popchoharem& IF NOT (BTST(OB_STATE(adr_merci%,objet&),aes_disable&)) IF position_y_remerciement&<0 INC position_y_remerciement& position_curseur_merci(adr_merci%,popchoperem&,popchocarem&,-position_y_remerciement&,tot_inf&,TRUE) effacer_texte_merci_non_vue ' objc_offset(adr_merci%,inf_contenu&,zx&,zy&) zw&=OB_W(adr_merci%,inf_contenu&) zh&=OB_H(adr_merci%,inf_contenu&) objc_draw(adr_merci%,inf_contenu&,1,zx&,zy&,zw&,zh&,-1) ' objc_offset(adr_merci%,popchozerem&,zx&,zy&) zw&=OB_W(adr_merci%,popchozerem&) zh&=OB_H(adr_merci%,popchozerem&)*4 objc_draw(adr_merci%,0,5,zx&,zy&,zw&,zh&,-1) ' ENDIF objc_change(adr_merci%,objet&) ENDIF CASE popchobarem& IF NOT (BTST(OB_STATE(adr_merci%,objet&),aes_disable&)) IF position_y_remerciement&>-tot_inf& DEC position_y_remerciement& position_curseur_merci(adr_merci%,popchoperem&,popchocarem&,-position_y_remerciement&,tot_inf&,TRUE) effacer_texte_merci_non_vue ' objc_offset(adr_merci%,inf_contenu&,zx&,zy&) zw&=OB_W(adr_merci%,inf_contenu&) zh&=OB_H(adr_merci%,inf_contenu&) objc_draw(adr_merci%,inf_contenu&,1,zx&,zy&,zw&,zh&,-1) ' objc_offset(adr_merci%,popchozerem&,zx&,zy&) zw&=OB_W(adr_merci%,popchozerem&) zh&=OB_H(adr_merci%,popchozerem&)*4 objc_draw(adr_merci%,0,5,zx&,zy&,zw&,zh&,-1) ' ENDIF objc_change(adr_merci%,objet&) ENDIF CASE popchofirem& IF NOT (BTST(OB_STATE(adr_merci%,objet&),aes_disable&)) IF position_y_remerciement&>-tot_inf& position_y_remerciement&=-tot_inf& position_curseur_merci(adr_merci%,popchoperem&,popchocarem&,-position_y_remerciement&,tot_inf&,TRUE) effacer_texte_merci_non_vue ' objc_offset(adr_merci%,inf_contenu&,zx&,zy&) zw&=OB_W(adr_merci%,inf_contenu&) zh&=OB_H(adr_merci%,inf_contenu&) objc_draw(adr_merci%,inf_contenu&,1,zx&,zy&,zw&,zh&,-1) ' objc_offset(adr_merci%,popchozerem&,zx&,zy&) zw&=OB_W(adr_merci%,popchozerem&) zh&=OB_H(adr_merci%,popchozerem&)*4 objc_draw(adr_merci%,0,5,zx&,zy&,zw&,zh&,-1) ' videsouris ENDIF objc_change(adr_merci%,objet&) ENDIF CASE popchoperem& objc_offset(adr_merci%,bpopchocrem&,mvtx&,mvty&) ADD position_y_remerciement&,13*(global_my&>mvty&)-13*(global_my&-tot_inf&)+0*(position_y_remerciement&>0)+tot_inf&*(position_y_remerciement&<-tot_inf&) position_curseur_merci(adr_merci%,popchoperem&,popchocarem&,-position_y_remerciement&,tot_inf&,TRUE) effacer_texte_merci_non_vue ' objc_offset(adr_merci%,inf_contenu&,zx&,zy&) zw&=OB_W(adr_merci%,inf_contenu&) zh&=OB_H(adr_merci%,inf_contenu&) objc_draw(adr_merci%,inf_contenu&,1,zx&,zy&,zw&,zh&,-1) ' objc_offset(adr_merci%,popchozerem&,zx&,zy&) zw&=OB_W(adr_merci%,popchozerem&) zh&=OB_H(adr_merci%,popchozerem&)*4 objc_draw(adr_merci%,0,5,zx&,zy&,zw&,zh&,-1) ' videsouris CASE bpopchocrem& IF NOT (BTST(OB_STATE(adr_merci%,objet&),aes_disable&)) deplace_curseur_merci(adr_merci%,popchoperem&,popchocarem&) objc_change(adr_merci%,objet&) videsouris ENDIF ENDSELECT RETURN > PROCEDURE gestion_position_camera LOCAL angle,reponse&,uni% $S&,$S> SELECT objet& CASE camposob& objc_change(adr_camera%,objet&) positionner_popup(24,objet&,adr_camera%,adr_popup_autre0%,rx&,ry&) CLR debut_popup_choix& reponse&=@popup_de_choix(rx&,ry&,0) IF reponse&<>-1 uni%=@adresse_objet(reponse&) CHAR{{OB_SPEC(adr_camera%,poscamx&)}}=STR$(ROUND(SINGLE{ADD(uni%,2)},3),10,3) CHAR{{OB_SPEC(adr_camera%,poscamy&)}}=STR$(ROUND(SINGLE{ADD(uni%,6)},3),10,3) CHAR{{OB_SPEC(adr_camera%,poscamz&)}}=STR$(ROUND(SINGLE{ADD(uni%,10)},3),10,3) redraw_elem(adr_camera%,poscamx&) redraw_elem(adr_camera%,poscamy&) redraw_elem(adr_camera%,poscamz&) ENDIF CASE camvisob& objc_change(adr_camera%,objet&) positionner_popup(24,objet&,adr_camera%,adr_popup_autre0%,rx&,ry&) CLR debut_popup_choix& reponse&=@popup_de_choix(rx&,ry&,0) IF reponse&<>-1 uni%=@adresse_objet(reponse&) CHAR{{OB_SPEC(adr_camera%,posversx&)}}=STR$(ROUND(SINGLE{ADD(uni%,2)},3),10,3) CHAR{{OB_SPEC(adr_camera%,posversy&)}}=STR$(ROUND(SINGLE{ADD(uni%,6)},3),10,3) CHAR{{OB_SPEC(adr_camera%,posversz&)}}=STR$(ROUND(SINGLE{ADD(uni%,10)},3),10,3) redraw_elem(adr_camera%,posversx&) redraw_elem(adr_camera%,posversy&) redraw_elem(adr_camera%,posversz&) ENDIF CASE camfocob& objc_change(adr_camera%,objet&) positionner_popup(24,objet&,adr_camera%,adr_popup_autre0%,rx&,ry&) CLR debut_popup_choix& reponse&=@popup_de_choix(rx&,ry&,0) IF reponse&<>-1 uni%=@adresse_objet(reponse&) CHAR{{OB_SPEC(adr_camera%,posfocax&)}}=STR$(ROUND(SINGLE{ADD(uni%,2)},3),10,3) CHAR{{OB_SPEC(adr_camera%,posfocay&)}}=STR$(ROUND(SINGLE{ADD(uni%,6)},3),10,3) CHAR{{OB_SPEC(adr_camera%,posfocaz&)}}=STR$(ROUND(SINGLE{ADD(uni%,10)},3),10,3) redraw_elem(adr_camera%,posfocax&) redraw_elem(adr_camera%,posfocay&) redraw_elem(adr_camera%,posfocaz&) ENDIF CASE posfocax&,posfocay&,posfocaz& saisie_d_une_composante(adr_camera%,objet&,-32768,32767,10,3) sauve!=FALSE CASE possampl&,posapert& saisie_d_une_composante(adr_camera%,objet&,0,100,3,0) sauve!=FALSE CASE posnorma& objc_change(adr_camera%,objet&) normal_camera!=TRUE lancement_gestion_texture ' ouvrir_normal CASE posper01& objc_change(adr_camera%,objet&) BYTE{ADD(camera%,30)}=BSET(BYTE{ADD(camera%,30)},0) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},1) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},2) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},3) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},4) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},5) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},6) ressource_camera(FALSE,-1) redraw_elem(adr_camera%,souscamp&) CASE posper02& objc_change(adr_camera%,objet&) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},0) BYTE{ADD(camera%,30)}=BSET(BYTE{ADD(camera%,30)},1) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},2) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},3) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},4) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},5) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},6) ressource_camera(FALSE,-1) redraw_elem(adr_camera%,souscamp&) CASE posper03& objc_change(adr_camera%,objet&) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},0) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},1) BYTE{ADD(camera%,30)}=BSET(BYTE{ADD(camera%,30)},2) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},3) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},4) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},5) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},6) ressource_camera(FALSE,-1) redraw_elem(adr_camera%,souscamp&) CASE posper04& objc_change(adr_camera%,objet&) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},0) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},1) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},2) BYTE{ADD(camera%,30)}=BSET(BYTE{ADD(camera%,30)},3) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},4) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},5) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},6) ressource_camera(FALSE,-1) redraw_elem(adr_camera%,souscamp&) CASE posper05& objc_change(adr_camera%,objet&) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},0) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},1) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},2) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},3) BYTE{ADD(camera%,30)}=BSET(BYTE{ADD(camera%,30)},4) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},5) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},6) ressource_camera(FALSE,-1) redraw_elem(adr_camera%,souscamp&) CASE posper06& objc_change(adr_camera%,objet&) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},0) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},1) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},2) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},3) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},4) BYTE{ADD(camera%,30)}=BSET(BYTE{ADD(camera%,30)},5) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},6) ressource_camera(FALSE,-1) redraw_elem(adr_camera%,souscamp&) CASE posper07& objc_change(adr_camera%,objet&) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},0) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},1) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},2) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},3) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},4) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},5) BYTE{ADD(camera%,30)}=BSET(BYTE{ADD(camera%,30)},6) ressource_camera(FALSE,-1) redraw_elem(adr_camera%,souscamp&) CASE camfocac& objc_change(adr_camera%,objet&) BYTE{ADD(camera%,30)}=BCHG(BYTE{ADD(camera%,30)},7) ob_state(adr_camera%,camfocac&,aes_selected&,BTST(BYTE{ADD(camera%,30)},7)) ob_state(adr_camera%,posfocax&,aes_disable&,NOT BTST(BYTE{ADD(camera%,30)},7)) ob_state(adr_camera%,posfocay&,aes_disable&,NOT BTST(BYTE{ADD(camera%,30)},7)) ob_state(adr_camera%,posfocaz&,aes_disable&,NOT BTST(BYTE{ADD(camera%,30)},7)) ob_state(adr_camera%,possampl&,aes_disable&,NOT BTST(BYTE{ADD(camera%,30)},7)) ob_state(adr_camera%,posapert&,aes_disable&,NOT BTST(BYTE{ADD(camera%,30)},7)) IF nombre_d_objet&>0 ob_state(adr_camera%,camfocob&,aes_disable&,NOT BTST(BYTE{ADD(camera%,30)},7)) redraw_elem(adr_camera%,camfocob&) ENDIF redraw_elem(adr_camera%,souscame&) CASE postyp1& objc_change(adr_camera%,objet&) BYTE{ADD(camera%,31)}=1 ressource_camera(FALSE,-1) redraw_elem(adr_camera%,souscamp&) CASE postyp2& objc_change(adr_camera%,objet&) BYTE{ADD(camera%,31)}=2 ressource_camera(FALSE,-1) redraw_elem(adr_camera%,souscamp&) CASE postyp3& objc_change(adr_camera%,objet&) BYTE{ADD(camera%,31)}=3 ressource_camera(FALSE,-1) redraw_elem(adr_camera%,souscamp&) CASE postyp4& objc_change(adr_camera%,objet&) BYTE{ADD(camera%,31)}=4 ressource_camera(FALSE,-1) redraw_elem(adr_camera%,souscamp&) CASE poscamx&,poscamy&,poscamz&,posversx&,posversy&,posversz& saisie_d_une_composante(adr_camera%,objet&,-32768,32767,10,3) sauve!=FALSE CASE posangle& saisie_d_une_composante(adr_camera%,objet&,-180,180,8,3) sauve!=FALSE CASE posobdeg& saisie_d_une_composante(adr_camera%,objet&,0,180,7,3) angle=VAL(CHAR{{OB_SPEC(adr_camera%,posobdeg&)}}) focale&=ROUND(0.5/(TAN(RAD(angle/2)))*400) {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) INT{ADD(camera%,28)}=focale& ressource_camera(FALSE,9) redraw_elem(adr_camera%,souscamf&) sauve!=FALSE CASE posob50& objc_change(adr_camera%,objet&) INT{ADD(camera%,28)}=400 focale&=400 {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) ressource_camera(FALSE,5) redraw_elem(adr_camera%,souscamf&) sauve!=FALSE CASE posob6& objc_change(adr_camera%,objet&) INT{ADD(camera%,28)}=48 focale&=48 {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) ressource_camera(FALSE,0) redraw_elem(adr_camera%,souscamf&) sauve!=FALSE CASE posob135& objc_change(adr_camera%,objet&) INT{ADD(camera%,28)}=1080 focale&=1080 {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) ressource_camera(FALSE,6) redraw_elem(adr_camera%,souscamf&) sauve!=FALSE CASE posob280& objc_change(adr_camera%,objet&) INT{ADD(camera%,28)}=2240 focale&=2240 {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) ressource_camera(FALSE,7) redraw_elem(adr_camera%,souscamf&) sauve!=FALSE CASE posob400& objc_change(adr_camera%,objet&) INT{ADD(camera%,28)}=3200 focale&=3200 {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) ressource_camera(FALSE,8) redraw_elem(adr_camera%,souscamf&) sauve!=FALSE CASE posob35& objc_change(adr_camera%,objet&) INT{ADD(camera%,28)}=280 focale&=280 {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) ressource_camera(FALSE,4) redraw_elem(adr_camera%,souscamf&) sauve!=FALSE CASE posob28& objc_change(adr_camera%,objet&) INT{ADD(camera%,28)}=224 focale&=224 {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) ressource_camera(FALSE,3) redraw_elem(adr_camera%,souscamf&) sauve!=FALSE CASE posob24& objc_change(adr_camera%,objet&) INT{ADD(camera%,28)}=192 focale&=192 {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) ressource_camera(FALSE,2) redraw_elem(adr_camera%,souscamf&) sauve!=FALSE CASE posob18& objc_change(adr_camera%,objet&) INT{ADD(camera%,28)}=144 focale&=144 {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) ressource_camera(FALSE,1) redraw_elem(adr_camera%,souscamf&) sauve!=FALSE CASE posobxxx& objc_change(adr_camera%,objet&) angle=VAL(CHAR{{OB_SPEC(adr_camera%,posobdeg&)}}) focale&=ROUND(0.5/(TAN(RAD(angle/2)))*400) {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) INT{ADD(camera%,28)}=focale& ressource_camera(FALSE,9) redraw_elem(adr_camera%,souscamf&) sauve!=FALSE CASE anposcam& objc_change(adr_camera%,objet&) INT{ADD(camera%,28)}=mem_focale& focale&=mem_focale& {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) fermeture_fenetre(24) IF normal_camera! fermeture_fenetre(44) normal_camera!=FALSE ENDIF CASE okposcam& objc_change(adr_camera%,objet&) IF normal_camera! fermeture_fenetre(44) normal_camera!=FALSE ENDIF IF vue_subjective!=TRUE SINGLE{mem_subj%}=VAL(CHAR{{OB_SPEC(adr_camera%,poscamx&)}}) SINGLE{ADD(mem_subj%,4)}=VAL(CHAR{{OB_SPEC(adr_camera%,poscamy&)}}) SINGLE{ADD(mem_subj%,8)}=VAL(CHAR{{OB_SPEC(adr_camera%,poscamz&)}}) SINGLE{ADD(mem_subj%,12)}=VAL(CHAR{{OB_SPEC(adr_camera%,posversx&)}}) SINGLE{ADD(mem_subj%,16)}=VAL(CHAR{{OB_SPEC(adr_camera%,posversy&)}}) SINGLE{ADD(mem_subj%,20)}=VAL(CHAR{{OB_SPEC(adr_camera%,posversz&)}}) ELSE SINGLE{camera%}=VAL(CHAR{{OB_SPEC(adr_camera%,poscamx&)}}) SINGLE{ADD(camera%,4)}=VAL(CHAR{{OB_SPEC(adr_camera%,poscamy&)}}) SINGLE{ADD(camera%,8)}=VAL(CHAR{{OB_SPEC(adr_camera%,poscamz&)}}) SINGLE{ADD(camera%,12)}=VAL(CHAR{{OB_SPEC(adr_camera%,posversx&)}}) SINGLE{ADD(camera%,16)}=VAL(CHAR{{OB_SPEC(adr_camera%,posversy&)}}) SINGLE{ADD(camera%,20)}=VAL(CHAR{{OB_SPEC(adr_camera%,posversz&)}}) ENDIF SINGLE{ADD(camera%,24)}=VAL(CHAR{{OB_SPEC(adr_camera%,posangle&)}}) IF BTST(OB_STATE(adr_camera%,posobxxx&),aes_selected&) angle=VAL(CHAR{{OB_SPEC(adr_camera%,posobdeg&)}}) IF angle=0 angle=1 ENDIF focale&=ROUND(0.5/(TAN(RAD(angle/2)))*400) {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) INT{ADD(camera%,28)}=focale& ENDIF fermeture_fenetre(24) IF dessin_3d|=vue_en_3d| OR (NOT sauve!) tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE redessin_deja_fait!=FALSE ENDIF travail_a_sauver!=TRUE redraw_force(24,24) ENDSELECT RETURN > PROCEDURE gestion_du_lanceur_pov LOCAL i&,l%,rx&,ry&,po% LOCAL xr&,yr& $S&,$S> SELECT objet& CASE povaffi& redraw_elem(adr_lanceur%,objet&) videsouris ob_state(adr_lanceur%,modeaffi&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,povaffi&),aes_selected&))) IF BTST(OB_STATE(adr_lanceur%,povaffi&),aes_selected&) ob_state(adr_lanceur%,povnume&,aes_selected&,FALSE) ob_state(adr_lanceur%,povnume&,aes_disable&,TRUE) ob_state(adr_lanceur%,povmosai&,aes_disable&,FALSE) ELSE ob_state(adr_lanceur%,povnume&,aes_disable&,FALSE) ob_state(adr_lanceur%,povmosai&,aes_selected&,FALSE) ob_state(adr_lanceur%,povmosai&,aes_disable&,TRUE) ob_state(adr_lanceur%,mosadebu&,aes_disable&,TRUE) ob_state(adr_lanceur%,mosafin&,aes_disable&,TRUE) redraw_elem(adr_lanceur%,mosadebu&) redraw_elem(adr_lanceur%,mosafin&) ENDIF redraw_elem(adr_lanceur%,povnume&) redraw_elem(adr_lanceur%,modeaffi&) redraw_elem(adr_lanceur%,povmosai&) CASE povmosai& redraw_elem(adr_lanceur%,objet&) videsouris ob_state(adr_lanceur%,mosadebu&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,povmosai&),aes_selected&))) ob_state(adr_lanceur%,mosafin&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,povmosai&),aes_selected&))) redraw_elem(adr_lanceur%,mosadebu&) redraw_elem(adr_lanceur%,mosafin&) CASE mosadebu& objc_change(adr_lanceur%,objet&) mise_en_place_popup(chxmosai&) positionner_popup(26,objet&,adr_lanceur%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,mosaic01&,mosaic02&,0) IF reponse&<>255 CHAR{{OB_SPEC(adr_lanceur%,SUB(mosadebu&,2))}}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(mosaic01&,reponse&))}} redraw_elem(adr_lanceur%,mosadebu&) ENDIF CASE mosafin& objc_change(adr_lanceur%,objet&) mise_en_place_popup(chxmosai&) positionner_popup(26,objet&,adr_lanceur%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,mosaic01&,mosaic02&,0) IF reponse&<>255 CHAR{{OB_SPEC(adr_lanceur%,SUB(mosafin&,2))}}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(mosaic01&,reponse&))}} redraw_elem(adr_lanceur%,mosafin&) ENDIF CASE povquali& objc_change(adr_lanceur%,objet&) mise_en_place_popup(chxrendu&) positionner_popup(26,objet&,adr_lanceur%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,povrend0&,povrend1&,0) IF reponse&<>255 CHAR{{OB_SPEC(adr_lanceur%,SUB(povquali&,2))}}="Q"+STR$(reponse&) redraw_elem(adr_lanceur%,povquali&) ENDIF CASE modeaffi& objc_change(adr_lanceur%,objet&) mise_en_place_popup(chxtrace&) positionner_popup(26,objet&,adr_lanceur%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,poppal0&,poppal1&,0) IF reponse&<>255 CHAR{{OB_SPEC(adr_lanceur%,txtmode&)}}="Mode "+STR$(reponse&,1) redraw_elem(adr_lanceur%,modeaffi&) ENDIF CASE povradio& objc_change(adr_lanceur%,objet&) l%=OB_SPEC(adr_divers%,lin8&) po%=INSTR(CHAR{l%},"/") IF CHAR{{OB_SPEC(adr_lanceur%,SUB(povradio&,2))}}=LEFT$(CHAR{l%},PRED(po%)) CHAR{{OB_SPEC(adr_lanceur%,SUB(povradio&,2))}}=RIGHT$(CHAR{l%},SUB(LEN(CHAR{l%}),po%)) ELSE CHAR{{OB_SPEC(adr_lanceur%,SUB(povradio&,2))}}=LEFT$(CHAR{l%},PRED(po%)) ENDIF redraw_elem(adr_lanceur%,povradio&) CASE povsauv& objc_change(adr_lanceur%,objet&) sauver_parametres CASE povutsl& redraw_elem(adr_lanceur%,objet&) videsouris ob_state(adr_lanceur%,povslabs&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,povutsl&),aes_selected&))) redraw_elem(adr_lanceur%,povslabs&) CASE buffonof& redraw_elem(adr_lanceur%,objet&) videsouris ob_state(adr_lanceur%,povbuffe&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,buffonof&),aes_selected&))) redraw_elem(adr_lanceur%,povbuffe&) CASE povcont& redraw_elem(adr_lanceur%,objet&) videsouris CASE antionof& redraw_elem(adr_lanceur%,objet&) videsouris ob_state(adr_lanceur%,PRED(povpere&),aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,antionof&),aes_selected&))) ob_state(adr_lanceur%,bpovfil&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,antionof&),aes_selected&))) ob_state(adr_lanceur%,jittonof&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,antionof&),aes_selected&))) ob_state(adr_lanceur%,povlafa&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,antionof&),aes_selected&))) IF BTST(OB_STATE(adr_lanceur%,jittonof&),aes_selected&) ob_state(adr_lanceur%,jittonof&,aes_selected&,FALSE) ob_state(adr_lanceur%,jittonof&,aes_disable&,TRUE) ob_state(adr_lanceur%,PRED(jittpere&),aes_disable&,TRUE) ob_state(adr_lanceur%,bjittfil&,aes_disable&,TRUE) ENDIF FOR i&=povmat01& TO povmat09& ob_state(adr_lanceur%,i&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,antionof&),aes_selected&))) redraw_elem(adr_lanceur%,i&) NEXT i& redraw_elem(adr_lanceur%,PRED(povpere&)) redraw_elem(adr_lanceur%,PRED(jittpere&)) redraw_elem(adr_lanceur%,bpovfil&) redraw_elem(adr_lanceur%,bjittfil&) redraw_elem(adr_lanceur%,jittonof&) redraw_elem(adr_lanceur%,povlafa&) CASE povlafa& redraw_elem(adr_lanceur%,objet&) videsouris CASE jittonof& redraw_elem(adr_lanceur%,objet&) videsouris ob_state(adr_lanceur%,PRED(jittpere&),aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,jittonof&),aes_selected&))) ob_state(adr_lanceur%,bjittfil&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,jittonof&),aes_selected&))) redraw_elem(adr_lanceur%,PRED(jittpere&)) redraw_elem(adr_lanceur%,bjittfil&) CASE povgene&,pov_ul&,pov_uv&,pov_su&,pov_ur&,pov_ua& redraw_elem(adr_lanceur%,objet&) videsouris CASE pov_ga& redraw_elem(adr_lanceur%,objet&) videsouris IF BTST(OB_STATE(adr_lanceur%,pov_ga&),aes_selected&) ob_state(adr_lanceur%,pov_gd&,aes_selected&,TRUE) ob_state(adr_lanceur%,pov_gf&,aes_selected&,TRUE) ob_state(adr_lanceur%,pov_gr&,aes_selected&,TRUE) ob_state(adr_lanceur%,pov_gs&,aes_selected&,TRUE) ob_state(adr_lanceur%,pov_gw&,aes_selected&,TRUE) ELSE ob_state(adr_lanceur%,pov_gd&,aes_selected&,FALSE) ob_state(adr_lanceur%,pov_gf&,aes_selected&,FALSE) ob_state(adr_lanceur%,pov_gr&,aes_selected&,FALSE) ob_state(adr_lanceur%,pov_gs&,aes_selected&,FALSE) ob_state(adr_lanceur%,pov_gw&,aes_selected&,FALSE) ENDIF redraw_elem(adr_lanceur%,pov_gd&) redraw_elem(adr_lanceur%,pov_gf&) redraw_elem(adr_lanceur%,pov_gr&) redraw_elem(adr_lanceur%,pov_gs&) redraw_elem(adr_lanceur%,pov_gw&) CASE pov_gd&,pov_gf&,pov_gr&,pov_gs&,pov_gw& redraw_elem(adr_lanceur%,objet&) videsouris CASE bpc& saisie_d_une_composante(adr_lanceur%,objet&,8,16,2,0) CASE povatte&,povater&,povnume& redraw_elem(adr_lanceur%,objet&) videsouris CHAR{{OB_SPEC(adr_lanceur%,cpovdebu&)}}=" 1" CHAR{{OB_SPEC(adr_lanceur%,cpovfin&)}}=STR$(largeur_par_defaut&,5) CHAR{{OB_SPEC(adr_lanceur%,rpovdebu&)}}=" 1" CHAR{{OB_SPEC(adr_lanceur%,rpovfin&)}}=STR$(hauteur_par_defaut&,5) redraw_elem(adr_lanceur%,cpovdebu&) redraw_elem(adr_lanceur%,cpovfin&) redraw_elem(adr_lanceur%,rpovdebu&) redraw_elem(adr_lanceur%,rpovfin&) larg_ref&=VAL(CHAR{{OB_SPEC(adr_lanceur%,povlarge&)}}) haut_ref&=VAL(CHAR{{OB_SPEC(adr_lanceur%,povhaute&)}}) ' calcul_temps_evalue CASE povnume& redraw_elem(adr_lanceur%,objet&) ob_state(adr_lanceur%,povaffi&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,povnume&),aes_selected&))) redraw_elem(adr_lanceur%,povaffi&) videsouris CASE povforma& objc_change(adr_lanceur%,objet&) mise_en_place_popup(chxoutfi&) positionner_popup(26,objet&,adr_lanceur%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,outfile0&,outfile1&,0) IF reponse&<>255 l%={OB_SPEC(adr_lanceur%,povimage&)} CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(outfile0&,reponse&))}} CHAR{masque%}=LEFT$(TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}}),3)+CHR$(0) IF TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}})="PNG n" ob_state(adr_lanceur%,pov_ua&,aes_disable&,FALSE) ob_state(adr_lanceur%,bpc&,aes_disable&,FALSE) ELSE ob_state(adr_lanceur%,pov_ua&,aes_disable&,TRUE) ob_state(adr_lanceur%,bpc&,aes_disable&,TRUE) ENDIF minuscule(masque%) IF INSTR(CHAR{nom_en_cours%},".") CHAR{l%}=LEFT$(CHAR{l%},PRED(INSTR(CHAR{l%},".")))+"."+CHAR{masque%}+CHR$(0) ELSE IF LEN(CHAR{nom_en_cours%})<39 CHAR{l%}=LEFT$(CHAR{nom_en_cours%}+"_"+CHAR{masque%}+SPACE$(39),39)+CHR$(0) ELSE CHAR{l%}=LEFT$(CHAR{nom_en_cours%},39)+"_"+CHAR{masque%}+CHR$(0) ENDIF ENDIF minuscule(l%) image_deja_presente(FALSE,FALSE) redraw_elem(adr_lanceur%,povforma&) redraw_elem(adr_lanceur%,povimage&) redraw_elem(adr_lanceur%,cpovdebu&) redraw_elem(adr_lanceur%,cpovfin&) redraw_elem(adr_lanceur%,rpovdebu&) redraw_elem(adr_lanceur%,rpovfin&) redraw_elem(adr_lanceur%,povcont&) redraw_elem(adr_lanceur%,pov_ua&) redraw_elem(adr_lanceur%,bpc&) ENDIF CASE povscrip& objc_change(adr_lanceur%,objet&) CHAR{masque%}="pov"+CHR$(0) definition_fichier(adr_parametres%,chepov&,nom_en_cours%,TRUE,TRUE,OB_SPEC(adr_divers%,lin34&)) minuscule(nom_en_cours%) IF CHAR{nom_en_cours%}<>"" IF INSTR(CHAR{nom_en_cours%},".") CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}}=LEFT$(CHAR{nom_en_cours%}+" ",12) CHAR{masque%}=LEFT$(TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}}),3)+CHR$(0) CHAR{nom_divers%}=CHAR{nom_en_cours%}+CHR$(0) extend(nom_divers%,masque%,nom_divers%) CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}=LEFT$(CHAR{nom_divers%}+" ",12) ELSE CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}}=LEFT$(CHAR{nom_en_cours%}+SPACE$(44),44) IF LEN(CHAR{nom_en_cours%})<39 CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}=LEFT$(CHAR{nom_en_cours%}+"_"+CHAR{masque%}+SPACE$(43),43) ELSE CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}=LEFT$(CHAR{nom_en_cours%},39)+"_"+CHAR{masque%} ENDIF CHAR{nom_divers%}=CHAR{nom_en_cours%}+CHR$(0) ENDIF redraw_elem(adr_lanceur%,povscrip&) redraw_elem(adr_lanceur%,povimage&) ENDIF CASE povimage& objc_change(adr_lanceur%,objet&) CHAR{masque%}=LEFT$(TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}}),3)+CHR$(0) minuscule(masque%) IF INSTR(CHAR{nom_divers%},".") extend(nom_divers%,masque%,nom_divers%) CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}=LEFT$(CHAR{nom_divers%}+" ",12) ELSE IF LEN(CHAR{nom_divers%})<39 CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}=LEFT$(CHAR{nom_divers%}+"_"+CHAR{masque%}+SPACE$(43),43) ELSE CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}=LEFT$(CHAR{nom_divers%},39)+"_"+CHAR{masque%} ENDIF ENDIF image_deja_presente(TRUE,TRUE) redraw_elem(adr_lanceur%,objet&) redraw_elem(adr_lanceur%,cpovdebu&) redraw_elem(adr_lanceur%,cpovfin&) redraw_elem(adr_lanceur%,rpovdebu&) redraw_elem(adr_lanceur%,rpovfin&) redraw_elem(adr_lanceur%,povcont&) CASE format0& TO format1& IF objet&=format1& largeur_par_defaut&=largeur_libre& hauteur_par_defaut&=hauteur_libre& ELSE largeur_par_defaut&=VAL(LEFT$(CHAR{{OB_SPEC(adr_lanceur%,objet&)}},PRED(INSTR(CHAR{{OB_SPEC(adr_lanceur%,objet&)}},"x")))) hauteur_par_defaut&=VAL(RIGHT$(CHAR{{OB_SPEC(adr_lanceur%,objet&)}},SUB(LEN(CHAR{{OB_SPEC(adr_lanceur%,objet&)}}),INSTR(CHAR{{OB_SPEC(adr_lanceur%,objet&)}},"x")))) ENDIF ob_flags(adr_lanceur%,povlarge&,aes_editable&,BTST(OB_STATE(adr_lanceur%,format1&),aes_selected&)) ob_flags(adr_lanceur%,povhaute&,aes_editable&,BTST(OB_STATE(adr_lanceur%,format1&),aes_selected&)) ob_flags(adr_lanceur%,povlarge&,aes_selectable&,BTST(OB_STATE(adr_lanceur%,format1&),aes_selected&)) ob_flags(adr_lanceur%,povhaute&,aes_selectable&,BTST(OB_STATE(adr_lanceur%,format1&),aes_selected&)) CHAR{{OB_SPEC(adr_lanceur%,povlarge&)}}=STR$(largeur_par_defaut&,5) CHAR{{OB_SPEC(adr_lanceur%,povhaute&)}}=STR$(hauteur_par_defaut&,5) CHAR{{OB_SPEC(adr_lanceur%,cpovdebu&)}}=" 1" CHAR{{OB_SPEC(adr_lanceur%,cpovfin&)}}=STR$(largeur_par_defaut&,5) CHAR{{OB_SPEC(adr_lanceur%,rpovdebu&)}}=" 1" CHAR{{OB_SPEC(adr_lanceur%,rpovfin&)}}=STR$(hauteur_par_defaut&,5) redraw_elem(adr_lanceur%,povlarge&) redraw_elem(adr_lanceur%,povhaute&) redraw_elem(adr_lanceur%,cpovdebu&) redraw_elem(adr_lanceur%,cpovfin&) redraw_elem(adr_lanceur%,rpovdebu&) redraw_elem(adr_lanceur%,rpovfin&) ' calcul_temps_evalue CASE bpovfil& IF global_mk&=2 OR click&=2 saisie_d_une_composante(adr_lanceur%,povfils&,0,1,5,3) objc_change(adr_lanceur%,bpovfil&) alias&=(VAL(CHAR{{OB_SPEC(adr_lanceur%,povfils&)}})*255) position_curseur_aliasing(adr_lanceur%,povpere&,povfils&,alias&,TRUE) ELSE deplace_curseur_aliasing(adr_lanceur%,povpere&,povfils&) objc_change(adr_lanceur%,objet&) ENDIF CASE bjittfil& IF global_mk&=2 OR click&=2 saisie_d_une_composante(adr_lanceur%,jittfils&,0,1,5,3) objc_change(adr_lanceur%,bjittfil&) jittering&=(VAL(CHAR{{OB_SPEC(adr_lanceur%,jittfils&)}})*255) position_curseur_aliasing(adr_lanceur%,jittpere&,jittfils&,jittering&,TRUE) ELSE deplace_curseur_aliasing(adr_lanceur%,jittpere&,jittfils&) objc_change(adr_lanceur%,objet&) ENDIF CASE povbuffe& saisie_d_une_composante(adr_lanceur%,objet&,0,999999,6,0) CASE povslabs& saisie_d_une_composante(adr_lanceur%,objet&,1,999,3,0) CASE povlarge&,povhaute&,cpovdebu&,cpovfin&,rpovdebu&,rpovfin& saisie_d_une_composante(adr_lanceur%,objet&,0,32767,5,0) largeur_par_defaut&=VAL(CHAR{{OB_SPEC(adr_lanceur%,povlarge&)}}) hauteur_par_defaut&=VAL(CHAR{{OB_SPEC(adr_lanceur%,povhaute&)}}) IF objet&=povlarge& OR objet&=povhaute& largeur_libre&=largeur_par_defaut& hauteur_libre&=hauteur_par_defaut& ENDIF CHAR{{OB_SPEC(adr_lanceur%,cpovdebu&)}}=" 1" CHAR{{OB_SPEC(adr_lanceur%,cpovfin&)}}=STR$(largeur_par_defaut&,5) CHAR{{OB_SPEC(adr_lanceur%,rpovdebu&)}}=" 1" CHAR{{OB_SPEC(adr_lanceur%,rpovfin&)}}=STR$(hauteur_par_defaut&,5) redraw_elem(adr_lanceur%,cpovdebu&) redraw_elem(adr_lanceur%,cpovfin&) redraw_elem(adr_lanceur%,rpovdebu&) redraw_elem(adr_lanceur%,rpovfin&) ' calcul_temps_evalue CASE povannul& objc_change(adr_lanceur%,objet&) fermeture_fenetre(26) CASE povok& objc_change(adr_lanceur%,objet&) mise_en_place_popup(chxpov23&) positionner_popup(26,objet&,adr_lanceur%,adr_popup_divers%,rx&,ry&) reponse&=@afficher_alerte(adr_pov_def%) largeur_par_defaut&=VAL(CHAR{{OB_SPEC(adr_lanceur%,povlarge&)}}) hauteur_par_defaut&=VAL(CHAR{{OB_SPEC(adr_lanceur%,povhaute&)}}) IF reponse&<>3 videsouris $S&,$S> SELECT reponse& CASE 1 fichier_lancement_pov3 fermeture_fenetre(26) lancer_pov_en_generation CASE 2 fichier_lancement_pov3 fermeture_fenetre(26) ENDSELECT ENDIF ENDSELECT RETURN > PROCEDURE gestion_parametres LOCAL i&,larg&,haut&,rx&,ry&,xr&,yr& LOCAL mem_img!,mem_fond!,mem_t!,li&,mem_fil!,mem_rap!,univ%,mem_marq| LOCAL nbp%,nbf%,adr_obje%,adr_face%,vect_norm%,pr_f& LOCAL jx&,jy&,jw&,jh& LOCAL xj&,yj&,wj&,hj& $S&,$S> SELECT objet& CASE chebou01& type_de_bouton|=0 changer_les_boutons CASE chebou02& type_de_bouton|=1 changer_les_boutons CASE chebou03& type_de_bouton|=2 changer_les_boutons CASE chebou04& type_de_bouton|=3 changer_les_boutons CASE chebou05& type_de_bouton|=4 changer_les_boutons CASE chebou06& type_de_bouton|=5 changer_les_boutons CASE chet2g& objc_change(adr_parametres%,objet&) parametrage_de_tos2gem CASE chedetai& saisie_d_une_composante(adr_parametres%,objet&,0,100,3,0) tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE tri_2d!=FALSE redessin_deja_fait!=FALSE redimention!=FALSE redraw_elem(adr_parametres%,objet&) CASE chemarq& objc_change(adr_parametres%,objet&) mem_marq|=marqueur| mise_en_place_popup(chxmarq&) positionner_popup(idx_parametrage_dbl&,objet&,adr_parametres%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,marq01&,marq02&,0) IF reponse&<>255 OB_SPEC(adr_parametres%,chemarq&)=OB_SPEC(adr_popup_divers%,ADD(marq01&,reponse&)) $S&,$S> SELECT reponse& CASE 0 marqueur|=1 CASE 1 marqueur|=2 CASE 2 marqueur|=3 CASE 3 marqueur|=5 ENDSELECT redraw_elem(adr_parametres%,chemarq&) IF mem_marq|<>marqueur| force_redess!=TRUE ENDIF ENDIF CASE def_x&,def_y&,def_z& saisie_d_une_composante(adr_parametres%,objet&,0.01,500,7,3) CASE consxpov& saisie_d_une_composante(adr_parametres%,objet&,0,999,3,0) CASE consypov& saisie_d_une_composante(adr_parametres%,objet&,0,999,3,0) CASE limites& saisie_d_une_composante(adr_parametres%,objet&,10,32767,5,0) li&=VAL(CHAR{{OB_SPEC(adr_parametres%,limites&)}}) IF MAX(@memoire_dispo(0),@memoire_dispo(1))<=@memoire_demandee(li&) ~@afficher_alerte(adr_memoire%) li&=@maximum_d_objet_possible CHAR{{OB_SPEC(adr_parametres%,limites&)}}=STR$(li&,5) ENDIF redraw_elem(adr_parametres%,limites&) CASE cheundo& saisie_d_une_composante(adr_parametres%,objet&,0,32767,5,0) max_undo&=VAL(CHAR{{OB_SPEC(adr_parametres%,cheundo&)}}) CASE tailgril& saisie_d_une_composante(adr_parametres%,objet&,2,500,3,0) pas_grille&=VAL(CHAR{{OB_SPEC(adr_parametres%,tailgril&)}}) CASE chetxt& CHAR{masque%}="*"+CHR$(0) definition_fichier(adr_parametres%,objet&,nom_mouvement%,TRUE,TRUE,OB_SPEC(adr_divers%,lin36&)) CHAR{{OB_SPEC(adr_parametres%,objet&)}}=CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%} redraw_elem(adr_parametres%,objet&) CASE chevis& CHAR{masque%}="*"+CHR$(0) definition_fichier(adr_parametres%,objet&,nom_mouvement%,TRUE,TRUE,OB_SPEC(adr_divers%,lin37&)) CHAR{{OB_SPEC(adr_parametres%,objet&)}}=CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%} redraw_elem(adr_parametres%,objet&) CASE cheebs& CHAR{masque%}="ebs"+CHR$(0) definition_fichier(adr_parametres%,objet&,nom_mouvement%,FALSE,TRUE,OB_SPEC(adr_divers%,lin9&)) CHAR{{OB_SPEC(adr_parametres%,objet&)}}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%} redraw_elem(adr_parametres%,objet&) CASE chepov& CHAR{masque%}="pov"+CHR$(0) definition_fichier(adr_parametres%,objet&,nom_mouvement%,FALSE,TRUE,OB_SPEC(adr_divers%,lin9&)) CHAR{{OB_SPEC(adr_parametres%,objet&)}}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%} redraw_elem(adr_parametres%,objet&) CASE cheimg& CHAR{masque%}="*"+CHR$(0) definition_fichier(adr_parametres%,objet&,nom_mouvement%,FALSE,TRUE,OB_SPEC(adr_divers%,lin9&)) CHAR{{OB_SPEC(adr_parametres%,objet&)}}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%} redraw_elem(adr_parametres%,objet&) CASE chettp& CHAR{masque%}="*"+CHR$(0) definition_fichier(adr_parametres%,objet&,nom_mouvement%,TRUE,TRUE,OB_SPEC(adr_divers%,lin10&)) CHAR{{OB_SPEC(adr_parametres%,objet&)}}=CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%} redraw_elem(adr_parametres%,objet&) CASE cheund& CHAR{masque%}="*"+CHR$(0) definition_fichier(adr_parametres%,objet&,nom_mouvement%,FALSE,TRUE,OB_SPEC(adr_divers%,lin11&)) CHAR{{OB_SPEC(adr_parametres%,objet&)}}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%} redraw_elem(adr_parametres%,objet&) CASE cheinc& CHAR{masque%}="inc"+CHR$(0) definition_fichier(adr_parametres%,objet&,nom_mouvement%,FALSE,TRUE,OB_SPEC(adr_divers%,lin7&)) CHAR{{OB_SPEC(adr_parametres%,objet&)}}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%} redraw_elem(adr_parametres%,objet&) CASE che3d2& CHAR{masque%}="*"+CHR$(0) definition_fichier(adr_parametres%,objet&,nom_mouvement%,FALSE,TRUE,OB_SPEC(adr_divers%,lin5&)) CHAR{{OB_SPEC(adr_parametres%,objet&)}}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%} redraw_elem(adr_parametres%,objet&) CASE cheext& CHAR{masque%}="*"+CHR$(0) definition_fichier(adr_parametres%,objet&,nom_mouvement%,FALSE,TRUE,OB_SPEC(adr_divers%,lin6&)) CHAR{{OB_SPEC(adr_parametres%,objet&)}}=CHAR{disque%}+CHAR{path%}+CHAR{nom_mouvement%} redraw_elem(adr_parametres%,objet&) CASE chediver& objc_change(adr_parametres%,objet&) positionner_popup(idx_parametrage_dbl&,objet&,adr_parametres%,adr_popup_parametres%,rx&,ry&) mem_rap!=dessin_rapide! mem_fil!=filaire_cache! mem_fond!=fond_gris! mem_img!=fond_img! ~@popup_parametre(rx&,ry&) IF mem_fond!<>fond_gris! IF WORD{{ADD(GB,4)}}<&H340 ! Si AES<3.40 IF maxcol&<15 environnement_mono ELSE environnement_coul ENDIF ELSE IF maxcol&<15 environnement_mono ENDIF ENDIF force_redess!=TRUE ENDIF IF mem_fil!<>filaire_cache! redimention!=FALSE force_redess!=TRUE ENDIF IF mem_rap!<>dessin_rapide! refaire_normales!=TRUE redimention!=FALSE force_redess!=TRUE ENDIF IF mem_img!<>fond_img! force_redess!=TRUE ENDIF CASE cheautre& objc_change(adr_parametres%,objet&) positionner_popup(idx_parametrage_dbl&,objet&,adr_parametres%,adr_chemin_include%,rx&,ry&) ~@popup_chemin_include(rx&,ry&) CASE chelangu& objc_change(adr_parametres%,objet&) CHAR{masque%}="*"+CHR$(0) definition_fichier(adr_parametres%,objet&,nom_mouvement%,FALSE,TRUE,OB_SPEC(adr_divers%,lin77&)) IF RIGHT$(CHAR{path%},1)="\" CHAR{path%}=LEFT$(CHAR{path%},PRED(LEN(CHAR{path%}))) ENDIF CHAR{nom_mouvement%}=MID$(CHAR{path%},SUCC(RINSTR(CHAR{path%},"\")),LEN(LEFT$(CHAR{path%},RINSTR(CHAR{path%},"\"))))+CHR$(0) CHAR{{OB_SPEC(adr_parametres%,SUB(chelangu&,2))}}=CHAR{nom_mouvement%} redraw_elem(adr_parametres%,chelangu&) CASE cheok& objc_change(adr_parametres%,objet&) IF refaire_normales! AND nombre_d_objets&>0 refaire_toutes_les_normales(0,PRED(nombre_d_objets&),TRUE,FALSE) ENDIF fermeture_fenetre(idx_parametrage_dbl&) sauver_parametres IF force_redess! redraw_force(idx_info&,idx_animation&) ENDIF CASE cheannul& objc_change(adr_parametres%,objet&) IF refaire_normales! AND nombre_d_objets&>0 refaire_toutes_les_normales(0,PRED(nombre_d_objets&),TRUE,FALSE) ENDIF fermeture_fenetre(idx_parametrage_dbl&) IF force_redess! redraw_force(idx_info&,idx_animation&) ENDIF CASE act_opengl& utilise_opengl!=NOT utilise_opengl! ob_state(adr_parametres%,act_opengl&,aes_selected&,utilise_opengl!) redraw_elem(adr_parametres%,objet&) videsouris ENDSELECT RETURN > PROCEDURE gestion_bicubics LOCAL i&,j&,univ%,adr_poi%,px,py,pz,pw,ph,pf LOCAL adr%,px1,py1,pz1,offi&,invi& $S&,$S> SELECT objet& CASE somx01&,somy01&,somz01&,somx02&,somy02&,somz02&,somx03&,somy03&,somz03&,somx04&,somy04&,somz04& saisie_d_une_composante(adr_bicubics%,objet&,-999999999,999999999,10,3) CASE somx05&,somy05&,somz05&,somx06&,somy06&,somz06&,somx07&,somy07&,somz07&,somx08&,somy08&,somz08& saisie_d_une_composante(adr_bicubics%,objet&,-999999999,999999999,10,3) CASE somx09&,somy09&,somz09&,somx10&,somy10&,somz10&,somx11&,somy11&,somz11&,somx12&,somy12&,somz12& saisie_d_une_composante(adr_bicubics%,objet&,-999999999,999999999,10,3) CASE somx13&,somy13&,somz13&,somx14&,somy14&,somz14&,somx15&,somy15&,somz15&,somx16&,somy16&,somz16& saisie_d_une_composante(adr_bicubics%,objet&,-999999999,999999999,10,3) CASE sou01& objc_change(adr_bicubics%,objet&) mise_en_place_popup(chxstep&) positionner_popup(34,objet&,adr_bicubics%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,step01&,step02&,0) IF reponse&<>255 CHAR{{OB_SPEC(adr_bicubics%,SUB(sou01&,2))}}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(step01&,reponse&))}} redraw_elem(adr_bicubics%,sou01&) ENDIF CASE niv01& objc_change(adr_bicubics%,objet&) mise_en_place_popup(chxflatn&) positionner_popup(34,objet&,adr_bicubics%,adr_popup_divers%,rx&,ry&) reponse&=@popup_general(rx&,ry&,adr_popup_divers%,flat01&,flat02&,0) IF reponse&<>255 CHAR{{OB_SPEC(adr_bicubics%,SUB(niv01&,2))}}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(flat01&,reponse&))}} redraw_elem(adr_bicubics%,niv01&) ENDIF CASE fraopt& IF optimisation! ob_state(adr_bicubics%,fraopt&,aes_selected&,FALSE) optimisation!=FALSE ELSE ob_state(adr_bicubics%,fraopt&,aes_selected&,TRUE) optimisation!=TRUE ENDIF redraw_elem(adr_bicubics%,fraopt&) videsouris CASE frczero& objc_change(adr_bicubics%,objet&) FOR i&=somx01& TO somz16& CHAR{{OB_SPEC(adr_bicubics%,i&)}}=STR$(0,10,3) redraw_elem(adr_bicubics%,i&) NEXT i& CASE frchori& objc_change(adr_bicubics%,objet&) CLR i& DO offi&=MUL(i&,3) px=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx01&,offi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx01&,offi&))}}=STR$(-px,10,3) px=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx05&,offi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx05&,offi&))}}=STR$(-px,10,3) px=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx09&,offi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx09&,offi&))}}=STR$(-px,10,3) px=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx13&,offi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx13&,offi&))}}=STR$(-px,10,3) redraw_elem(adr_bicubics%,ADD(somx01&,offi&)) redraw_elem(adr_bicubics%,ADD(somx05&,offi&)) redraw_elem(adr_bicubics%,ADD(somx09&,offi&)) redraw_elem(adr_bicubics%,ADD(somx13&,offi&)) INC i& LOOP WHILE i&<4 CASE frcvert& objc_change(adr_bicubics%,objet&) CLR i& DO offi&=MUL(i&,3) py=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy01&,offi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy01&,offi&))}}=STR$(-py,10,3) py=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy05&,offi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy05&,offi&))}}=STR$(-py,10,3) py=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy09&,offi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy09&,offi&))}}=STR$(-py,10,3) py=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy13&,offi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy13&,offi&))}}=STR$(-py,10,3) redraw_elem(adr_bicubics%,ADD(somy01&,offi&)) redraw_elem(adr_bicubics%,ADD(somy05&,offi&)) redraw_elem(adr_bicubics%,ADD(somy09&,offi&)) redraw_elem(adr_bicubics%,ADD(somy13&,offi&)) INC i& LOOP WHILE i&<4 CASE frcprof& objc_change(adr_bicubics%,objet&) CLR i& DO offi&=MUL(i&,3) pz=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz01&,offi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz01&,offi&))}}=STR$(-pz,10,3) pz=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz05&,offi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz05&,offi&))}}=STR$(-pz,10,3) pz=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz09&,offi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz09&,offi&))}}=STR$(-pz,10,3) pz=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz13&,offi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz13&,offi&))}}=STR$(-pz,10,3) redraw_elem(adr_bicubics%,ADD(somz01&,offi&)) redraw_elem(adr_bicubics%,ADD(somz05&,offi&)) redraw_elem(adr_bicubics%,ADD(somz09&,offi&)) redraw_elem(adr_bicubics%,ADD(somz13&,offi&)) INC i& LOOP WHILE i&<4 CASE invefrac& objc_change(adr_bicubics%,objet&) CLR i& DO offi&=MUL(i&,3) invi&=MUL(SUB(3,i&),3) ' px=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx01&,offi&))}}) py=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy01&,offi&))}}) pz=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz01&,offi&))}}) px1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx01&,invi&))}}) py1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy01&,invi&))}}) pz1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz01&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx01&,offi&))}}=STR$(px1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy01&,offi&))}}=STR$(py1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz01&,offi&))}}=STR$(pz1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx01&,invi&))}}=STR$(px,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy01&,invi&))}}=STR$(py,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz01&,invi&))}}=STR$(pz,10,3) ' px=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx05&,offi&))}}) py=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy05&,offi&))}}) pz=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz05&,offi&))}}) px1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx05&,invi&))}}) py1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy05&,invi&))}}) pz1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz05&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx05&,offi&))}}=STR$(px1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy05&,offi&))}}=STR$(py1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz05&,offi&))}}=STR$(pz1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx05&,invi&))}}=STR$(px,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy05&,invi&))}}=STR$(py,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz05&,invi&))}}=STR$(pz,10,3) ' px=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx09&,offi&))}}) py=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy09&,offi&))}}) pz=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz09&,offi&))}}) px1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx09&,invi&))}}) py1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy09&,invi&))}}) pz1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz09&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx09&,offi&))}}=STR$(px1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy09&,offi&))}}=STR$(py1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz09&,offi&))}}=STR$(pz1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx09&,invi&))}}=STR$(px,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy09&,invi&))}}=STR$(py,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz09&,invi&))}}=STR$(pz,10,3) ' px=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx13&,offi&))}}) py=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy13&,offi&))}}) pz=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz13&,offi&))}}) px1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx13&,invi&))}}) py1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy13&,invi&))}}) pz1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz13&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx13&,offi&))}}=STR$(px1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy13&,offi&))}}=STR$(py1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz13&,offi&))}}=STR$(pz1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx13&,invi&))}}=STR$(px,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy13&,invi&))}}=STR$(py,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz13&,invi&))}}=STR$(pz,10,3) ' redraw_elem(adr_bicubics%,ADD(somx01&,offi&)) redraw_elem(adr_bicubics%,ADD(somx01&,invi&)) redraw_elem(adr_bicubics%,ADD(somx05&,offi&)) redraw_elem(adr_bicubics%,ADD(somx05&,invi&)) redraw_elem(adr_bicubics%,ADD(somx09&,offi&)) redraw_elem(adr_bicubics%,ADD(somx09&,invi&)) redraw_elem(adr_bicubics%,ADD(somx13&,offi&)) redraw_elem(adr_bicubics%,ADD(somx13&,invi&)) ' INC i& LOOP WHILE i&<2 CASE senhori& objc_change(adr_bicubics%,objet&) CLR i& DO offi&=MUL(i&,3) invi&=MUL(SUB(3,i&),3) px=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx01&,offi&))}}) px1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx01&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx01&,offi&))}}=STR$(px1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx01&,invi&))}}=STR$(px,10,3) px=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx05&,offi&))}}) px1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx05&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx05&,offi&))}}=STR$(px1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx05&,invi&))}}=STR$(px,10,3) px=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx09&,offi&))}}) px1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx09&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx09&,offi&))}}=STR$(px1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx09&,invi&))}}=STR$(px,10,3) px=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx13&,offi&))}}) px1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx13&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx13&,offi&))}}=STR$(px1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx13&,invi&))}}=STR$(px,10,3) redraw_elem(adr_bicubics%,ADD(somx01&,offi&)) redraw_elem(adr_bicubics%,ADD(somx01&,invi&)) redraw_elem(adr_bicubics%,ADD(somx05&,offi&)) redraw_elem(adr_bicubics%,ADD(somx05&,invi&)) redraw_elem(adr_bicubics%,ADD(somx09&,offi&)) redraw_elem(adr_bicubics%,ADD(somx09&,invi&)) redraw_elem(adr_bicubics%,ADD(somx13&,offi&)) redraw_elem(adr_bicubics%,ADD(somx13&,invi&)) INC i& LOOP WHILE i&<2 CASE senvert& objc_change(adr_bicubics%,objet&) CLR i& DO offi&=MUL(i&,3) invi&=MUL(SUB(3,i&),3) py=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy01&,offi&))}}) py1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy01&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy01&,offi&))}}=STR$(py1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy01&,invi&))}}=STR$(py,10,3) py=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy05&,offi&))}}) py1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy05&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy05&,offi&))}}=STR$(py1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy05&,invi&))}}=STR$(py,10,3) py=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy09&,offi&))}}) py1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy09&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy09&,offi&))}}=STR$(py1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy09&,invi&))}}=STR$(py,10,3) py=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy13&,offi&))}}) py1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy13&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy13&,offi&))}}=STR$(py1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy13&,invi&))}}=STR$(py,10,3) redraw_elem(adr_bicubics%,ADD(somy01&,offi&)) redraw_elem(adr_bicubics%,ADD(somy01&,invi&)) redraw_elem(adr_bicubics%,ADD(somy05&,offi&)) redraw_elem(adr_bicubics%,ADD(somy05&,invi&)) redraw_elem(adr_bicubics%,ADD(somy09&,offi&)) redraw_elem(adr_bicubics%,ADD(somy09&,invi&)) redraw_elem(adr_bicubics%,ADD(somy13&,offi&)) redraw_elem(adr_bicubics%,ADD(somy13&,invi&)) INC i& LOOP WHILE i&<2 CASE senprof& objc_change(adr_bicubics%,objet&) CLR i& DO offi&=MUL(i&,3) invi&=MUL(SUB(3,i&),3) pz=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz01&,offi&))}}) pz1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz01&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz01&,offi&))}}=STR$(pz1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz01&,invi&))}}=STR$(pz,10,3) pz=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz05&,offi&))}}) pz1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz05&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz05&,offi&))}}=STR$(pz1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz05&,invi&))}}=STR$(pz,10,3) pz=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz09&,offi&))}}) pz1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz09&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz09&,offi&))}}=STR$(pz1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz09&,invi&))}}=STR$(pz,10,3) pz=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz13&,offi&))}}) pz1=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz13&,invi&))}}) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz13&,offi&))}}=STR$(pz1,10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz13&,invi&))}}=STR$(pz,10,3) redraw_elem(adr_bicubics%,ADD(somz01&,offi&)) redraw_elem(adr_bicubics%,ADD(somz01&,invi&)) redraw_elem(adr_bicubics%,ADD(somz05&,offi&)) redraw_elem(adr_bicubics%,ADD(somz05&,invi&)) redraw_elem(adr_bicubics%,ADD(somz09&,offi&)) redraw_elem(adr_bicubics%,ADD(somz09&,invi&)) redraw_elem(adr_bicubics%,ADD(somz13&,offi&)) redraw_elem(adr_bicubics%,ADD(somz13&,invi&)) INC i& LOOP WHILE i&<2 CASE fracha& objc_change(adr_bicubics%,objet&) charger_fichier_bic CASE frasau& objc_change(adr_bicubics%,objet&) sauver_fichier_bic FOR i&=somx01& TO somz16& CHAR{{OB_SPEC(adr_bicubics%,i&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_bicubics%,i&)}}),10,3) redraw_elem(adr_bicubics%,i&) NEXT i& CASE fraann& objc_change(adr_bicubics%,objet&) FOR i&=somx01& TO somz16& CHAR{{OB_SPEC(adr_bicubics%,i&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_bicubics%,i&)}}),10,3) NEXT i& modif_bez!=FALSE fermeture_fenetre(34) CASE fragen& objc_change(adr_bicubics%,objet&) generation_de_bicubic sauve!=FALSE fermeture_fenetre(34) travail_a_sauver!=TRUE redraw_force(idx_info&,idx_animation&) ENDSELECT RETURN > PROCEDURE gestion_image_auteur $S&,$S> SELECT objet& CASE fin_img& objc_change(adr_auteur%,objet&) fermeture_fenetre(36) ENDSELECT RETURN > PROCEDURE gestion_vue_fine LOCAL width%,height%,ret& LOCAL fx&,fy&,fw&,fh&,ww&,hh& ' $S&,$S> SELECT objet& CASE sauvphon& objc_change(adr_vue_fine%,objet&) ' IF plan_systeme&<15 n%=@prendre(512,FALSE,3) ! il faut pr‚venir que la sauvegarde CHAR{n%}="[3][" ! ne fonctionne qu'au dessus de 8 plans CHAR{n%}=CHAR{n%}+" Seulement avec plus de |" CHAR{n%}=CHAR{n%}+" 8 plans ! |" CHAR{n%}=CHAR{n%}+" Juste with more |" CHAR{n%}=CHAR{n%}+" 8 planes |" CHAR{n%}=CHAR{n%}+"][ D‚sol‚ | Sorry ]"+CHR$(0) ~@afficher_alerte(n%) libere(*n%) ELSE IF utilise_opengl! ' width%=OB_W(adr_vue_fine%,gourphon&) height%=OB_H(adr_vue_fine%,gourphon&) ' CHAR{masque%}="tga"+CHR$(0) CHAR{msq%}="tgk"+CHR$(0) definition_fichier(adr_parametres%,che3d2&,nom_divers%,FALSE,TRUE,OB_SPEC(adr_divers%,lin22&)) IF CHAR{nom_divers%}<>"" membfill(mem_che%,512,0) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) IF @s_exist(mem_che%) IF @afficher_alerte(adr_existe%)=1 backup(mem_che%) @screen_save_tga(mem_che%,buffer_tga_phong%,width%,height%,0) ENDIF ELSE @screen_save_tga(mem_che%,buffer_tga_phong%,width%,height%,0) ENDIF ENDIF ELSE sauver_image_tga_type_2 ENDIF ENDIF ' CASE gourphon& ' redimention!=FALSE dessin_gouraud_phong!=FALSE redraw_force(19,19) ' CASE sizephon& ' ~@wind_get(INT{ADD(hwind%,idx_vue_fine_dbl&)},wf_currxywh&,fx&,fy&,fw&,fh&) graf_rubberbox(fx&,fy&,177,133,ret&,ww&,hh&) objc_change(adr_vue_fine%,objet&) IF ww&<>fw& OR hh&<>fh& redimention!=FALSE dessin_gouraud_phong!=FALSE redimentionne_vue_fine(ww&,hh&) ' On s'envoie … soi-mˆme un message de mouvement INT{buf%}=wm_sized& ! Num‚ro du message INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur du message INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message ' Handle fenˆtre concern‚e INT{ADD(buf%,6)}=INT{ADD(hwind%,idx_vue_fine_dbl&)} INT{ADD(buf%,8)}=fx& ! Cordonn‚e zone redraw (fenˆtre) INT{ADD(buf%,10)}=fy& INT{ADD(buf%,12)}=ww& INT{ADD(buf%,14)}=hh& appl_write(ap_id&,16,buf%) ! Envoi du message ENDIF ' ENDSELECT RETURN > PROCEDURE gestion_temps_passe RETURN > PROCEDURE gestion_fenetre_de_vue LOCAL slide&,ret&,ww&,hh&,rx&,ry&,reponse&,nbr_pot& LOCAL pos%,fx&,fy&,fw&,fh& LOCAL univ%,heure|,minute|,seconde| LOCAL dep%,arr% IF global_mk&=2 OR click&=2 $S&,$S> SELECT objet& CASE fenvue19& ! FlŠche vers le haut objc_change(adr_fenetre%,objet&) IF dessin_3d|0 refaire_toutes_les_normales(0,PRED(nombre_d_objets&),TRUE,TRUE) redraw_force(idx_info&,idx_animation&) ENDIF CASE fenvue23& ! Mode vues multiples objc_change2(adr_fenetre%,objet&) changement_de_vue(12) ob_state(adr_fenetre%,fenvue23&,aes_selected&,trois_vue!) CASE fenvue24& ! Grille ON/OFF grille_vue!=NOT grille_vue! ob_state(adr_fenetre%,fenvue24&,aes_selected&,grille_vue!) videsouris IF grille_vue! deplacement_en_x&=MUL(DIV(deplacement_en_x&,pas_grille&),pas_grille&) deplacement_en_y&=MUL(DIV(deplacement_en_y&,pas_grille&),pas_grille&) deplacement_en_z&=MUL(DIV(deplacement_en_z&,pas_grille&),pas_grille&) tri_2d!=FALSE ENDIF redessin_deja_fait!=FALSE redraw_force(24,24) ENDSELECT ELSE $S&,$S> SELECT objet& CASE fenvue19& ! FlŠche vers le haut objc_change(adr_fenetre%,objet&) IF dessin_3d|0 refaire_toutes_les_normales(0,PRED(nombre_d_objets&),TRUE,TRUE) redraw_force(idx_info&,idx_animation&) ENDIF CASE fenvue12& ! L'ascenceur vertical IF dessin_3d|=vue_en_3d| objc_change(adr_fenetre%,objet&) ouvrir_camera ELSE retire_centrage deplace_curseur_vue_vertical objc_change2(adr_fenetre%,fenvue12&) ENDIF CASE fenvue17& ! L'ascenceur horizontal IF dessin_3d|=vue_en_3d| objc_change(adr_fenetre%,objet&) ouvrir_camera ELSE retire_centrage deplace_curseur_vue_horizontal objc_change2(adr_fenetre%,fenvue17&) ENDIF CASE fenvue23& ! Mode vues multiples objc_change2(adr_fenetre%,objet&) changement_de_vue(12) ob_state(adr_fenetre%,fenvue23&,aes_selected&,trois_vue!) CASE fenvue24& ! Grille ON/OFF grille_vue!=NOT grille_vue! ob_state(adr_fenetre%,fenvue24&,aes_selected&,grille_vue!) videsouris IF grille_vue! deplacement_en_x&=MUL(DIV(deplacement_en_x&,pas_grille&),pas_grille&) deplacement_en_y&=MUL(DIV(deplacement_en_y&,pas_grille&),pas_grille&) deplacement_en_z&=MUL(DIV(deplacement_en_z&,pas_grille&),pas_grille&) tri_2d!=FALSE ENDIF redessin_deja_fait!=FALSE redraw_force(24,24) CASE fenvue18& ! Changement de taille ~@wind_get(INT{ADD(hwind%,idx_vue_dbl&)},wf_currxywh&,fx&,fy&,fw&,fh&) graf_rubberbox(fx&,fy&,150,150,ret&,ww&,hh&) objc_change(adr_fenetre%,objet&) IF ww&<>fw& OR hh&<>fh& ' On s'envoie … soi-mˆme un message de mouvement INT{buf%}=wm_sized& ! Num‚ro du message INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur du message INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message ' Handle fenˆtre concern‚e INT{ADD(buf%,6)}=INT{ADD(hwind%,idx_vue_dbl&)} INT{ADD(buf%,8)}=fx& ! Cordonn‚e zone redraw (fenˆtre) INT{ADD(buf%,10)}=fy& INT{ADD(buf%,12)}=ww& INT{ADD(buf%,14)}=hh& appl_write(ap_id&,16,buf%) ! Envoi du message ENDIF ENDSELECT ENDIF RETURN > PROCEDURE gestion_des_calages LOCAL rx&,ry&,rz&,reponse& LOCAL univ% $S&,$S> SELECT objet& CASE numacale& objc_change(adr_calage%,objet&) positionner_popup(50,objet&,adr_calage%,adr_popup_autre0%,rx&,ry&) debut_popup_choix&=PRED(VAL(CHAR{{OB_SPEC(adr_calage%,SUB(numacale&,2))}})) IF nombre_d_objets&>9 debut_popup_choix&=-debut_popup_choix&*(debut_popup_choix&=>0 AND debut_popup_choix&<=SUB(nombre_d_objets&,10))+0*(debut_popup_choix&<0)-SUB(nombre_d_objets&,10)*(debut_popup_choix&>SUB(nombre_d_objets&,10)) ELSE CLR debut_popup_choix& ENDIF reponse&=@popup_de_choix(rx&,ry&,0) IF reponse&<>-1 CHAR{{OB_SPEC(adr_calage%,SUB(numacale&,2))}}=STR$(SUCC(reponse&),4) univ%=@adresse_objet(reponse&) BYTE{ADD(ADD(univ%,offset_nom_objet&),21)}=0 CHAR{{OB_SPEC(adr_calage%,nomacale&)}}=LEFT$(CHAR{ADD(univ%,offset_nom_objet&)}+SPACE$(21),21) redraw_elem(adr_calage%,numacale&) redraw_elem(adr_calage%,nomacale&) ENDIF CASE numrefe& IF NOT BTST(OB_STATE(adr_calage%,objet&),aes_selected&) positionner_popup(50,objet&,adr_calage%,adr_popup_autre0%,rx&,ry&) debut_popup_choix&=PRED(VAL(CHAR{{OB_SPEC(adr_calage%,SUB(numrefe&,2))}})) IF nombre_d_objets&>9 debut_popup_choix&=-debut_popup_choix&*(debut_popup_choix&=>0 AND debut_popup_choix&<=SUB(nombre_d_objets&,10))+0*(debut_popup_choix&<0)-SUB(nombre_d_objets&,10)*(debut_popup_choix&>SUB(nombre_d_objets&,10)) ELSE CLR debut_popup_choix& ENDIF reponse&=@popup_de_choix(rx&,ry&,0) IF reponse&<>-1 CHAR{{OB_SPEC(adr_calage%,SUB(numrefe&,2))}}=STR$(SUCC(reponse&),4) ENDIF ob_state(adr_calage%,numrefe&,aes_selected&,TRUE) redraw_elem(adr_calage%,numrefe&) ELSE ob_state(adr_calage%,numrefe&,aes_selected&,TRUE) ob_state(adr_calage%,camerefe&,aes_selected&,FALSE) ob_state(adr_calage%,poinrefe&,aes_selected&,FALSE) ob_state(adr_calage%,viserefe&,aes_selected&,FALSE) ob_state(adr_calage%,refex1&,aes_disable&,FALSE) ob_state(adr_calage%,refex2&,aes_disable&,FALSE) ob_state(adr_calage%,refex3&,aes_disable&,FALSE) ob_state(adr_calage%,refey1&,aes_disable&,FALSE) ob_state(adr_calage%,refey2&,aes_disable&,FALSE) ob_state(adr_calage%,refey3&,aes_disable&,FALSE) ob_state(adr_calage%,refez1&,aes_disable&,FALSE) ob_state(adr_calage%,refez2&,aes_disable&,FALSE) ob_state(adr_calage%,refez3&,aes_disable&,FALSE) ob_state(adr_calage%,refx&,aes_disable&,TRUE) ob_state(adr_calage%,refy&,aes_disable&,TRUE) ob_state(adr_calage%,refz&,aes_disable&,TRUE) redraw_elem(adr_calage%,sousrefe&) redraw_elem(adr_calage%,numrefe&) redraw_elem(adr_calage%,camerefe&) redraw_elem(adr_calage%,poinrefe&) redraw_elem(adr_calage%,viserefe&) ENDIF CASE camerefe& objc_change(adr_calage%,objet&) ob_state(adr_calage%,numrefe&,aes_selected&,FALSE) ob_state(adr_calage%,camerefe&,aes_selected&,TRUE) ob_state(adr_calage%,poinrefe&,aes_selected&,FALSE) ob_state(adr_calage%,viserefe&,aes_selected&,FALSE) ob_state(adr_calage%,refex1&,aes_disable&,TRUE) ob_state(adr_calage%,refex2&,aes_disable&,TRUE) ob_state(adr_calage%,refex3&,aes_disable&,TRUE) ob_state(adr_calage%,refey1&,aes_disable&,TRUE) ob_state(adr_calage%,refey2&,aes_disable&,TRUE) ob_state(adr_calage%,refey3&,aes_disable&,TRUE) ob_state(adr_calage%,refez1&,aes_disable&,TRUE) ob_state(adr_calage%,refez2&,aes_disable&,TRUE) ob_state(adr_calage%,refez3&,aes_disable&,TRUE) ob_state(adr_calage%,refx&,aes_disable&,TRUE) ob_state(adr_calage%,refy&,aes_disable&,TRUE) ob_state(adr_calage%,refz&,aes_disable&,TRUE) IF vue_subjective!=TRUE CHAR{{OB_SPEC(adr_calage%,refx&)}}=STR$(ROUND(SINGLE{mem_subj%},3),10,3) CHAR{{OB_SPEC(adr_calage%,refy&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,4)},3),10,3) CHAR{{OB_SPEC(adr_calage%,refz&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,8)},3),10,3) ELSE CHAR{{OB_SPEC(adr_calage%,refx&)}}=STR$(ROUND(SINGLE{camera%},3),10,3) CHAR{{OB_SPEC(adr_calage%,refy&)}}=STR$(ROUND(SINGLE{ADD(camera%,4)},3),10,3) CHAR{{OB_SPEC(adr_calage%,refz&)}}=STR$(ROUND(SINGLE{ADD(camera%,8)},3),10,3) ENDIF redraw_elem(adr_calage%,sousrefe&) redraw_elem(adr_calage%,numrefe&) redraw_elem(adr_calage%,camerefe&) redraw_elem(adr_calage%,poinrefe&) redraw_elem(adr_calage%,viserefe&) CASE poinrefe& ob_state(adr_calage%,numrefe&,aes_selected&,FALSE) ob_state(adr_calage%,camerefe&,aes_selected&,FALSE) ob_state(adr_calage%,poinrefe&,aes_selected&,TRUE) ob_state(adr_calage%,viserefe&,aes_selected&,FALSE) ob_state(adr_calage%,refex1&,aes_disable&,TRUE) ob_state(adr_calage%,refex2&,aes_disable&,TRUE) ob_state(adr_calage%,refex3&,aes_disable&,TRUE) ob_state(adr_calage%,refey1&,aes_disable&,TRUE) ob_state(adr_calage%,refey2&,aes_disable&,TRUE) ob_state(adr_calage%,refey3&,aes_disable&,TRUE) ob_state(adr_calage%,refez1&,aes_disable&,TRUE) ob_state(adr_calage%,refez2&,aes_disable&,TRUE) ob_state(adr_calage%,refez3&,aes_disable&,TRUE) ob_state(adr_calage%,refx&,aes_disable&,FALSE) ob_state(adr_calage%,refy&,aes_disable&,FALSE) ob_state(adr_calage%,refz&,aes_disable&,FALSE) redraw_elem(adr_calage%,sousrefe&) redraw_elem(adr_calage%,numrefe&) redraw_elem(adr_calage%,camerefe&) redraw_elem(adr_calage%,poinrefe&) redraw_elem(adr_calage%,viserefe&) CASE viserefe& ob_state(adr_calage%,numrefe&,aes_selected&,FALSE) ob_state(adr_calage%,camerefe&,aes_selected&,FALSE) ob_state(adr_calage%,poinrefe&,aes_selected&,FALSE) ob_state(adr_calage%,viserefe&,aes_selected&,TRUE) ob_state(adr_calage%,refex1&,aes_disable&,TRUE) ob_state(adr_calage%,refex2&,aes_disable&,TRUE) ob_state(adr_calage%,refex3&,aes_disable&,TRUE) ob_state(adr_calage%,refey1&,aes_disable&,TRUE) ob_state(adr_calage%,refey2&,aes_disable&,TRUE) ob_state(adr_calage%,refey3&,aes_disable&,TRUE) ob_state(adr_calage%,refez1&,aes_disable&,TRUE) ob_state(adr_calage%,refez2&,aes_disable&,TRUE) ob_state(adr_calage%,refez3&,aes_disable&,TRUE) ob_state(adr_calage%,refx&,aes_disable&,TRUE) ob_state(adr_calage%,refy&,aes_disable&,TRUE) ob_state(adr_calage%,refz&,aes_disable&,TRUE) IF vue_subjective!=TRUE CHAR{{OB_SPEC(adr_calage%,refx&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,12)},3),10,3) CHAR{{OB_SPEC(adr_calage%,refy&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,16)},3),10,3) CHAR{{OB_SPEC(adr_calage%,refz&)}}=STR$(ROUND(SINGLE{ADD(mem_subj%,20)},3),10,3) ELSE CHAR{{OB_SPEC(adr_calage%,refx&)}}=STR$(ROUND(SINGLE{ADD(camera%,12)},3),10,3) CHAR{{OB_SPEC(adr_calage%,refy&)}}=STR$(ROUND(SINGLE{ADD(camera%,16)},3),10,3) CHAR{{OB_SPEC(adr_calage%,refz&)}}=STR$(ROUND(SINGLE{ADD(camera%,20)},3),10,3) ENDIF redraw_elem(adr_calage%,sousrefe&) redraw_elem(adr_calage%,numrefe&) redraw_elem(adr_calage%,camerefe&) redraw_elem(adr_calage%,poinrefe&) redraw_elem(adr_calage%,viserefe&) CASE refx&,refy&,refz& saisie_d_une_composante(adr_calage%,objet&,-32768,32767,10,3) CASE ancalage& objc_change(adr_calage%,objet&) fermeture_fenetre(50) CASE okcalage& objc_change(adr_calage%,objet&) effectuer_le_calage fermeture_fenetre(50) travail_a_sauver!=TRUE ENDSELECT RETURN > PROCEDURE gestion_info_objet RETURN > PROCEDURE gestion_quartic LOCAL i& $S&,$S> SELECT objet& CASE nomquart& saisie_d_une_ligne(adr_quartic%,objet&,okquarti&,0,0,22,0) objc_change(adr_quartic%,nomquart&) CASE valquar0& TO valquar1& saisie_d_une_composante(adr_quartic%,objet&,-9999.999,99999.999,9,3) CASE charquar& objc_change(adr_quartic%,objet&) charger_fichier_qut_qud(adr_quartic%,valquar0&,valquar1&,nomquart&) CASE sauvquar& objc_change(adr_quartic%,objet&) sauver_fichier_qut_qud(adr_quartic%,valquar0&,valquar1&,nomquart&) CASE annquart& objc_change(adr_quartic%,objet&) FOR i&=valquar0& TO valquar1& CHAR{{OB_SPEC(adr_quartic%,i&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_quartic%,i&)}}),9,3) redraw_elem(adr_quartic%,i&) NEXT i& fermeture_fenetre(54) CASE okquarti& objc_change(adr_quartic%,objet&) sauve!=FALSE FOR i&=valquar0& TO valquar1& CHAR{{OB_SPEC(adr_quartic%,i&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_quartic%,i&)}}),9,3) redraw_elem(adr_quartic%,i&) NEXT i& fermeture_fenetre(54) travail_a_sauver!=TRUE creation_quartic ENDSELECT RETURN > PROCEDURE gestion_quadric LOCAL i& $S&,$S> SELECT objet& CASE nomquadr& saisie_d_une_ligne(adr_quadric%,objet&,okquadri&,0,0,22,0) objc_change(adr_quadric%,nomquadr&) CASE valquad0& TO valquad1& saisie_d_une_composante(adr_quadric%,objet&,-9999.999,99999.999,9,3) CASE charquad& objc_change(adr_quadric%,objet&) charger_fichier_qut_qud(adr_quadric%,valquad0&,valquad1&,nomquadr&) CASE sauvquad& objc_change(adr_quadric%,objet&) sauver_fichier_qut_qud(adr_quadric%,valquad0&,valquad1&,nomquadr&) CASE annquadr& objc_change(adr_quadric%,objet&) FOR i&=valquad0& TO valquad1& CHAR{{OB_SPEC(adr_quadric%,i&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_quadric%,i&)}}),9,3) redraw_elem(adr_quadric%,i&) NEXT i& fermeture_fenetre(56) CASE okquadri& objc_change(adr_quadric%,objet&) sauve!=FALSE FOR i&=valquad0& TO valquad1& CHAR{{OB_SPEC(adr_quadric%,i&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_quadric%,i&)}}),9,3) redraw_elem(adr_quadric%,i&) NEXT i& fermeture_fenetre(56) travail_a_sauver!=TRUE creation_quadric ENDSELECT RETURN > PROCEDURE gestion_bibliotheque $S&,$S> SELECT objet& CASE ajoubib& objc_change(adr_bibliotheque%,objet&) CASE charbibl& objc_change(adr_bibliotheque%,objet&) CASE sauvbibl& objc_change(adr_bibliotheque%,objet&) CASE effabibl& objc_change(adr_bibliotheque%,objet&) CASE debubibl& objc_change(adr_bibliotheque%,objet&) CASE moinbibl& objc_change(adr_bibliotheque%,objet&) CASE plusbibl& objc_change(adr_bibliotheque%,objet&) CASE finbibl& objc_change(adr_bibliotheque%,objet&) CASE bfilsbib& IF total_bibliotheque&>0 deplace_curseur_horizontal(adr_bibliotheque%,perebibl&,filsbibl&) ENDIF objc_change(adr_bibliotheque%,objet&) ENDSELECT RETURN > PROCEDURE gestion_hierarchie LOCAL fx&,fy&,fw&,fh&,ret&,ww&,hh&,csgcpt% LOCAL zox&,zoy&,zow&,zoh&,z_h%,cd&,ancobac& LOCAL memx&,memy&,memw&,memh&,suite! ' objc_offset(adr_hierarchie%,hie_sous&,zox&,zoy&) zow&=OB_W(adr_hierarchie%,hie_sous&) zoh&=OB_H(adr_hierarchie%,hie_sous&) objc_offset(adr_hierarchie%,0,memx&,memy&) memw&=OB_W(adr_hierarchie%,0) memh&=OB_H(adr_hierarchie%,0) $S&,$S> SELECT objet& CASE hie_sous& cd&=global_mk& z_h%=ADD(zone_hierarchie%,MUL(@clique_dans_hierarchie,30)) $S&,$S< SELECT INT{z_h%} CASE 1 ! Nom de la scŠne ' A voir, un popup pour sauver, charger ou renommer CASE 2 ! Cam‚ra ouvrir_camera CASE 3 ! Les sources de lumiŠres source_active&=CARD{ADD(z_h%,28)} membfill(mem_src%,taille_source&,0) bmove(@adresse_source(source_active&),mem_src%,taille_source&) IF couleur_hierarchie! couleur_en_cours%=ADD(mem_src%,2) ' membfill(mem_num%,6,0) ' CARD{mem_num%}=CARD{ADD(mem_src%,2)} ' BYTE{ADD(mem_num%,2)}=BYTE{ADD(mem_src%,4)} ' BYTE{ADD(mem_num%,3)}=BYTE{ADD(mem_src%,5)} ' BYTE{ADD(mem_num%,4)}=BYTE{ADD(mem_src%,6)} ' BYTE{ADD(mem_num%,5)}=0 ouvrir_couleurs_predefinies ' IF @ouvrir_couleurs_predefinies(mem_num%) ' CARD{ADD(mem_src%,2)}=CARD{mem_num%} ' BYTE{ADD(mem_src%,4)}=BYTE{ADD(mem_num%,2)} ' BYTE{ADD(mem_src%,5)}=BYTE{ADD(mem_num%,3)} ' BYTE{ADD(mem_src%,6)}=BYTE{ADD(mem_num%,4)} ' bmove(mem_src%,@adresse_source(source_active&),taille_source&) ' ENDIF objc_draw(adr_hierarchie%,0,12,zox&,zoy&,zow&,zoh&,-1) redessin_hierarchie(FALSE) ELSE ouvrir_lumieres ENDIF CASE 4,6,7 ! Les objets et C.S.G ancobac&=objet_actif& objet_actif&=CARD{ADD(z_h%,28)} suite!=TRUE IF masque_hierarchie! IF INT{ADD(@adresse_objet(objet_actif&),offset_relation_csg&)}=-1 BYTE{ADD(@adresse_objet(objet_actif&),offset_drapeau0&)}=BCHG(BYTE{ADD(@adresse_objet(objet_actif&),offset_drapeau0&)},bit_masque|) hierachie_ok!=FALSE analyse_scene suite!=FALSE tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE tri_2d!=FALSE objc_draw(adr_hierarchie%,0,12,zox&,zoy&,zow&,zoh&,-1) redessin_hierarchie(FALSE) ENDIF ENDIF IF ferme_ouvre_hierarchie! AND suite! IF BYTE{ADD(csg_ouverte%,objet_actif&)}=0 BYTE{ADD(csg_ouverte%,objet_actif&)}=1 ! Fermer ELSE BYTE{ADD(csg_ouverte%,objet_actif&)}=0 ! Ouvrir ENDIF hierachie_ok!=FALSE analyse_scene ferme_ouvre_hierarchie!=FALSE ~@wind_get(INT{ADD(hwind%,idx_hierarchie_dbl&)},wf_currxywh&,x&,y&,w&,h&) ww&=OB_W(adr_hierarchie%,hie_sous&) hh&=OB_H(adr_hierarchie%,hie_sous&) IF ww&>largeur_hierarchie% ww&=largeur_hierarchie% ENDIF IF hh&>hauteur_hierarchie% hh&=hauteur_hierarchie% ENDIF OB_W(adr_hierarchie%,hie_sous&)=ww& OB_H(adr_hierarchie%,hie_sous&)=hh& mise_a_la_taille_hierarchie ascenceurs_hierarchie etat_bouton_hierarchie_vertical(FALSE) etat_bouton_hierarchie_horizontal(FALSE) w&=OB_W(adr_hierarchie%,0) h&=OB_H(adr_hierarchie%,0) wind_set(INT{ADD(hwind%,idx_hierarchie_dbl&)},wf_currxywh&,x&,y&,w&,h&) redraw_force(idx_hierarchie&,idx_hierarchie&) ELSE IF suite! IF couleur_hierarchie! mise_en_place_popup(chxcoul&) positionner_popup(-4,objet&,adr_hierarchie%,adr_popup_divers%,rx&,ry&) ret&=@popup_general(rx&,ry&,adr_popup_divers%,coul0&,coul15&,0) a_cou&=INT{ADD(@adresse_objet(objet_actif&),offset_couleur&)} IF ret&<>255 AND ret&<>a_cou& INT{ADD(@adresse_objet(objet_actif&),offset_couleur&)}=ret& tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE tri_2d!=FALSE ENDIF objc_draw(adr_hierarchie%,0,12,zox&,zoy&,zow&,zoh&,-1) redessin_hierarchie(FALSE) ELSE IF calque_hierarchie! mise_en_place_popup(chxcalqu&) positionner_popup(-4,objet&,adr_hierarchie%,adr_popup_divers%,rx&,ry&) ret&=@popup_general(rx&,ry&,adr_popup_divers%,numani01&,numani10&,0) a_calq|=BYTE{ADD(@adresse_objet(objet_actif&),offset_calque&)} IF ret&<>255 AND a_calq|<>ret& BYTE{ADD(@adresse_objet(objet_actif&),offset_calque&)}=ret& tri_3d!=FALSE trace_3d_plein!=FALSE tri_fi!=FALSE tri_2d!=FALSE ENDIF objc_draw(adr_hierarchie%,0,12,zox&,zoy&,zow&,zoh&,-1) redessin_hierarchie(FALSE) ELSE IF cd&=1 ! Clique gauche, appel directe ouvrir_modification ELSE videsouris ' IF normal_camera! ' fermeture_fenetre(44) ' normal_camera!=FALSE ' mettre_a_jour_les_redraws(global_xb&,global_yb&,global_wb&,global_hb&,-1) ' ENDIF IF nombre_d_objets&>0 mise_en_place_popup(chxhalde&) positionner_popup(-4,objet&,adr_hierarchie%,adr_popup_divers%,rx&,ry&) ret&=@popup_general(rx&,ry&,adr_popup_divers%,haldes01&,haldes02&,0) IF ret&<>255 $S&,$S> SELECT ret& CASE 0 lancement_gestion_texture ' ouvrir_textures CASE 1 lancement_gestion_texture ' ouvrir_pigment CASE 2 lancement_gestion_texture ' ouvrir_normal CASE 3 lancement_gestion_texture ' ouvrir_finish CASE 4 lancement_gestion_texture ' ouvrir_interior CASE 5 lancement_gestion_texture ' ouvrir_atmosphere ENDSELECT ENDIF IF ancobac&<>objet_actif& objc_draw(adr_hierarchie%,0,12,zox&,zoy&,zow&,zoh&,-1) redessin_hierarchie(FALSE) ENDIF ELSE lancement_gestion_texture ' ouvrir_atmosphere ENDIF ENDIF ENDIF ENDIF ENDSELECT CASE hie_fon& objc_change(adr_hierarchie%,objet&) INC taille_vue_hierarchie| taille_vue_hierarchie|=0*(taille_vue_hierarchie|>2)-taille_vue_hierarchie|*(taille_vue_hierarchie|<3) hierachie_ok!=FALSE analyse_scene IF (OB_W(adr_hierarchie%,hie_sous&)>largeur_hierarchie%) OR (OB_H(adr_hierarchie%,hie_sous&)>hauteur_hierarchie%) OB_W(adr_hierarchie%,hie_sous&)=largeur_hierarchie% OB_H(adr_hierarchie%,hie_sous&)=hauteur_hierarchie% mise_a_la_taille_hierarchie ~@wind_get(INT{ADD(hwind%,idx_hierarchie_dbl&)},wf_currxywh&,x&,y&,w&,h&) w&=OB_W(adr_hierarchie%,0) h&=OB_H(adr_hierarchie%,0) wind_set(INT{ADD(hwind%,idx_hierarchie_dbl&)},wf_currxywh&,x&,y&,w&,h&) ENDIF CLR posx_hierarchie%,posy_hierarchie% ascenceurs_hierarchie etat_bouton_hierarchie_vertical(FALSE) etat_bouton_hierarchie_horizontal(FALSE) redraw_force(idx_hierarchie&,idx_hierarchie&) CASE hiefilv2& ! Le curseur vertical deplace_curseur_vertical_hierarchie(hieascv1&,hiefilv2&) ob_state(adr_hierarchie%,hiefilv2&,aes_selected&,FALSE) redraw_elem(adr_hierarchie%,hieascv0&) CASE hieascv1& ! L'ascenceur vertical ' objc_change(adr_hierarchie%,objet&) ' CASE hiehauto& ! Remonte tout IF NOT BTST(OB_STATE(adr_hierarchie%,hiehauto&),aes_disable&) objc_change(adr_hierarchie%,objet&) redraw_elem(adr_hierarchie%,hie_sous&) CLR posy_hierarchie% ascenceurs_hierarchie etat_bouton_hierarchie_vertical(FALSE) redessin_hierarchie(FALSE) redraw_elem(adr_hierarchie%,hieascv0&) ENDIF CASE hiehaut& ! Remonte d'une ligne IF NOT BTST(OB_STATE(adr_hierarchie%,hiehaut&),aes_disable&) objc_change(adr_hierarchie%,objet&) redraw_elem(adr_hierarchie%,hie_sous&) SUB posy_hierarchie%,hcar& IF posy_hierarchie%<0 CLR posy_hierarchie% ENDIF ascenceurs_hierarchie etat_bouton_hierarchie_vertical(FALSE) redessin_hierarchie(FALSE) redraw_elem(adr_hierarchie%,hieascv0&) ENDIF CASE hiebas& ! Descent d'une ligne IF NOT BTST(OB_STATE(adr_hierarchie%,hiebas&),aes_disable&) objc_change(adr_hierarchie%,objet&) redraw_elem(adr_hierarchie%,hie_sous&) ADD posy_hierarchie%,hcar& IF posy_hierarchie%>SUB(hauteur_hierarchie%,OB_H(adr_hierarchie%,hie_sous&)) posy_hierarchie%=SUB(hauteur_hierarchie%,OB_H(adr_hierarchie%,hie_sous&)) ENDIF ascenceurs_hierarchie etat_bouton_hierarchie_vertical(FALSE) redessin_hierarchie(FALSE) redraw_elem(adr_hierarchie%,hieascv0&) ENDIF CASE hiebasto& ! Descent tout en bas IF NOT BTST(OB_STATE(adr_hierarchie%,hiebasto&),aes_disable&) objc_change(adr_hierarchie%,objet&) redraw_elem(adr_hierarchie%,hie_sous&) posy_hierarchie%=SUB(hauteur_hierarchie%,OB_H(adr_hierarchie%,hie_sous&)) ascenceurs_hierarchie etat_bouton_hierarchie_vertical(FALSE) redessin_hierarchie(FALSE) redraw_elem(adr_hierarchie%,hieascv0&) ENDIF CASE hiefilh2& ! Le curseur horizontal deplace_curseur_horizontal_hierarchie(hieasch1&,hiefilh2&) ob_state(adr_hierarchie%,hiefilh2&,aes_selected&,FALSE) redraw_elem(adr_hierarchie%,hieasch0&) CASE hieasch1& ! L'ascenceur horizontal ' objc_change(adr_hierarchie%,objet&) ' CASE hiegauto& ! Tout … gauche IF NOT BTST(OB_STATE(adr_hierarchie%,hiegauto&),aes_disable&) objc_change(adr_hierarchie%,objet&) redraw_elem(adr_hierarchie%,hie_sous&) CLR posx_hierarchie% ascenceurs_hierarchie etat_bouton_hierarchie_horizontal(FALSE) redessin_hierarchie(FALSE) redraw_elem(adr_hierarchie%,hieasch0&) ENDIF CASE hiegauch& ! A gauche d'une colonne IF NOT BTST(OB_STATE(adr_hierarchie%,hiegauch&),aes_disable&) objc_change(adr_hierarchie%,objet&) redraw_elem(adr_hierarchie%,hie_sous&) SUB posx_hierarchie%,wcar& IF posx_hierarchie%<0 CLR posx_hierarchie% ENDIF ascenceurs_hierarchie etat_bouton_hierarchie_horizontal(FALSE) redessin_hierarchie(FALSE) redraw_elem(adr_hierarchie%,hieasch0&) ENDIF CASE hiedroit& ! A droite d'une colonne IF NOT BTST(OB_STATE(adr_hierarchie%,hiedroit&),aes_disable&) objc_change(adr_hierarchie%,objet&) redraw_elem(adr_hierarchie%,hie_sous&) ADD posx_hierarchie%,wcar& IF posx_hierarchie%>SUB(largeur_hierarchie%,OB_W(adr_hierarchie%,hie_sous&)) posx_hierarchie%=SUB(largeur_hierarchie%,OB_W(adr_hierarchie%,hie_sous&)) ENDIF ascenceurs_hierarchie etat_bouton_hierarchie_horizontal(FALSE) redessin_hierarchie(FALSE) redraw_elem(adr_hierarchie%,hieasch0&) ENDIF CASE hiedroto& ! Tout … droite IF NOT BTST(OB_STATE(adr_hierarchie%,hiedroto&),aes_disable&) objc_change(adr_hierarchie%,objet&) redraw_elem(adr_hierarchie%,hie_sous&) posx_hierarchie%=SUB(largeur_hierarchie%,OB_W(adr_hierarchie%,hie_sous&)) ascenceurs_hierarchie etat_bouton_hierarchie_horizontal(FALSE) redessin_hierarchie(FALSE) redraw_elem(adr_hierarchie%,hieasch0&) ENDIF CASE hie_size& ! Changement de taille ~@wind_get(INT{ADD(hwind%,idx_hierarchie_dbl&)},wf_currxywh&,fx&,fy&,fw&,fh&) graf_rubberbox(fx&,fy&,150,150,ret&,ww&,hh&) objc_change(adr_hierarchie%,objet&) IF ww&<>fw& OR hh&<>fh& ' ww&=SUB(SUB(ww&,OB_W(adr_hierarchie%,hie_size&)),2) hh&=SUB(SUB(SUB(hh&,OB_Y(adr_hierarchie%,hie_sous&)),OB_H(adr_hierarchie%,hie_size&)),2) IF ww&>largeur_hierarchie% ww&=largeur_hierarchie% ENDIF IF hh&>hauteur_hierarchie% hh&=hauteur_hierarchie% ENDIF OB_W(adr_hierarchie%,hie_sous&)=ww& OB_H(adr_hierarchie%,hie_sous&)=hh& mise_a_la_taille_hierarchie ascenceurs_hierarchie etat_bouton_hierarchie_vertical(FALSE) etat_bouton_hierarchie_horizontal(FALSE) ' ' On s'envoie … soi-mˆme un message de mouvement INT{buf%}=wm_sized& ! Num‚ro du message INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur du message INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message ' Handle fenˆtre concern‚e INT{ADD(buf%,6)}=INT{ADD(hwind%,idx_hierarchie_dbl&)} INT{ADD(buf%,8)}=fx& ! Cordonn‚e zone redraw (fenˆtre) INT{ADD(buf%,10)}=fy& INT{ADD(buf%,12)}=OB_W(adr_hierarchie%,0) INT{ADD(buf%,14)}=OB_H(adr_hierarchie%,0) appl_write(ap_id&,16,buf%) ! Envoi du message ENDIF ENDSELECT RETURN > PROCEDURE gestion_animation LOCAL fx&,fy&,fw&,fh& LOCAL ret&,ww&,hh& $S&,$S> SELECT objet& CASE anime012&,anime013&,anime014&,anime015&,anime016&,anime017&,anime018&,anime019& objc_change(adr_animation%,objet&) CASE anime003& deplace_curseur_animation ' objc_change2(adr_animation%,anime003&) objc_change(adr_animation%,objet&) CASE anime010& ~@wind_get(INT{ADD(hwind%,idx_animation_dbl&)},wf_currxywh&,fx&,fy&,fw&,fh&) graf_rubberbox(fx&,fy&,40,100,ret&,ww&,hh&) objc_change(adr_animation%,objet&) IF ww&<>fw& OR hh&<>fh& ' On s'envoie … soi-mˆme un message de mouvement INT{buf%}=wm_sized& ! Num‚ro du message INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur du message INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message ' Handle fenˆtre concern‚e INT{ADD(buf%,6)}=INT{ADD(hwind%,idx_animation_dbl&)} INT{ADD(buf%,8)}=fx& ! Cordonn‚e zone redraw (fenˆtre) INT{ADD(buf%,10)}=fy& INT{ADD(buf%,12)}=ww& INT{ADD(buf%,14)}=hh& appl_write(ap_id&,16,buf%) ! Envoi du message ENDIF ENDSELECT RETURN ' ****************************************************************************** > PROCEDURE redimentionne_vue_fine(VAR ww&,hh&) LOCAL lar_gou&,hau_gou&,taille_zone%,largeur1%,largeur2%,taille_z_buf%,tail% LOCAL taille_totale%,adresse%,n& ' SUB ww&,17 ! Largeur de la zone de redessin ' ' ww&=MUL(DIV(ww&,64),64) ! Sur multiple de 64 pour éviter les problèmes ' hh&=MUL(DIV(ww&,64),48) ! Sur multiple de 48 en rapport avec le 64 pour ' ! avoir un rapport de 1.33 ' ADD ww&,17 ! Largeur de la fenetre ADD hh&,33 ! Hauteur de la fenetre ' OB_W(adr_vue_fine%,0)=ww& ! La boite du fond OB_H(adr_vue_fine%,0)=hh& ' OB_W(adr_vue_fine%,1)=PRED(ww&) ! et son effet 3D OB_H(adr_vue_fine%,1)=PRED(hh&) ' OB_W(adr_vue_fine%,gourphon&)=SUB(ww&,17) ! La zone de redessin OB_H(adr_vue_fine%,gourphon&)=SUB(hh&,33) ' OB_X(adr_vue_fine%,sizephon&)=SUB(ww&,17) ! Bouton de resize OB_Y(adr_vue_fine%,sizephon&)=SUB(hh&,17) ' OB_X(adr_vue_fine%,6)=SUB(ww&,19) ! Bouton de fermeture ' OB_X(adr_vue_fine%,5)=SUB(ww&,36) ! Bouton de mise en barre ' OB_W(adr_vue_fine%,3)=SUB(ww&,65) ! Barre de d‚placement OB_W(adr_vue_fine%,4)=PRED(OB_W(adr_vue_fine%,3)) ' libere(*zone_gouraud_phong%) ! Lib‚ration du buffer ' lar_gou&=OB_W(adr_vue_fine%,gourphon&) ! Largeur de la fenˆtre hau_gou&=OB_H(adr_vue_fine%,gourphon&) ! Hauteur de la fenˆtre taille_z_buf%=MUL(hau_gou&,SHL(lar_gou&,2)) largeur1%=SHL(lar_gou&,1) ! * 2 largeur2%=SHL(lar_gou&,2) ! * 4 ' taille_zone%=largeur1%+MUL(largeur2%,6)+224+taille_z_buf% ' tail%=MUL(MUL(DIV(lar_gou&,8),hau_gou&),plan_systeme&) ' CLR taille_totale% ADD taille_totale%,taille_zone% ADD taille_totale%,tail% ' zone_gouraud_phong%=@prendre(taille_totale%,TRUE,3) ! Nouveau buffer ph_go_virtuel%=ADD(zone_gouraud_phong%,taille_zone%) ! Buffer ‚cran ' RETURN ' ****************************************************************************** > PROCEDURE preparer_fenetre_remerciement LOCAL x&,y&,w&,h& ' ' Hauteur du cadre contenant le texte OB_H(adr_merci%,inf_contenu&)=219 OB_H(adr_merci%,inf_cadre&)=223 OB_H(adr_merci%,PRED(inf_cadre&))=224 ' ' R‚ajustement de la taille de l'objet 0 et de l'objet 1 OB_H(adr_merci%,1)=284 OB_H(adr_merci%,0)=285 ' Repositionnement du bouton OK OB_X(adr_merci%,sousok_inf&)=172 OB_Y(adr_merci%,sousok_inf&)=256 ' form_center(adr_merci%,x&,y&,w&,h&) ' RETURN > PROCEDURE effacer_texte_merci_non_vue LOCAL x&,y&,h&,obj_inf&,xo&,yo&,ht&,pos_txt& ' ob_state(adr_merci%,popchozerem&,aes_disable&,FALSE) ob_state(adr_merci%,popchoharem&,aes_disable&,FALSE) ob_state(adr_merci%,popchobarem&,aes_disable&,FALSE) ob_state(adr_merci%,popchofirem&,aes_disable&,FALSE) IF position_y_remerciement&=0 ob_state(adr_merci%,popchozerem&,aes_disable&,TRUE) ob_state(adr_merci%,popchoharem&,aes_disable&,TRUE) ENDIF IF position_y_remerciement&=-SUB(SUB(merci_txt_2&,merci_txt_1&),12) ob_state(adr_merci%,popchobarem&,aes_disable&,TRUE) ob_state(adr_merci%,popchofirem&,aes_disable&,TRUE) ENDIF ' h&=OB_H(adr_merci%,inf_contenu&) ht&=OB_H(adr_merci%,merci_txt_1&) ' objc_offset(adr_merci%,inf_contenu&,x&,y&) ' obj_inf&=merci_txt_1& pos_txt&=MUL(position_y_remerciement&,ht&) DO OB_Y(adr_merci%,obj_inf&)=pos_txt& ' objc_offset(adr_merci%,obj_inf&,xo&,yo&) ob_flags(adr_merci%,obj_inf&,aes_hidetree&,FALSE) IF yo&SUB(PRED(ADD(y&,h&)),ht&) ob_flags(adr_merci%,obj_inf&,aes_hidetree&,TRUE) ENDIF ' INC obj_inf& ADD pos_txt&,ht& LOOP WHILE obj_inf& PROCEDURE position_curseur_merci(arbre%,pere&,fils&,valeur&,lime&,ind!) LOCAL pasy,tail% ' tail%=DIV(OB_H(arbre%,pere&),lime&) IF tail%<6 tail%=6 ENDIF OB_H(arbre%,fils&)=tail% OB_H(arbre%,SUCC(fils&))=PRED(tail%) OB_H(arbre%,ADD(fils&,2))=tail% pasy=SUB(OB_H(arbre%,pere&),tail%)/lime& OB_Y(arbre%,fils&)=valeur&*pasy ' IF ind! redraw_elem(arbre%,pere&) ENDIF ' RETURN > PROCEDURE deplace_curseur_merci(arbre%,pere&,fils&) LOCAL depx&,depy&,depw&,deph&,depart&,arrivee&,tot_inf& LOCAL zx&,zy&,zh&,zw&,valeur& ' objc_offset(arbre%,pere&,depx&,depart&) deph&=SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&)) arrivee&=ADD(ADD(depart&,deph&),2) objc_offset(arbre%,fils&,depx&,depy&) depw&=OB_W(arbre%,fils&) deph&=OB_H(arbre%,fils&) ' tot_inf&=SUB(SUB(merci_txt_2&,merci_txt_1&),12) graf_mouse(main_a_plat&,0) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) IF global_my&arrivee& global_my&=arrivee& ENDIF valeur&=-ROUND((ABS(SUB(global_my&,depart&))/(SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&))))*tot_inf&) IF valeur&<-tot_inf& valeur&=-tot_inf& ENDIF IF valeur&<>position_y_remerciement& position_y_remerciement&=valeur& position_curseur_merci(arbre%,pere&,fils&,-position_y_remerciement&,tot_inf&,TRUE) effacer_texte_merci_non_vue ' objc_offset(adr_merci%,inf_contenu&,zx&,zy&) zw&=OB_W(adr_merci%,inf_contenu&) zh&=OB_H(adr_merci%,inf_contenu&) objc_draw(adr_merci%,inf_contenu&,1,zx&,zy&,zw&,zh&,-1) ' objc_offset(adr_merci%,popchozerem&,zx&,zy&) zw&=OB_W(adr_merci%,popchozerem&) zh&=OB_H(adr_merci%,popchozerem&)*4 objc_draw(adr_merci%,0,5,zx&,zy&,zw&,zh&,-1) ' ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) RETURN ' ****************************************************************************** > PROCEDURE verifier_les_contraintes(cliq|) ' Valeurs de cliq| : 0 -> clique sur X ' 1 -> clique sur Y ' 2 -> clique sur Z IF NOT trois_vue! $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| ' X+ … droite Y+ en haut ' X+ … gauche Y+ en haut IF liberte_x! AND liberte_y! IF cliq|=0 liberte_y!=FALSE ob_state(adr_fenetre%,fenlib_y&,aes_selected&,liberte_y!) redraw_elem(adr_fenetre%,fenlib_y&) ELSE liberte_x!=FALSE ob_state(adr_fenetre%,fenlib_x&,aes_selected&,liberte_x!) redraw_elem(adr_fenetre%,fenlib_x&) ENDIF ENDIF CASE vue_de_gauche|,vue_de_droite| ' Z+ … gauche Y+ en haut ' Z+ … droite Y+ en haut IF liberte_z! AND liberte_y! IF cliq|=2 liberte_y!=FALSE ob_state(adr_fenetre%,fenlib_y&,aes_selected&,liberte_y!) redraw_elem(adr_fenetre%,fenlib_y&) ELSE liberte_z!=FALSE ob_state(adr_fenetre%,fenlib_z&,aes_selected&,liberte_z!) redraw_elem(adr_fenetre%,fenlib_z&) ENDIF ENDIF CASE vue_de_dessus|,vue_de_dessous| ' X+ … droite Z+ en haut ' X+ … droite Z+ en bas IF liberte_x! AND liberte_z! IF cliq|=0 liberte_z!=FALSE ob_state(adr_fenetre%,fenlib_z&,aes_selected&,liberte_z!) redraw_elem(adr_fenetre%,fenlib_z&) ELSE liberte_x!=FALSE ob_state(adr_fenetre%,fenlib_x&,aes_selected&,liberte_x!) redraw_elem(adr_fenetre%,fenlib_x&) ENDIF ENDIF ENDSELECT ELSE IF liberte_x! AND liberte_y! AND liberte_z! IF cliq|=0 liberte_y!=FALSE ob_state(adr_fenetre%,fenlib_y&,aes_selected&,liberte_y!) redraw_elem(adr_fenetre%,fenlib_y&) ENDIF IF cliq|=1 liberte_z!=FALSE ob_state(adr_fenetre%,fenlib_z&,aes_selected&,liberte_z!) redraw_elem(adr_fenetre%,fenlib_z&) ENDIF IF cliq|=2 liberte_x!=FALSE ob_state(adr_fenetre%,fenlib_x&,aes_selected&,liberte_x!) redraw_elem(adr_fenetre%,fenlib_x&) ENDIF ENDIF ENDIF RETURN ' ****************************************************************************** ' ********************** Les routines de trac‚ 3D/2D *************************** ' ****************************************************************************** ' ------- Proc‚dure utilisant les routines ASM de Lo‹c SEBALD (XtendTOS) ' ****************************************************************************** > PROCEDURE dessin_generale(destination%,xclp&,yclp&,wclp&,hclp&) LOCAL adr%,clq|,mem_zx%,mem_zy%,rend!,mem_rendu!,tim% ' graf_mouse(m_off&,0) ' arret_dessin!=FALSE source_par_defaut camera_par_defaut ' IF @calcul_correction IF trois_vue! AND dessin_3d|=vue_en_3d| mem_zx%=z_correctionx% mem_zy%=z_correctiony% ENDIF z_correction(adr_fenetre%,fen_act&) ENDIF ' IF total_auto! AND dessin_3d|<>vue_en_3d| calcul_zoom_total ENDIF IF centrage_auto! AND dessin_3d|<>vue_en_3d| centrage_sur_objet_actif ENDIF tim%=TIMER changement_de_taille_transfert_et_ttf affiche_temp1(tim%) calcul_des_angles_univer matrice_xyz(rotationx,rotationy,rotationz,matrice_cam%) $S|,$S> SELECT dessin_3d| CASE vue_de_face| TO vue_de_dessous| trace_3d_plein!=FALSE tri_fi!=FALSE calcul_et_dessin_en_2d(physique%,dessin_3d|,xclp&,yclp&,wclp&,hclp&,FALSE,0) CASE vue_en_3d| IF face_pleine! AND trait! ! ********** Si faces pleines et gestion lumiŠre IF utilise_opengl! AND @nombre_d_objets_affichable IF (NOT trace_3d_plein!) OR (dernier_plein!=TRUE) tim%=TIMER rend!=@creation_scene_open_gl(adr_fenetre%,fen_act&,gl_fill%) trace_3d_plein!=TRUE tri_fi!=FALSE dernier_plein!=FALSE affiche_temp3(tim%) ENDIF ELSE calcul_et_redessin_en_3d_bouknight(destination%,xclp&,yclp&,wclp&,hclp&,FALSE) ENDIF ELSE tri_2d!=FALSE IF NOT trait! ! ********** Si mode filaire IF utilise_opengl! AND @nombre_d_objets_affichable IF NOT tri_fi! tim%=TIMER rend!=@creation_scene_open_gl(adr_fenetre%,fen_act&,gl_line%) trace_3d_plein!=FALSE tri_fi!=TRUE affiche_temp3(tim%) ENDIF ELSE calcul_et_dessin_en_3d_filaire(destination%,xclp&,yclp&,wclp&,hclp&) ENDIF ELSE ! ********** Si mode faces cach‚es IF utilise_opengl! AND @nombre_d_objets_affichable IF (NOT trace_3d_plein!) OR (dernier_plein!=FALSE) tim%=TIMER rend!=@creation_scene_open_gl(adr_fenetre%,fen_act&,gl_line%) trace_3d_plein!=TRUE tri_fi!=FALSE dernier_plein!=TRUE affiche_temp3(tim%) ENDIF ELSE calcul_et_redessin_en_3d_bouknight(destination%,xclp&,yclp&,wclp&,hclp&,TRUE) ENDIF ENDIF ENDIF ENDSELECT IF trois_vue! AND dessin_3d|=vue_en_3d| z_correctionx%=mem_zx% z_correctiony%=mem_zy% ENDIF ' graf_mouse(m_on&,0) ' RETURN ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > PROCEDURE calcul_et_dessin_en_2d(destination%,vue|,xclp&,yclp&,wclp&,hclp&,fl!,obj&) ' -------- Pour les calculs avant affichage en 2D LOCAL i%,j%,j&,numero&,c_l& LOCAL nbp%,nbf%,nbp% LOCAL cptf%,r&,v&,b& LOCAL adr_face%,z_i% LOCAL adr_obje%,poly% LOCAL univ%,des%,param_obje% LOCAL origx&,origy& LOCAL fin_j&,fin_i% LOCAL origx&,origy& LOCAL top&,temp&,temp&,temp& LOCAL ptx&,pty&,tp1%,tp2%,tp3% LOCAL m_ix&,m_iy&,tim% ' {zoo%}=zoom% {ADD(zoo%,4)}=z_correctionx% {ADD(zoo%,8)}=zoom% {ADD(zoo%,12)}=z_correctiony% ' IF @nombre_d_objets_affichable CHAR{{OB_SPEC(adr_fenetre%,fenvue06&)}}=CHAR{OB_SPEC(adr_divers%,calcul&)} redraw_element_fenetre(48,adr_fenetre%,fenvue06&) ' place_le_clipping(xclp&,yclp&,wclp&,hclp&,m_ix&,m_iy&) ' IF grille_vue! grille_ecran ENDIF ' origx&=mix& origy&=miy& dans_quelle_vue(origx&,origy&) ' {ADD(tracer_proj2d%,28)}=vue| {ADD(tracer_proj2d%,32)}=origx& {ADD(tracer_proj2d%,36)}=origy& ' {ADD(tracer_trace_tab%,30)}=destination% IF fl!=TRUE ! L…, on recalcul qu'un objet univ%=@adresse_objet(obj&) type_d_objet_en_calcul(obj&,univ%,nbp%,nbf%,adr_obje%,adr_face%) de_reel_vers_vue(adr_obje%,univ%,SUCC(nbp%),FALSE,FALSE) cptf%=CARD{ADD(zone_index%,SHL(obj&,1))} poly%=ADD(ADD(zone_dessin_2dfi%,4),MUL(cptf%,taille_zone_2dfi%)) ' param_obje%={poly%} IF true_color! inquire_color_representation(INT{ADD(univ%,offset_couleur&)},r&,v&,b&,vdihandle%) BYTE{ADD(param_obje%,1)}=r&*0.255 BYTE{ADD(param_obje%,2)}=v&*0.255 BYTE{ADD(param_obje%,3)}=b&*0.255 ELSE {param_obje%}=INT{ADD(univ%,offset_couleur&)} ENDIF {ADD(param_obje%,4)}=0 INT{ADD(param_obje%,8)}=1 ! Contour activ‚ INT{ADD(param_obje%,10)}=0 ! Pas de masque {ADD(param_obje%,12)}=0 ! Adresse du masque {ADD(param_obje%,16)}=0 ' {ADD(tracer_proj2d%,16)}=tr_tmp% ! source tp1%=tr_tmp% tp2%=ADD(tr_tmp%,12) tp3%=ADD(tr_tmp%,24) ' i%=ADD(adr_face%,2) fin_i%=ADD(i%,MUL(SUCC(nbf%),6)) DO {poly%}=param_obje% {ADD(tracer_proj2d%,20)}=ADD(poly%,4) ! destination ' BMOVE ADD(transfert%,MUL(CARD{i%},12)),tp1%,12 BMOVE ADD(transfert%,MUL(CARD{ADD(i%,2)},12)),tp2%,12 BMOVE ADD(transfert%,MUL(CARD{ADD(i%,4)},12)),tp3%,12 ' c2d2d(tracer_proj2d%) ' ADD poly%,taille_zone_2dfi% ADD i%,6 INC cptf% LOOP WHILE i% PROCEDURE calcul_et_dessin_en_3d_filaire(destination%,xclp&,yclp&,wclp&,hclp&) ' -------- Pour toutes les vues en 3D filaire LOCAL i%,j%,j&,fa&,type&,numero&,c_l& LOCAL nbp%,nbf%,nbp%,trx&,try& LOCAL ptx&,pty&,tx%,ty%,tz% LOCAL adr_face%,adr_fce%,ouvert_t! LOCAL adr_obje%,moyx,moyy,moyz LOCAL univ%,adr_src%,mem_univ% LOCAL r&,v&,b& LOCAL poly%,cptf% LOCAL fin_j&,fin_a% LOCAL zx%,zy%,des% LOCAL tp1%,tp2%,tp3% LOCAL ctx%,cty%,ctz% LOCAL pt_1%,pt_2%,pt_3% LOCAL m_ix&,m_iy&,tim% ' IF @nombre_d_objets_affichable IF NOT trois_vue! CHAR{{OB_SPEC(adr_fenetre%,fenvue06&)}}=CHAR{OB_SPEC(adr_divers%,calcul&)} redraw_element_fenetre(48,adr_fenetre%,fenvue06&) ENDIF ' place_le_clipping(xclp&,yclp&,wclp&,hclp&,m_ix&,m_iy&) ' {ADD(tracer_trace_tab%,30)}=destination% debut_ecran_virtuel(destination%) ' {zoo%}=z_correctionx% {ADD(zoo%,4)}=1024 {ADD(zoo%,8)}=z_correctiony% {ADD(zoo%,12)}=1024 ' tim%=TIMER ' IF NOT tri_fi! ' {ADD(tracer_proj3d%,36)}=mix& {ADD(tracer_proj3d%,40)}=miy& ' ctx%=ADD(tracer_centre_tab%,16) cty%=ADD(tracer_centre_tab%,20) ctz%=ADD(tracer_centre_tab%,24) tp1%=tr_tmp% tp2%=ADD(tr_tmp%,12) tp3%=ADD(tr_tmp%,24) ' CLR numero&,cptf% univ%=univers% poly%=ADD(zone_dessin_2dfi%,4) param_obje%=param_trac% DO ' Si le calque contenant l'objet est visible IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(univ%),36)),35)}=1 ' Si l'objet n'est pas masqu‚ IF NOT BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_masque|) ' Si il n'est pas en C.S.G. IF INT{ADD(univ%,offset_relation_csg&)}=-1 ouvert_t!=BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_ouvert|) ouvert_t!=ouvert_t! OR (INT{univ%}=primitive_plan&) ouvert_t!=ouvert_t! OR (INT{univ%}=primitive_disque&) ouvert_t!=ouvert_t! OR (INT{univ%}=primitive_triangle&) ouvert_t!=ouvert_t! OR (BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_facette|) AND BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_in_out|)) ouvert_t!=ouvert_t! OR (BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) AND BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_in_out|)) type_d_objet_en_calcul(numero&,univ%,nbp%,nbf%,adr_obje%,adr_face%) de_reel_vers_vue(adr_obje%,univ%,SUCC(nbp%),TRUE,FALSE) ' {ADD(tracer_proj3d%,16)}=tr_tmp% ! source ' IF true_color! inquire_color_representation(INT{ADD(univ%,offset_couleur&)},r&,v&,b&,vdihandle%) BYTE{ADD(param_obje%,1)}=r&*0.255 BYTE{ADD(param_obje%,2)}=v&*0.255 BYTE{ADD(param_obje%,3)}=b&*0.255 ELSE {param_obje%}=INT{ADD(univ%,offset_couleur&)} ENDIF {ADD(param_obje%,4)}=0 INT{ADD(param_obje%,8)}=1 ! Contour activ‚ INT{ADD(param_obje%,10)}=0 ! Pas de masque {ADD(param_obje%,12)}=tracer_trame_tab% ! Adresse du masque {ADD(param_obje%,16)}=0 ' adr_fce%=ADD(adr_face%,2) fin_a%=ADD(adr_fce%,MUL(SUCC(nbf%),6)) DO IF (@scalaire_camera_filaire(adr_fce%) OR ouvert_t!) OR (NOT filaire_cache!) ' pt_1%=ADD(transfert%,MUL(CARD{adr_fce%},12)) pt_2%=ADD(transfert%,MUL(CARD{ADD(adr_fce%,2)},12)) pt_3%=ADD(transfert%,MUL(CARD{ADD(adr_fce%,4)},12)) BMOVE pt_1%,tp1%,12 BMOVE pt_2%,tp2%,12 BMOVE pt_3%,tp3%,12 ' ------------------------------------------------------------ bmove(tp1%,ctx%,36) do_barycenter(tracer_centre_tab%) ' ------------------------------------------------------------ ' IF @possible_en_camera({ctx%},{cty%},{ctz%}) ' {poly%}=param_obje% {ADD(tracer_proj3d%,20)}=ADD(poly%,4) c3d2d(tracer_proj3d%) ' {tr_tmp%}=1 ! Une face … la fois BMOVE poly%,ADD(tr_tmp%,4),16 {ADD(tracer_trace_tab%,16)}=tr_tmp% draw_line(tracer_trace_tab%) ' INC cptf% ADD poly%,taille_zone_2dfi% ENDIF ENDIF ADD adr_fce%,6 arret_dessin!=BTST(BIOS(&HB,-1),cl_alternate&) EXIT IF arret_dessin! LOOP WHILE adr_fce% PROCEDURE calcul_et_redessin_en_3d_bouknight(destination%,xclp&,yclp&,wclp&,hclp&,t!) LOCAL cptto%,fin_a% LOCAL param_obje%,adr_face% LOCAL i%,j%,adr%,co& LOCAL poly%,adr_ttf% LOCAL adr_f%,adr_p%,vect_norm%,numero& LOCAL m_ix&,m_iy&,tim% ' IF @nombre_d_objets_affichable ' {zoo%}=z_correctionx% {ADD(zoo%,4)}=1024 {ADD(zoo%,8)}=z_correctiony% {ADD(zoo%,12)}=1024 ' {ADD(tracer_trace_tab%,30)}=destination% ' CARD{tracer_trame_tab%}=&HFFFF ! Masque de tramage ' tim%=TIMER ' IF (NOT tri_3d!) visible%=@tri_des_faces_bouknight tri_3d!=TRUE ENDIF set_fill_perimeter_visibility(0) IF visible%>-1 IF (NOT trace_3d_plein!) OR (t!<>dernier_plein!) CHAR{{OB_SPEC(adr_fenetre%,fenvue06&)}}=CHAR{OB_SPEC(adr_divers%,calcul&)} redraw_element_fenetre(48,adr_fenetre%,fenvue06&) ' place_le_clipping(xclp&,yclp&,wclp&,hclp&,m_ix&,m_iy&) ' {ADD(tracer_proj3d%,16)}=transfert% ' {ADD(tracer_proj3d%,36)}=mix& {ADD(tracer_proj3d%,40)}=miy& ' ' Adresse de la zone de tri en fonction des faces visibles poly%=ADD(zone_dessin_3d%,4) param_obje%=param_3d% CLR cptto% adr_ttf%=ttf% fin_a%=ADD(ttf%,MUL(SUCC(visible%),taille_zone_ttf%)) DO numero&=CARD{ADD(adr_ttf%,4)} ! Num‚ro de l'objet concern‚ adr_face%={ADD(adr_ttf%,6)} ! Adresse des faces BMOVE ADD(adr_ttf%,10),transfert%,36 ! Les 3 points en 3D ' univ%=@adresse_objet(numero&) ! Adresse de l'objet co&=INT{ADD(univ%,offset_couleur&)} ! Couleur … l'‚cran vect_norm%=@adresse_edge(numero&) ! Adresse des normales adr_f%=@adresse_finish(numero&) ! Adresse du finish adr_p%=@adresse_pigment(numero&) ! Adresse du pigment ' initialise_une_couleur_pour_un_point(co&,adr_p%,adr_f%) normale_pour_gouraud(univ%,adr_face%,vect_norm%) parametrage_d_un_point(univ%,t!) ' {poly%}=param_obje% {ADD(tracer_proj3d%,20)}=ADD(poly%,4) c3d2d(tracer_proj3d%) ' ------------------------------------------------------------------ {tr_tmp%}=1 BMOVE poly%,ADD(tr_tmp%,4),16 {ADD(tracer_trace_tab%,16)}=tr_tmp% draw_poly(tracer_trace_tab%) ' INC cptto% ADD param_obje%,20 ADD poly%,taille_zone_3d% ADD adr_ttf%,taille_zone_ttf% ' arret_dessin!=BTST(BIOS(&HB,-1),cl_alternate&) EXIT IF arret_dessin! LOOP WHILE adr_ttf% PROCEDURE calcul_et_dessin_en_3d_gouraud_phong_face(fx&,fy&,fw&,fh&) LOCAL taille_z_buf%,numero&,taille_zone%,m_ix&,m_iy& LOCAL univ%,nbp%,nbf%,adr_obje%,adr_face%,tim% LOCAL fin_a%,co&,j%,refl!,adr_fce%,tp1%,tp2%,tp3% LOCAL adr_f%,adr_p%,cr&,cv&,cb&,des%,ouvert_t! LOCAL adr%,fin_adr%,lar_gou&,hau_gou&,vect_norm% LOCAL z_buf%,largeur1%,largeur2%,adresse%,co&,c0,c1,c2 LOCAL xint%,bint%,ixnte%,iynte%,iznte%,xpte%,ypte%,zpte% LOCAL xgau%,yhau%,ixmin%,iymin%,izmin%,xmin%,ymin%,zmin% LOCAL xdro%,ybas%,ixmax%,iymax%,izmax%,xmax%,ymax%,zmax% LOCAL panx%,pany%,panz%,tanx,tany,tanz,ranx,rany,ranz ' IF @nombre_d_objets_affichable lar_gou&=OB_W(adr_vue_fine%,gourphon&) ! Largeur de la fenˆtre hau_gou&=OB_H(adr_vue_fine%,gourphon&) ! Hauteur de la fenˆtre taille_z_buf%=MUL(hau_gou&,SHL(lar_gou&,2)) largeur1%=SHL(lar_gou&,1) ! * 2 largeur2%=SHL(lar_gou&,2) ! * 4 ' taille_zone%=largeur1%+MUL(largeur2%,6)+224+taille_z_buf% membfill(zone_gouraud_phong%,taille_zone%,0) ' adresse%=zone_gouraud_phong% ' IF gouraud! ' xint%=adresse% ! X des lines ‚cran ADD adresse%,largeur1% bint%=adresse% ! Intensit‚ … chaque X ADD adresse%,largeur1% zpte%=adresse% ! Z … chaque X ADD adresse%,largeur2% ' xgau%=adresse% ! X gauche ADD adresse%,8 yhau%=adresse% ! Y haut ADD adresse%,8 imin%=adresse% ! Intensit‚ minimum ADD adresse%,8 zmin%=adresse% ! Z minimum ADD adresse%,16 ' xdro%=adresse% ! X droit ADD adresse%,8 ybas%=adresse% ! Y bas ADD adresse%,8 imax%=adresse% ! Intensit‚ maximum ADD adresse%,8 zmax%=adresse% ! Z maximum ADD adresse%,16 ' z_buf%=adresse% ! Le Z-Buffer proprement dit ' ELSE ' xint%=adresse% ! X des lignes ‚cran ADD adresse%,largeur1% ixnte%=adresse% ! Normal X … chaque X ADD adresse%,largeur2% iynte%=adresse% ! Normal Y … chaque X ADD adresse%,largeur2% iznte%=adresse% ! Normal Z … chaque X ADD adresse%,largeur2% xpte%=adresse% ! X … chaque X ADD adresse%,largeur2% ypte%=adresse% ! Y … chaque X ADD adresse%,largeur2% zpte%=adresse% ! Z … chaque X ADD adresse%,largeur2% ' xgau%=adresse% ! X gauche ADD adresse%,8 xgau%=adresse% ! X gauche ADD adresse%,8 yhau%=adresse% ! Y haut ADD adresse%,8 ixmin%=adresse% ! Normal minimum X ADD adresse%,16 iymin%=adresse% ! Normal minimum Y ADD adresse%,16 izmin%=adresse% ! Normal minimum Z ADD adresse%,16 xmin%=adresse% ! X minimum ADD adresse%,16 ymin%=adresse% ! Y minimum ADD adresse%,16 zmin%=adresse% ! Z minimum ADD adresse%,16 ' xdro%=adresse% ! X droit ADD adresse%,8 ybas%=adresse% ! Y bas ADD adresse%,8 ixmax%=adresse% ! Normal maximum X ADD adresse%,16 iymax%=adresse% ! Normal maximum Y ADD adresse%,16 izmax%=adresse% ! Normal maximum Z ADD adresse%,16 xmax%=adresse% ! X maximum ADD adresse%,16 ymax%=adresse% ! Y maximum ADD adresse%,16 zmax%=adresse% ! Z maximum ADD adresse%,16 ' z_buf%=adresse% ! Le Z-Buffer proprement dit ' ENDIF ' place_le_clipping(fx&,fy&,fw&,fh&,m_ix&,m_iy&) ' Remplir le Z-Buffer de valeurs minimum membfill(z_buf%,MUL(hau_gou&,SHL(lar_gou&,2)),&H80000000) {zoo%}=z_correctionx% {ADD(zoo%,4)}=1024 {ADD(zoo%,8)}=z_correctiony% {ADD(zoo%,12)}=1024 ' {ADD(tracer_proj3d%,36)}=mix& {ADD(tracer_proj3d%,40)}=miy& ' tp1%=coord_polygon% tp2%=ADD(coord_polygon%,12) tp3%=ADD(coord_polygon%,24) ' tim%=TIMER set_fill_perimeter_visibility(0) ' Adresse de la zone de tri en fonction des faces visibles CLR numero& univ%=univers% DO membfill(mem_vid%,240,0) ' Si le calque contenant l'objet est visible IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(univ%),36)),35)}=1 ' Si l'objet n'est pas masqu‚ IF NOT BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_masque|) ' Si il n'est pas en C.S.G. IF INT{ADD(univ%,offset_relation_csg&)}=-1 ouvert_t!=BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_ouvert|) ouvert_t!=ouvert_t! OR (INT{univ%}=primitive_plan&) ouvert_t!=ouvert_t! OR (INT{univ%}=primitive_disque&) ouvert_t!=ouvert_t! OR (INT{univ%}=primitive_triangle&) ouvert_t!=ouvert_t! OR (BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_facette|) AND BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_in_out|)) ouvert_t!=ouvert_t! OR (BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) AND BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_in_out|)) ' co&=INT{ADD(univ%,offset_couleur&)} ! Couleur … l'‚cran vect_norm%=@adresse_edge(numero&) ! Adresse des normales adr_f%=@adresse_finish(numero&) ! Adresse du finish adr_p%=@adresse_pigment(numero&) ! Adresse du pigment initialise_une_couleur_pour_un_point(co&,adr_p%,adr_f%) ' type_d_objet_en_calcul(numero&,univ%,nbp%,nbf%,adr_obje%,adr_face%) adr_fce%=ADD(adr_face%,2) fin_f%=ADD(adr_fce%,MUL(SUCC(nbf%),6)) DO ' de r‚el vers vue pour une face BMOVE ADD(ADD(adr_obje%,2),MUL(CARD{adr_fce%},12)),transfert%,12 BMOVE ADD(ADD(adr_obje%,2),MUL(CARD{ADD(adr_fce%,2)},12)),ADD(transfert%,12),12 BMOVE ADD(ADD(adr_obje%,2),MUL(CARD{ADD(adr_fce%,4)},12)),ADD(transfert%,24),12 ' IF INT{univ%}<>primitive_triangle& panx%=ROUND(SINGLE{ADD(univ%,2)},3)*1024 pany%=ROUND(SINGLE{ADD(univ%,6)},3)*1024 panz%=ROUND(SINGLE{ADD(univ%,10)},3)*1024 tanx=ROUND(SINGLE{ADD(univ%,14)},3) tany=ROUND(SINGLE{ADD(univ%,18)},3) tanz=ROUND(SINGLE{ADD(univ%,22)},3) ranx=ROUND(SINGLE{ADD(univ%,26)},3) rany=ROUND(SINGLE{ADD(univ%,30)},3) ranz=ROUND(SINGLE{ADD(univ%,34)},3) matrice_zyx(-ranx,-rany,-ranz,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=tanx {ADD(matrice%,4)}=tany {ADD(matrice%,8)}=tanz {ADD(tracer_rotattrans%,32)}=3 {ADD(tracer_rotattrans%,36)}=panx% {ADD(tracer_rotattrans%,40)}=pany% {ADD(tracer_rotattrans%,44)}=panz% ro_tr(tracer_rotattrans%) ENDIF IF @visible_de_camera ' ******** Echelle + Translation + Rotation {ADD(tracer_transrotat%,32)}=3 {ADD(tracer_transrotat%,36)}=-SINGLE{camera%}*1024 {ADD(tracer_transrotat%,40)}=-SINGLE{ADD(camera%,4)}*1024 {ADD(tracer_transrotat%,44)}=-SINGLE{ADD(camera%,8)}*1024 tr_ro(tracer_transrotat%) IF @scalaire_camera OR ouvert_t! ' {ADD(tracer_proj3d%,16)}=transfert% {ADD(tracer_proj3d%,20)}=coord_polygon% c3d2d(tracer_proj3d%) ' BMOVE coord_polygon%,ADD(coord_polygon%,12),4 ' IF gouraud! normale_pour_gouraud(univ%,adr_fce%,vect_norm%) face_gouraud(coord_polygon%,co&,fx&,fw&,z_buf%,xint%,bint%,zpte%,xgau%,yhau%,imin%,zmin%,xdro%,ybas%,imax%,zmax%,lar_gou&) ELSE normale_pour_phong(adr_fce%,vect_norm%) face_phong(univ%,z_buf%,coord_polygon%,co&,fx&,fw&,xint%,ixnte%,iynte%,iznte%,xpte%,ypte%,zpte%,xgau%,yhau%,ixmin%,iymin%,izmin%,xmin%,ymin%,zmin%,xdro%,ybas%,ixmax%,iymax%,izmax%,xmax%,ymax%,zmax%,lar_gou&) ENDIF ' ENDIF ENDIF EXIT IF arret_dessin! ADD adr_fce%,6 LOOP WHILE adr_fce% PROCEDURE dessin_gouraud_phong(fx&,fy&,fw&,fh&) LOCAL adr%,clq|,mem_v|,mem_r!,rend! LOCAL mem_1!,mem_2!,mem_3!,mem_zx%,mem_zy% LOCAL bouclex&,boucley&,tim% ' IF NOT dessin_gouraud_phong! IF utilise_opengl! AND @nombre_d_objets_affichable tim%=TIMER rend!=@creation_scene_open_gl(adr_vue_fine%,gourphon&,gl_fill%) affiche_temp3(tim%) IF rend! dessin_gouraud_phong!=TRUE ENDIF ELSE mem_1!=tri_3d! mem_2!=tri_2d! mem_3!=tri_fi! mem_r!=redimention! redimention!=FALSE mem_zx%=z_correctionx% mem_zy%=z_correctiony% z_correction(adr_vue_fine%,gourphon&) mem_v|=dessin_3d| dessin_3d|=vue_en_3d| ' Si il y a pas de lumiŠre de d‚finie, alors, on en met une par d‚faut ' Et oui, c'est toujours mieux avec un peu de lumiŠre... IF NOT @source_active BYTE{source%}=1 ! Inactive BYTE{ADD(source%,1)}=BCLR(BYTE{ADD(source%,1)},bit_spot|) BYTE{ADD(source%,1)}=BCLR(BYTE{ADD(source%,1)},bit_surface|) BYTE{ADD(source%,1)}=BCLR(BYTE{ADD(source%,1)},bit_objet_lie|) BYTE{ADD(source%,1)}=BCLR(BYTE{ADD(source%,1)},bit_cylindre|) BYTE{ADD(source%,1)}=BCLR(BYTE{ADD(source%,1)},bit_attenuation|) BYTE{ADD(source%,1)}=BCLR(BYTE{ADD(source%,1)},bit_shadowless|) BYTE{ADD(source%,1)}=BSET(BYTE{ADD(source%,1)},bit_atmosphere|) CARD{ADD(source%,2)}=0 ! Non pr‚-d‚finie BYTE{ADD(source%,4)}=255 ! Rouge BYTE{ADD(source%,5)}=255 ! Vert BYTE{ADD(source%,6)}=255 ! Bleu SINGLE{ADD(source%,8)}=-2000 ! Position X SINGLE{ADD(source%,12)}=2000 ! Position Y SINGLE{ADD(source%,16)}=-2000 ! Position Z INT{ADD(source%,48)}=35 ! Radius INT{ADD(source%,50)}=45 ! Falloff INT{ADD(source%,52)}=10 ! Stighness INT{ADD(source%,54)}=-1 ! Objet li‚ BYTE{ADD(source%,57)}=1 ! Fade_Power type 1 CHAR{ADD(source%,62)}="SOLEIL" ENDIF ' L…, si la cam‚ra et son point de vis‚ son au mˆme endroit, on replace une ' cam‚ra par d‚faut un peu plus logique et surtout qui ne plante pas le ' programme IF SINGLE{camera%}=SINGLE{ADD(camera%,12)} AND SINGLE{ADD(camera%,4)}=SINGLE{ADD(camera%,16)} AND SINGLE{ADD(camera%,8)}=SINGLE{ADD(camera%,20)} SINGLE{camera%}=100 SINGLE{ADD(camera%,4)}=100 SINGLE{ADD(camera%,8)}=-200 SINGLE{ADD(camera%,12)}=0 SINGLE{ADD(camera%,16)}=0 SINGLE{ADD(camera%,20)}=0 ENDIF tim%=TIMER changement_de_taille_transfert_et_ttf affiche_temp1(tim%) calcul_des_angles_univer matrice_xyz(rotationx,rotationy,rotationz,matrice_cam%) ' Couleur du fond comme BACKGROUND POV IF INT{back_fond%}=1 BYTE{couleur_point%}=BYTE{ADD(back_fond%,4)} BYTE{SUCC(couleur_point%)}=BYTE{ADD(back_fond%,5)} BYTE{ADD(couleur_point%,2)}=BYTE{ADD(back_fond%,6)} afficher_un_point(ADD(fx&,bouclex&),ADD(fy&,boucley&),fw&,fh&,0.5) ENDIF arret_dessin!=FALSE ' calcul_et_dessin_en_3d_gouraud_phong_face(fx&,fy&,fw&,fh&) dessin_gouraud_phong!=TRUE z_correctionx%=mem_zx% z_correctiony%=mem_zy% dessin_3d|=mem_v| redimention!=mem_r! tri_3d!=mem_1! tri_2d!=mem_2! tri_fi!=mem_3! ENDIF ENDIF RETURN ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > PROCEDURE source_par_defaut ' Si il y a pas de lumiŠre de d‚finie, alors, on en ' met une par d‚faut. ' Et oui, c'est toujours mieux avec un peu de lumiŠre... IF NOT @source_active BYTE{source%}=1 ! Inactive BYTE{ADD(source%,1)}=BCLR(BYTE{ADD(source%,1)},bit_spot|) BYTE{ADD(source%,1)}=BCLR(BYTE{ADD(source%,1)},bit_surface|) BYTE{ADD(source%,1)}=BCLR(BYTE{ADD(source%,1)},bit_objet_lie|) BYTE{ADD(source%,1)}=BCLR(BYTE{ADD(source%,1)},bit_cylindre|) BYTE{ADD(source%,1)}=BCLR(BYTE{ADD(source%,1)},bit_attenuation|) BYTE{ADD(source%,1)}=BCLR(BYTE{ADD(source%,1)},bit_shadowless|) BYTE{ADD(source%,1)}=BSET(BYTE{ADD(source%,1)},bit_atmosphere|) CARD{ADD(source%,2)}=0 ! Non pr‚-d‚finie BYTE{ADD(source%,4)}=255 ! Rouge BYTE{ADD(source%,5)}=255 ! Vert BYTE{ADD(source%,6)}=255 ! Bleu SINGLE{ADD(source%,8)}=-2000 ! Position X SINGLE{ADD(source%,12)}=2000 ! Position Y SINGLE{ADD(source%,16)}=-2000 ! Position Z INT{ADD(source%,48)}=35 ! Radius INT{ADD(source%,50)}=45 ! Falloff INT{ADD(source%,52)}=10 ! Stighness INT{ADD(source%,54)}=-1 ! Objet li‚ BYTE{ADD(source%,57)}=1 ! Fade_Power type 1 CHAR{ADD(source%,62)}="SOLEIL" ENDIF ' RETURN > PROCEDURE camera_par_defaut ' L…, si la cam‚ra et son point de vis‚ son au mˆme endroit, on replace une ' cam‚ra par d‚faut un peu plus logique et surtout qui ne plante pas le ' programme IF SINGLE{camera%}=SINGLE{ADD(camera%,12)} AND SINGLE{ADD(camera%,4)}=SINGLE{ADD(camera%,16)} AND SINGLE{ADD(camera%,8)}=SINGLE{ADD(camera%,20)} SINGLE{camera%}=100 SINGLE{ADD(camera%,4)}=100 SINGLE{ADD(camera%,8)}=-200 SINGLE{ADD(camera%,12)}=0 SINGLE{ADD(camera%,16)}=0 SINGLE{ADD(camera%,20)}=0 ENDIF ' RETURN ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > PROCEDURE affiche_temp1(tim%) IF temps_des_calcul! CHAR{{OB_SPEC(adr_temps_passe%,tmps01&)}}=STR$(ROUND(SUB(TIMER,tim%)/200,4),9,4) redraw_element_fenetre(40,adr_temps_passe%,tmps01&) ENDIF RETURN > PROCEDURE affiche_temp2(tim%) IF temps_des_calcul! CHAR{{OB_SPEC(adr_temps_passe%,tmps02&)}}=STR$(ROUND(SUB(TIMER,tim%)/200,4),9,4) redraw_element_fenetre(40,adr_temps_passe%,tmps02&) ENDIF RETURN > PROCEDURE affiche_temp3(tim%) IF temps_des_calcul! CHAR{{OB_SPEC(adr_temps_passe%,tmps03&)}}=STR$(ROUND(SUB(TIMER,tim%)/200,4),9,4) redraw_element_fenetre(40,adr_temps_passe%,tmps03&) ENDIF RETURN > PROCEDURE affiche_temp4(tim%) IF temps_des_calcul! CHAR{{OB_SPEC(adr_temps_passe%,tmps04&)}}=STR$(ROUND(SUB(TIMER,tim%)/200,4),9,4) ENDIF RETURN ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > PROCEDURE point_de_controle_en_2d(vue|,univ%,origx&,origy&,in!) LOCAL fa& LOCAL adrc% LOCAL pt1&,pt2& LOCAL pt1%,pt2% ' adrc%=SUB(@adresse_point_control(CARD{ADD(univ%,offset_force_blob&)}),2) de_reel_vers_vue(adrc%,univ%,16,FALSE,TRUE) ' {ADD(tracer_proj2d%,20)}=mem_num% {ADD(tracer_proj2d%,28)}=vue| {ADD(tracer_proj2d%,32)}=origx& {ADD(tracer_proj2d%,36)}=origy& ' adrc%=dessin_carreaux% CLR pty& DO CLR ptx& DO ' {ADD(tracer_proj2d%,16)}=@adr_ctrl(transfert%,ptx&,pty&) c2d2d(tracer_proj2d%) bmove(mem_num%,adrc%,4) ' ADD adrc%,4 INC ptx& LOOP WHILE ptx&<4 INC pty& LOOP WHILE pty&<4 ' IF true_color! inquire_color_representation(jaune&,r&,v&,b&,vdihandle%) BYTE{ADD(tracer_param_tab%,1)}=r&*0.255 BYTE{ADD(tracer_param_tab%,2)}=v&*0.255 BYTE{ADD(tracer_param_tab%,3)}=b&*0.255 ELSE {tracer_param_tab%}=jaune& ENDIF CARD{ADD(tracer_param_tab%,8)}=1 ! Contour actif CARD{ADD(tracer_param_tab%,10)}=0 ! Tramage inactif CARD{tracer_trame_tab%}=&HFFFF ' {ADD(tracer_trace_tab%,16)}=coord_polygon% {ADD(tracer_trace_tab%,30)}=physique% {coord_polygon%}=0 {ADD(coord_polygon%,4)}=tracer_param_tab% ' adrc%=ADD(dessin_carreaux%,64) CLR i& DO pt1%=ADD(dessin_carreaux%,SHL(INT{adrc%},2)) pt2%=ADD(dessin_carreaux%,SHL(INT{ADD(adrc%,2)},2)) ' INT{ADD(coord_polygon%,8)}=INT{pt1%} INT{ADD(coord_polygon%,10)}=INT{ADD(pt1%,2)} INT{ADD(coord_polygon%,12)}=INT{pt2%} INT{ADD(coord_polygon%,14)}=INT{ADD(pt2%,2)} draw_line(tracer_trace_tab%) ' ADD adrc%,4 INC i& LOOP WHILE i&<24 ' IF in! CLR fa& CLR pty& DO CLR ptx& DO IF fa&=num_pt_ctrl& {ADD(tracer_proj2d%,16)}=@adr_ctrl(transfert%,ptx&,pty&) c2d2d(tracer_proj2d%) dessiner_un_point_de_controle(INT{mem_num%},INT{ADD(mem_num%,2)},fa&) ENDIF INC fa& INC ptx& LOOP WHILE ptx&<4 INC pty& LOOP WHILE pty&<4 ENDIF mem_univ%=univ% ' RETURN > PROCEDURE dessiner_un_point_de_controle(tx&,ty&,f&) IF maxcol&<15 set_remplissage(2,8,blanc&,-1) ELSE set_remplissage(2,8,jaune&,-1) ENDIF pbox(SUB(tx&,6),SUB(ty&,4),ADD(tx&,7),ADD(ty&,4)) set_type_de_ligne(noir&,1,1,0,0,-1) box(SUB(tx&,6),SUB(ty&,4),ADD(tx&,7),ADD(ty&,4)) CHAR{commande%}=STR$(SUCC(f&),2)+CHR$(0) set_text_mode(noir&,0,0,4,-1,vdihandle%) set_writing_mode(mode_transparent|) text(SUB(tx&,5),ADD(ty&,2),commande%) set_writing_mode(mode_remplace|) RETURN > PROCEDURE centre_point_control(ad%,VAR panx%,pany%,panz%) LOCAL pt&,a_d% LOCAL larg,haut,prof LOCAL minx,miny,minz LOCAL maxx,maxy,maxz LOCAL x,y,z ' minx=3.599386269725E+308 miny=3.599386269725E+308 minz=3.599386269725E+308 maxx=-3.599386269725E+308 maxy=-3.599386269725E+308 maxz=-3.599386269725E+308 ' a_d%=ad% CLR pt& DO x=ROUND({a_d%}/1024,3) y=ROUND({ADD(a_d%,4)}/1024,3) z=ROUND({ADD(a_d%,8)}/1024,3) ' minx=MIN(minx,x) miny=MIN(miny,y) minz=MIN(minz,z) maxx=MAX(maxx,x) maxy=MAX(maxy,y) maxz=MAX(maxz,z) ' ADD a_d%,12 INC pt& LOOP WHILE pt&<15 ' larg=ROUND(maxx-minx,3) haut=ROUND(maxy-miny,3) prof=ROUND(maxz-minz,3) panx%=ROUND(minx+(lar/2),3)*1024 pany%=ROUND(miny+(hau/2),3)*1024 panz%=ROUND(minz+(pro/2),3)*1024 ' RETURN ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > PROCEDURE initialise_une_couleur_pour_un_point(co&,adr_p%,adr_f%) LOCAL c0,c1,c2,refl! LOCAL cr&,cv&,cb& ' ' On commence par mettre des valeurs par d‚faut histoire d'avoir un rendu ' pas trop mauvais lorsqu'aucun paramŠtre n'est plac‚. SINGLE{coef_rendu%}=0.5 ! \ R‚fl‚xion SINGLE{ADD(coef_rendu%,4)}=0.5 ! > Specular/Roughness SINGLE{ADD(coef_rendu%,8)}=0.5 ! / Phong/Phong_Size SINGLE{ADD(coef_rendu%,12)}=1 ! Brillance SINGLE{ADD(coef_rendu%,16)}=0.5 ! Diffuse SINGLE{ADD(coef_rendu%,20)}=0.5 ! Ambiente Rouge SINGLE{ADD(coef_rendu%,24)}=0.5 ! Ambiente Vert SINGLE{ADD(coef_rendu%,28)}=0.5 ! Ambiente Bleu BYTE{couleur_point%}=255 ! \ BYTE{ADD(couleur_point%,1)}=0 ! > Objet rouge BYTE{ADD(couleur_point%,2)}=0 ! / par d‚faut refl!=FALSE IF BTST(BYTE{ADD(adr_p%,3)},5) ! COLOR ' Couleur de l'objet pris dans pigment BYTE{couleur_point%}=BYTE{ADD(adr_p%,92)} BYTE{ADD(couleur_point%,1)}=BYTE{ADD(adr_p%,93)} BYTE{ADD(couleur_point%,2)}=BYTE{ADD(adr_p%,94)} ELSE IF BTST(BYTE{ADD(adr_p%,3)},6) ! QUICK COLOR ' Sinon couleur rapide de l'objet dans pigment BYTE{couleur_point%}=BYTE{ADD(adr_p%,98)} BYTE{ADD(couleur_point%,1)}=BYTE{ADD(adr_p%,99)} BYTE{ADD(couleur_point%,2)}=BYTE{ADD(adr_p%,100)} ELSE ' Sinon, couleur de l'objet … l'‚cran inquire_color_representation(co&,cr&,cv&,cb&,vdihandle%) BYTE{couleur_point%}=cr&*0.255 BYTE{ADD(couleur_point%,1)}=cv&*0.255 BYTE{ADD(couleur_point%,2)}=cb&*0.255 ENDIF IF BTST(BYTE{ADD(adr_f%,2)},0) ' Co‚ficient de r‚fl‚xion diffuse pour un point SINGLE{ADD(coef_rendu%,16)}=ROUND(BYTE{ADD(adr_f%,6)}/255,3) ENDIF IF BTST(BYTE{ADD(adr_f%,2)},4) ' Co‚ficient de r‚fl‚xion ambiante pour l'objet SINGLE{ADD(coef_rendu%,20)}=ROUND(BYTE{ADD(adr_f%,16)}/255,3) SINGLE{ADD(coef_rendu%,24)}=ROUND(BYTE{ADD(adr_f%,17)}/255,3) SINGLE{ADD(coef_rendu%,28)}=ROUND(BYTE{ADD(adr_f%,18)}/255,3) ENDIF IF BTST(BYTE{ADD(adr_f%,2)},5) ' Co‚ficient Specular/Roughness SINGLE{coef_rendu%}=ROUND(BYTE{ADD(adr_f%,21)}/100,3) SINGLE{coef_rendu%}=ROUND(ROUND(SINGLE{coef_rendu%},3)*ROUND(BYTE{ADD(adr_f%,22)}/100,3),3) SINGLE{ADD(coef_rendu%,4)}=SINGLE{coef_rendu%} SINGLE{ADD(coef_rendu%,8)}=SINGLE{coef_rendu%} refl!=TRUE ENDIF IF BTST(BYTE{ADD(adr_f%,2)},5) ' Co‚ficient Phong/Phong_Size IF NOT refl! SINGLE{coef_rendu%}=ROUND(BYTE{ADD(adr_f%,23)}/100,3) SINGLE{ADD(coef_rendu%,4)}=SINGLE{coef_rendu%} SINGLE{ADD(coef_rendu%,8)}=SINGLE{coef_rendu%} ELSE SINGLE{coef_rendu%}=ROUND(ROUND(SINGLE{coef_rendu%},3)*ROUND(BYTE{ADD(adr_f%,23)}/100,3),3) SINGLE{ADD(coef_rendu%,4)}=ROUND(ROUND(SINGLE{ADD(coef_rendu%,4)},3)*ROUND(BYTE{ADD(adr_f%,23)}/100,3),3) SINGLE{ADD(coef_rendu%,4)}=ROUND(ROUND(SINGLE{ADD(coef_rendu%,8)},3)*ROUND(BYTE{ADD(adr_f%,23)}/100,3),3) ENDIF SINGLE{coef_rendu%}=ROUND(ROUND(SINGLE{coef_rendu%},3)*ROUND(BYTE{ADD(adr_f%,24)}/255,3),3) SINGLE{ADD(coef_rendu%,4)}=ROUND(ROUND(SINGLE{ADD(coef_rendu%,4)},3)*ROUND(BYTE{ADD(adr_f%,24)}/255,3),3) SINGLE{ADD(coef_rendu%,4)}=ROUND(ROUND(SINGLE{ADD(coef_rendu%,8)},3)*ROUND(BYTE{ADD(adr_f%,24)}/255,3),3) refl!=TRUE ENDIF IF BTST(BYTE{ADD(adr_f%,2)},1) ' Co‚ficient de r‚flection c0=ROUND(BYTE{ADD(adr_f%,10)}/100,3) c1=ROUND(BYTE{ADD(adr_f%,11)}/100,3) c2=ROUND(BYTE{ADD(adr_f%,12)}/100,3) IF NOT refl! SINGLE{coef_rendu%}=ROUND(c0,3) SINGLE{ADD(coef_rendu%,4)}=ROUND(c1,3) SINGLE{ADD(coef_rendu%,8)}=ROUND(c2,3) ELSE SINGLE{coef_rendu%}=ROUND(ROUND(SINGLE{coef_rendu%},3)*ROUND(c0,3),3) SINGLE{ADD(coef_rendu%,4)}=ROUND(ROUND(SINGLE{ADD(coef_rendu%,4)},3)*ROUND(c1,3),3) SINGLE{ADD(coef_rendu%,8)}=ROUND(ROUND(SINGLE{ADD(coef_rendu%,8)},3)*ROUND(c2,3),3) ENDIF ENDIF IF BTST(BYTE{ADD(adr_f%,2)},2) ' Co‚ficient de brillance SINGLE{ADD(coef_rendu%,12)}=BYTE{ADD(adr_f%,7)} ENDIF ' RETURN > PROCEDURE parametrage_d_un_point(univ%,t!) LOCAL int&,cr&,cv&,cb& LOCAL c0,l_c& LOCAL cr,cv,cb ' ' Calcul de la l'intensit‚ moyenne de la facette (valeur de 0 … 255) int&=BYTE{mem_vid%} ! Intensit‚ point 1 ADD int&,BYTE{ADD(mem_vid%,6)} ! Intensit‚ point 2 ADD int&,BYTE{ADD(mem_vid%,12)} ! intensit‚ point 3 DIV int&,3 ! Moyenne pond‚r‚e ' int&=0*(int&<0)-255*(int&>255)-int&*(int&>-1 AND int&<256) ' ' ****************************************************************** ' **** En fonction du type d'affichage. **** ' ****************************************************************** IF true_color! c0=int&/255 ! Valeur de 0 … 1 c_l&=INT{ADD(univ%,offset_couleur&)} ' ' Si t!=TRUE alors, la couleur de fond est utilis‚e pour remplir les ' facettes et c'est le contour qui utilise la couleur de l'objet. ' ' Un petit bug de XtendTOS oblige … coder la couleur en GBxR en 32 bit ' IF t! inquire_color_representation(fond_ecran&,cr&,cv&,cb&,vdihandle%) IF plan_systeme&=>24 BYTE{ADD(param_obje%,1)}=cr&*0.255 BYTE{ADD(param_obje%,2)}=cv&*0.255 BYTE{ADD(param_obje%,3)}=cb&*0.255 ELSE BYTE{ADD(param_obje%,1)}=cr&*0.255 BYTE{ADD(param_obje%,2)}=cv&*0.255 BYTE{ADD(param_obje%,3)}=cb&*0.255 ENDIF INT{ADD(param_obje%,8)}=1 ! Contour activ‚ ELSE IF plan_systeme&=>24 BYTE{ADD(param_obje%,1)}=BYTE{couleur_point%}*c0 BYTE{ADD(param_obje%,2)}=BYTE{SUCC(couleur_point%)}*c0 BYTE{ADD(param_obje%,3)}=BYTE{ADD(couleur_point%,2)}*c0 ELSE BYTE{ADD(param_obje%,1)}=BYTE{couleur_point%}*c0 BYTE{ADD(param_obje%,2)}=BYTE{SUCC(couleur_point%)}*c0 BYTE{ADD(param_obje%,3)}=BYTE{ADD(couleur_point%,2)}*c0 ENDIF INT{ADD(param_obje%,8)}=0 ! Pas de contour ENDIF ' Pas de tramage INT{ADD(param_obje%,10)}=0 ' Couleur du contour BYTE{ADD(param_obje%,5)}=BYTE{couleur_point%}*c0 BYTE{ADD(param_obje%,6)}=BYTE{SUCC(couleur_point%)}*c0 BYTE{ADD(param_obje%,7)}=BYTE{ADD(couleur_point%,2)}*c0 ' Adresse trame {ADD(param_obje%,12)}=tracer_trame_tab% ELSE ! 1/2/4/8 plans palette systŠme ' c_l&=INT{ADD(univ%,offset_couleur&)} ! Couleur de l'objet valeur de 0 … 15 IF t! {param_obje%}=fond_ecran& ELSE {param_obje%}=c_l& ENDIF ' Couleur du contour {ADD(param_obje%,4)}=c_l& ' Adresse trame IF t! INT{ADD(param_obje%,8)}=1 ! Contour activ‚ INT{ADD(param_obje%,10)}=0 ! Pas de tramage ELSE INT{ADD(param_obje%,8)}=0 ! Pas de contour INT{ADD(param_obje%,10)}=1 ! Tramage activ‚ {ADD(param_obje%,12)}=ADD(trame%,SHL(SUB(255,int&),5)) ENDIF ENDIF {ADD(param_obje%,16)}=0 ! R‚serv‚ pour le gouraud RETURN ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > FUNCTION tri_des_faces_bouknight LOCAL xj&,yj&,wj&,hj& LOCAL jx&,jy&,jw&,jh& LOCAL pasj,ouvert_t! LOCAL ctx%,cty%,ctz% LOCAL tp1%,tp2%,tp3% LOCAL cpt%,numero&,univ% LOCAL adr_fce%,fin_a%,nbft% LOCAL pt_1%,pt_2%,pt_3% LOCAL totf%,k%,adr_ttf% LOCAL m_ix&,m_iy&,tim% ' enleve_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,m_ix&,m_iy&) tim%=TIMER ' CHAR{{OB_SPEC(adr_fenetre%,fenvue06&)}}=CHAR{OB_SPEC(adr_divers%,calcul1&)} redraw_element_fenetre(48,adr_fenetre%,fenvue06&) ' IF mode_jauge! form_center(adr_anajauge%,xj&,yj&,wj&,hj&) xj&=SHL(SHR(xj&,4),4) OB_X(adr_anajauge%,0)=xj& ' pr_f&=@wind_create(0,xj&,yj&,wj&,hj&) IF pr_f&>-1 wind_open(pr_f&,xj&,yj&,wj&,hj&) ENDIF ' objc_draw(adr_anajauge%,0,12,xj&,yj&,wj&,hj&,-1) objc_offset(adr_anajauge%,anaboite&,jx&,jy&) jw&=OB_W(adr_anajauge%,anaboite&) jh&=OB_H(adr_anajauge%,anaboite&) ELSE objc_offset(adr_fenetre%,fenvue06&,jx&,jy&) INC jx& jw&=SUB(OB_W(adr_fenetre%,fenvue06&),2) jh&=OB_H(adr_fenetre%,fenvue06&)\3 ENDIF set_remplissage(4,0,rouge&,tracer_trame_jauge%) set_fill_perimeter_visibility(0) set_writing_mode(mode_transparent|) pasj=jw&/face_maximum% ' {ADD(tracer_proj3d%,36)}=mix& {ADD(tracer_proj3d%,40)}=miy& ' ctx%=ADD(tracer_centre_tab%,16) cty%=ADD(tracer_centre_tab%,20) ctz%=ADD(tracer_centre_tab%,24) tp1%=tr_tmp% tp2%=ADD(tr_tmp%,12) tp3%=ADD(tr_tmp%,24) ' cpt%=-1 CLR numero&,nbft% adr_ttf%=ttf% univ%=univers% DO ' Si le calque contenant l'objet est visible IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(univ%),36)),35)}=1 ' Si l'objet n'est pas masqu‚ IF NOT BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_masque|) ' Si il n'est pas en C.S.G. IF INT{ADD(univ%,offset_relation_csg&)}=-1 ouvert_t!=BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_ouvert|) ouvert_t!=ouvert_t! OR (INT{univ%}=primitive_plan&) ouvert_t!=ouvert_t! OR (INT{univ%}=primitive_disque&) ouvert_t!=ouvert_t! OR (INT{univ%}=primitive_triangle&) ouvert_t!=ouvert_t! OR (BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_facette|) AND BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_in_out|)) ouvert_t!=ouvert_t! OR (BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) AND BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_in_out|)) type_d_objet_en_calcul(numero&,univ%,nbp%,nbf%,adr_obje%,adr_face%) de_reel_vers_vue(adr_obje%,univ%,SUCC(nbp%),TRUE,FALSE) {ADD(tracer_proj3d%,16)}=tr_tmp% ! source ' adr_fce%=ADD(adr_face%,2) fin_a%=ADD(adr_fce%,MUL(SUCC(nbf%),6)) DO IF (@scalaire_camera_filaire(adr_fce%) OR ouvert_t!) OR (NOT filaire_cache!) ' pt_1%=ADD(transfert%,MUL(CARD{adr_fce%},12)) pt_2%=ADD(transfert%,MUL(CARD{ADD(adr_fce%,2)},12)) pt_3%=ADD(transfert%,MUL(CARD{ADD(adr_fce%,4)},12)) BMOVE pt_1%,tp1%,12 BMOVE pt_2%,tp2%,12 BMOVE pt_3%,tp3%,12 ' ---------------------------------------------------------------- bmove(tp1%,ctx%,36) do_barycenter(tracer_centre_tab%) ' ---------------------------------------------------------------- ' IF @possible_en_camera({ctx%},{cty%},{ctz%}) ' ' ************************************************************** ' **** Calcul du Z moyen de la face **** ' ************************************************************** k%=ADD(tr_tmp%,8) totf%=2147483647 totf%=MIN(totf%,{k%}) totf%=MIN(totf%,{ADD(k%,12)}) totf%=MIN(totf%,{ADD(k%,24)}) ' ************************************************************** {adr_ttf%}=totf% ! Total Z de tri CARD{ADD(adr_ttf%,4)}=numero& ! Num‚ro de l'objet {ADD(adr_ttf%,6)}=adr_fce% ! Adresse des faces BMOVE tr_tmp%,ADD(adr_ttf%,10),36 ! Les 3 points en 3D ' ************************************************************** ADD adr_ttf%,taille_zone_ttf% INC cpt% ' ENDIF ENDIF vdi_11(1,jx&,jy&,jx&+(nbft%*pasj),PRED(ADD(jy&,jh&)),0,0,0,0) INC nbft% ADD adr_fce%,6 arret_dessin!=BTST(BIOS(&HB,-1),cl_alternate&) EXIT IF arret_dessin! LOOP WHILE adr_fce%-1 {ADD(tracer_tri_tab%,16)}=ttf% CARD{ADD(tracer_tri_tab%,20)}=0 CARD{ADD(tracer_tri_tab%,22)}=PRED(cpt%) CARD{ADD(tracer_tri_tab%,24)}=taille_zone_ttf% quick_sort zone_dessin_3d%=@prendre(MUL(SUCC(cpt%),taille_zone_3d%),TRUE,3) param_3d%=@prendre(MUL(SUCC(cpt%),20),TRUE,3) ENDIF ' set_remplissage(2,8,fond_ecran&,-1) IF mode_jauge! objc_draw(adr_anajauge%,0,12,jx&,jy&,ADD(wj&,4),ADD(hj&,4),-1) ELSE objc_draw(adr_fenetre%,0,12,jx&,jy&,ADD(wj&,4),ADD(hj&,4),-1) ENDIF place_le_clipping(global_xf&,global_yf&,global_wf&,global_hf&,m_ix&,m_iy&) ' affiche_temp2(tim%) ' RETURN cpt% ' ENDFUNC ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > PROCEDURE position_camera_en_3d LOCAL des%,fo%,r&,v&,b& LOCAL panx,pany,panz,i&,adr_poin% LOCAL cx,cy,vx,vy,i%,tp1%,tp2%,tp3% LOCAL tx&,ty&,dx&,dy& ' IF true_color! inquire_color_representation(bleu&,r&,v&,b&,vdihandle%) BYTE{ADD(tracer_param_tab%,1)}=r&*0.255 BYTE{ADD(tracer_param_tab%,2)}=v&*0.255 BYTE{ADD(tracer_param_tab%,3)}=b&*0.255 ELSE {tracer_param_tab%}=bleu& ENDIF {ADD(tracer_trace_tab%,16)}=coord_polygon% CARD{tracer_trame_tab%}=&HFFFF {ADD(tracer_trace_tab%,30)}=physique% ' ' Calcul et affichage de la cam‚ra en 3D calcul_des_angles_camera bmove(ADD(objet_came%,2),transfert%,408) matrice_zyx(0,180,0,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=2 {ADD(matrice%,4)}=2 {ADD(matrice%,8)}=2 {ADD(tracer_rotattrans%,32)}=34 {ADD(tracer_rotattrans%,36)}=0 {ADD(tracer_rotattrans%,40)}=0 {ADD(tracer_rotattrans%,44)}=0 ro_tr(tracer_rotattrans%) panx=ROUND(SINGLE{mem_subj%},3) pany=ROUND(SINGLE{ADD(mem_subj%,4)},3) panz=ROUND(SINGLE{ADD(mem_subj%,8)},3) matrice_zyx(-rotationx_cam,-rotationy_cam,-rotationz_cam,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=70 {ADD(matrice%,4)}=70 {ADD(matrice%,8)}=70 {ADD(tracer_rotattrans%,32)}=34 {ADD(tracer_rotattrans%,36)}=panx*1024 {ADD(tracer_rotattrans%,40)}=pany*1024 {ADD(tracer_rotattrans%,44)}=panz*1024 ro_tr(tracer_rotattrans%) ' ******** Echelle + Translation + Rotation {ADD(tracer_transrotat%,32)}=34 {ADD(tracer_transrotat%,36)}=-SINGLE{camera%}*1024 {ADD(tracer_transrotat%,40)}=-SINGLE{ADD(camera%,4)}*1024 {ADD(tracer_transrotat%,44)}=-SINGLE{ADD(camera%,8)}*1024 tr_ro(tracer_transrotat%) ' {coord_polygon%}=0 {ADD(coord_polygon%,4)}=tracer_param_tab% tp1%=tr_tmp% tp2%=ADD(tr_tmp%,12) tp3%=ADD(tr_tmp%,24) ' {ADD(tracer_proj3d%,16)}=tr_tmp% {ADD(tracer_proj3d%,20)}=ADD(coord_polygon%,8) {ADD(tracer_proj3d%,36)}=mix& {ADD(tracer_proj3d%,40)}=miy& ' i%=@adresse_face(objet_came%) CLR i& DO BMOVE ADD(transfert%,MUL(CARD{i%},12)),tp1%,12 BMOVE ADD(transfert%,MUL(CARD{ADD(i%,2)},12)),tp2%,12 BMOVE tp1%,tp3%,12 ' c3d2d(tracer_proj3d%) draw_line(tracer_trace_tab%) ' ADD i%,4 INC i& LOOP WHILE i&<54 IF camera_visible! ' Calcul et affichage de la pyramide de cam‚ra en 3D pyramide_camera bmove(ADD(came_pyra%,2),transfert%,60) matrice_zyx(0,180,0,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=2 {ADD(matrice%,4)}=2 {ADD(matrice%,8)}=2 {ADD(tracer_rotattrans%,32)}=5 {ADD(tracer_rotattrans%,36)}=0 {ADD(tracer_rotattrans%,40)}=0 {ADD(tracer_rotattrans%,44)}=0 ro_tr(tracer_rotattrans%) tanx=ROUND(SINGLE{ADD(mem_subj%,12)},3)-ROUND(SINGLE{mem_subj%},3) tany=ROUND(SINGLE{ADD(mem_subj%,16)},3)-ROUND(SINGLE{ADD(mem_subj%,4)},3) tanz=ROUND(SINGLE{ADD(mem_subj%,20)},3)-ROUND(SINGLE{ADD(mem_subj%,8)},3) tan=SQR(tanx^2+tany^2+tanz^2)*2 tan=-tan*(tan<>0)-1*(tan=0) tanx=-tanx*(tanx<>0)-1*(tanx=0) tany=-tany*(tany<>0)-1*(tany=0) tanz=-tanz*(tanz<>0)-1*(tanz=0) panx=ROUND(SINGLE{mem_subj%},3)+ROUND(tanx/2,3) pany=ROUND(SINGLE{ADD(mem_subj%,4)},3)+ROUND(tany/2,3) panz=ROUND(SINGLE{ADD(mem_subj%,8)},3)+ROUND(tanz/2,3) matrice_zyx(-rotationx_cam,-rotationy_cam,-rotationz_cam,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=tan {ADD(matrice%,4)}=tan {ADD(matrice%,8)}=tan {ADD(tracer_rotattrans%,32)}=5 {ADD(tracer_rotattrans%,36)}=panx*1024 {ADD(tracer_rotattrans%,40)}=pany*1024 {ADD(tracer_rotattrans%,44)}=panz*1024 ro_tr(tracer_rotattrans%) ' ******** Echelle + Translation + Rotation {ADD(tracer_transrotat%,32)}=5 {ADD(tracer_transrotat%,36)}=-SINGLE{camera%}*1024 {ADD(tracer_transrotat%,40)}=-SINGLE{ADD(camera%,4)}*1024 {ADD(tracer_transrotat%,44)}=-SINGLE{ADD(camera%,8)}*1024 tr_ro(tracer_transrotat%) ' i%=@adresse_face(came_pyra%) CLR i& DO BMOVE ADD(transfert%,MUL(CARD{i%},12)),tp1%,12 BMOVE ADD(transfert%,MUL(CARD{ADD(i%,2)},12)),tp2%,12 BMOVE tp1%,tp3%,12 ' c3d2d(tracer_proj3d%) draw_line(tracer_trace_tab%) ' ADD i%,4 INC i& LOOP WHILE i&<4 ENDIF RETURN > PROCEDURE positionne_source_en_3d LOCAL lum&,adr_sr%,fin_s%,des%,fo% LOCAL spot!,rotation_spotx,rotation_spoty LOCAL panx,pany,panz,i&,adr_poin% LOCAL cx,cy,vx,vy,i%,r&,v&,b& LOCAL tx&,ty&,dx&,dy&,tp1%,tp2%,tp3% LOCAL lamp_nbp& ' IF true_color! inquire_color_representation(jaune&,r&,v&,b&,vdihandle%) BYTE{ADD(tracer_param_tab%,1)}=r&*0.255 BYTE{ADD(tracer_param_tab%,2)}=v&*0.255 BYTE{ADD(tracer_param_tab%,3)}=b&*0.255 ELSE {tracer_param_tab%}=jaune& ENDIF {ADD(tracer_trace_tab%,16)}=coord_polygon% CARD{tracer_trame_tab%}=&HFFFF {ADD(tracer_trace_tab%,30)}=physique% ' {coord_polygon%}=0 {ADD(coord_polygon%,4)}=tracer_param_tab% tp1%=tr_tmp% tp2%=ADD(tr_tmp%,12) tp3%=ADD(tr_tmp%,24) ' {ADD(tracer_proj3d%,16)}=tr_tmp% {ADD(tracer_proj3d%,20)}=ADD(coord_polygon%,8) {ADD(tracer_proj3d%,36)}=mix& {ADD(tracer_proj3d%,40)}=miy& ' lum&=1 IF true_color! inquire_color_representation(jaune&,r&,v&,b&,vdihandle%) BYTE{table_pour%}=r&*0.255 BYTE{SUCC(table_pour%)}=v&*0.255 BYTE{ADD(table_pour%,2)}=b&*0.255 ENDIF fin_s%=@adresse_source(nombre_de_source&) adr_sr%=source% DO IF BYTE{adr_sr%}=1 spot!=BTST(BYTE{ADD(adr_sr%,1)},bit_spot|) IF spot! ' L…, c'est le dessin du lamp_nbp&=32 ! projecteur qui est objet_projecteur ! utilis‚ ' ELSE ' Par d‚faut, le dessin lamp_nbp&=26 ! du soleil est activ‚. objet_soleil ' ENDIF calcul_des_angles_spot(adr_sr%,rotation_spotx,rotation_spoty) bmove(ADD(objet_proj%,2),transfert%,MUL(lamp_nbp&,12)) matrice_zyx(0,180,0,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=2 {ADD(matrice%,4)}=2 {ADD(matrice%,8)}=2 {ADD(tracer_rotattrans%,32)}=lamp_nbp& {ADD(tracer_rotattrans%,36)}=0 {ADD(tracer_rotattrans%,40)}=0 {ADD(tracer_rotattrans%,44)}=0 ro_tr(tracer_rotattrans%) panx=ROUND(SINGLE{ADD(adr_sr%,8)},3) pany=ROUND(SINGLE{ADD(adr_sr%,12)},3) panz=ROUND(SINGLE{ADD(adr_sr%,16)},3) matrice_zyx(-rotation_spotx,-rotation_spoty,0,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=70 {ADD(matrice%,4)}=70 {ADD(matrice%,8)}=70 {ADD(tracer_rotattrans%,32)}=lamp_nbp& {ADD(tracer_rotattrans%,36)}=panx*1024 {ADD(tracer_rotattrans%,40)}=pany*1024 {ADD(tracer_rotattrans%,44)}=panz*1024 ro_tr(tracer_rotattrans%) ' ******** Echelle + Translation + Rotation {ADD(tracer_transrotat%,32)}=lamp_nbp& {ADD(tracer_transrotat%,36)}=-SINGLE{camera%}*1024 {ADD(tracer_transrotat%,40)}=-SINGLE{ADD(camera%,4)}*1024 {ADD(tracer_transrotat%,44)}=-SINGLE{ADD(camera%,8)}*1024 tr_ro(tracer_transrotat%) ' i%=@adresse_face(objet_proj%) CLR i& DO BMOVE ADD(transfert%,MUL(CARD{i%},12)),tp1%,12 BMOVE ADD(transfert%,MUL(CARD{ADD(i%,2)},12)),tp2%,12 BMOVE tp1%,tp3%,12 ' c3d2d(tracer_proj3d%) draw_line(tracer_trace_tab%) ' ADD i%,4 INC i& LOOP WHILE i&<40 IF spot! ' set_type_de_ligne(jaune&,1,4,0,0,-1) IF camera_visible! cone_spot(adr_sr%) bmove(ADD(spot_cone%,2),transfert%,156) matrice_zyx(0,180,0,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=2 {ADD(matrice%,4)}=2 {ADD(matrice%,8)}=2 {ADD(tracer_rotattrans%,32)}=13 {ADD(tracer_rotattrans%,36)}=0 {ADD(tracer_rotattrans%,40)}=0 {ADD(tracer_rotattrans%,44)}=0 ro_tr(tracer_rotattrans%) tanx=ROUND(SINGLE{ADD(adr_sr%,20)},3)-ROUND(SINGLE{ADD(adr_sr%,8)},3) tany=ROUND(SINGLE{ADD(adr_sr%,24)},3)-ROUND(SINGLE{ADD(adr_sr%,12)},3) tanz=ROUND(SINGLE{ADD(adr_sr%,28)},3)-ROUND(SINGLE{ADD(adr_sr%,16)},3) tan=SQR(tanx^2+tany^2+tanz^2)*2 tan=-tan*(tan<>0)-1*(tan=0) tanx=-tanx*(tanx<>0)-1*(tanx=0) tany=-tany*(tany<>0)-1*(tany=0) tanz=-tanz*(tanz<>0)-1*(tanz=0) panx=ROUND(SINGLE{ADD(adr_sr%,8)},3)+(tanx/2) pany=ROUND(SINGLE{ADD(adr_sr%,12)},3)+(tany/2) panz=ROUND(SINGLE{ADD(adr_sr%,16)},3)+(tanz/2) matrice_zyx(-rotation_spotx,-rotation_spoty,0,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=tan {ADD(matrice%,4)}=tan {ADD(matrice%,8)}=tan {ADD(tracer_rotattrans%,32)}=13 {ADD(tracer_rotattrans%,36)}=panx*1024 {ADD(tracer_rotattrans%,40)}=pany*1024 {ADD(tracer_rotattrans%,44)}=panz*1024 ro_tr(tracer_rotattrans%) ' ******** Echelle + Translation + Rotation {ADD(tracer_transrotat%,32)}=13 {ADD(tracer_transrotat%,36)}=-SINGLE{camera%}*1024 {ADD(tracer_transrotat%,40)}=-SINGLE{ADD(camera%,4)}*1024 {ADD(tracer_transrotat%,44)}=-SINGLE{ADD(camera%,8)}*1024 tr_ro(tracer_transrotat%) ' i%=@adresse_face(spot_cone%) CLR i& DO BMOVE ADD(transfert%,MUL(CARD{i%},12)),tp1%,12 BMOVE ADD(transfert%,MUL(CARD{ADD(i%,2)},12)),tp2%,12 BMOVE tp1%,tp3%,12 ' c3d2d(tracer_proj3d%) draw_line(tracer_trace_tab%) ' ADD i%,4 INC i& LOOP WHILE i&<16 ENDIF ENDIF ENDIF ADD adr_sr%,taille_source& INC lum& LOOP WHILE adr_sr% PROCEDURE coordonnee_source_de_lumiere(vue|,adr_sr%,spot!,VAR cx,cy,vx,vy) $S|,$S> SELECT vue| CASE vue_de_face| cx=ROUND(SINGLE{ADD(adr_sr%,8)},3) cy=-ROUND(SINGLE{ADD(adr_sr%,12)},3) IF spot! vx=ROUND(SINGLE{ADD(adr_sr%,20)},3) vy=-ROUND(SINGLE{ADD(adr_sr%,24)},3) ENDIF CASE vue_de_dos| cx=-ROUND(SINGLE{ADD(adr_sr%,8)},3) cy=-ROUND(SINGLE{ADD(adr_sr%,12)},3) IF spot! vx=-ROUND(SINGLE{ADD(adr_sr%,20)},3) vy=-ROUND(SINGLE{ADD(adr_sr%,24)},3) ENDIF CASE vue_de_gauche| cx=-ROUND(SINGLE{ADD(adr_sr%,16)},3) cy=-ROUND(SINGLE{ADD(adr_sr%,12)},3) IF spot! vx=-ROUND(SINGLE{ADD(adr_sr%,28)},3) vy=-ROUND(SINGLE{ADD(adr_sr%,24)},3) ENDIF CASE vue_de_droite| cx=ROUND(SINGLE{ADD(adr_sr%,16)},3) cy=-ROUND(SINGLE{ADD(adr_sr%,12)},3) IF spot! vx=ROUND(SINGLE{ADD(adr_sr%,28)},3) vy=-ROUND(SINGLE{ADD(adr_sr%,24)},3) ENDIF CASE vue_de_dessus| cx=ROUND(SINGLE{ADD(adr_sr%,8)},3) cy=-ROUND(SINGLE{ADD(adr_sr%,16)},3) IF spot! vx=ROUND(SINGLE{ADD(adr_sr%,20)},3) vy=-ROUND(SINGLE{ADD(adr_sr%,28)},3) ENDIF CASE vue_de_dessous| cx=ROUND(SINGLE{ADD(adr_sr%,8)},3) cy=ROUND(SINGLE{ADD(adr_sr%,16)},3) IF spot! vx=ROUND(SINGLE{ADD(adr_sr%,20)},3) vy=ROUND(SINGLE{ADD(adr_sr%,28)},3) ENDIF ENDSELECT RETURN > PROCEDURE calcul_des_angles_spot(adr_sr%,VAR rotation_spotx,rotation_spoty) LOCAL nox%,noy%,noz% LOCAL cosinus LOCAL hypotenus nox%=ROUND(SINGLE{ADD(adr_sr%,8)},3)-ROUND(SINGLE{ADD(adr_sr%,20)},3) noy%=ROUND(SINGLE{ADD(adr_sr%,12)},3)-ROUND(SINGLE{ADD(adr_sr%,24)},3) noz%=ROUND(SINGLE{ADD(adr_sr%,16)},3)-ROUND(SINGLE{ADD(adr_sr%,28)},3) ' ******************************** Calcul de l'angle de rotation autour de Y hypotenus=SQR((nox%*nox%)+(noz%*noz%)) IF ROUND(hypotenus,8)=0 cosinus=1 ELSE cosinus=noz%/ROUND(hypotenus,8) ENDIF IF ROUND(SINGLE{ADD(adr_sr%,8)},3) PROCEDURE type_d_objet_en_calcul(numer&,uni%,VAR nbp%,nbf%,adr_obje%,adr_face%) LOCAL ad_p%,fin_ad_p%,lar&,hau&,pourcent& LOCAL minx&,maxx&,miny&,maxy&,tx%,ty%,tz%,ptx&,pty&,or_igx&,or_igy& LOCAL tanx,tany,tanz,panx,pany,panz,ranx,rany,ranz,taux_detail& LOCAL adr_f%,mode_facette|,fx&,fy&,fw&,fh&,tp1%,tp2%,tp3% ' ' Taux en pourcentage de qualit‚ d'affichage... ' Si la taille de l'objet affichable et ‚gale au sup‚rieure au pourcentage ' de la taille de la fenˆtre de vue, alors, on l'affiche complŠtement sinon ' on affiche une boŒte … la place. ' taux_detail&=VAL(CHAR{{OB_SPEC(adr_parametres%,chedetai&)}}) ' ' IF taux_detail&>0 ' la_fenetre(fen_act&,fx&,fy&,fw&,fh&) ' ' ' ' R‚cup‚rer les points et faces d'une boŒte englobante pour calcul total ' bmove(ADD(boite_active%,2),transfert%,96) ' IF INT{uni%}=primitive_triangle& ' pour_triangle_active(uni%,panx,pany,panz,tanx,tany,tanz) ' matrice_xyz(0,0,0,matrice%) ' ' ******** Echelle + Rotation + Translation ' {matrice%}=tanx ' {ADD(matrice%,4)}=tany ' {ADD(matrice%,8)}=tanz ' {ADD(tracer_rotattrans%,32)}=8 ' {ADD(tracer_rotattrans%,36)}=panx*1024 ' {ADD(tracer_rotattrans%,40)}=pany*1024 ' {ADD(tracer_rotattrans%,44)}=panz*1024 ' ro_tr(tracer_rotattrans%) ' ELSE ' panx%=ROUND(SINGLE{ADD(uni%,2)},3)*1024 ' pany%=ROUND(SINGLE{ADD(uni%,6)},3)*1024 ' panz%=ROUND(SINGLE{ADD(uni%,10)},3)*1024 ' tanx=ROUND(SINGLE{ADD(uni%,14)},3) ' tany=ROUND(SINGLE{ADD(uni%,18)},3) ' tanz=ROUND(SINGLE{ADD(uni%,22)},3) ' ranx=ROUND(SINGLE{ADD(uni%,26)},3) ' rany=ROUND(SINGLE{ADD(uni%,30)},3) ' ranz=ROUND(SINGLE{ADD(uni%,34)},3) ' matrice_zyx(-ranx,-rany,-ranz,matrice%) ' ' ******** Echelle + Rotation + Translation ' {matrice%}=tanx ' {ADD(matrice%,4)}=tany ' {ADD(matrice%,8)}=tanz ' {ADD(tracer_rotattrans%,32)}=8 ' {ADD(tracer_rotattrans%,36)}=panx*1024 ' {ADD(tracer_rotattrans%,40)}=pany*1024 ' {ADD(tracer_rotattrans%,44)}=panz*1024 ' ro_tr(tracer_rotattrans%) ' ENDIF ' ' ' minx&=32767 ' maxx&=-32768 ' miny&=32767 ' maxy&=-32768 ' fin_ad_p%=ADD(transfert%,96) ' ad_p%=transfert% ' IF dessin_3d|=vue_en_3d| ' {ADD(tracer_proj3d%,20)}=tr_tmp% ! destination ' DO ' {ADD(tracer_proj3d%,16)}=ad_p% ! source ' c3d2d(tracer_proj3d%) ' minx&=MIN(minx&,INT{tr_tmp%}) ! X1& ' miny&=MIN(miny&,INT{ADD(tr_tmp%,2)}) ! Y1& ' minx&=MIN(minx&,INT{ADD(tr_tmp%,4)}) ! X2& ' miny&=MIN(miny&,INT{ADD(tr_tmp%,6)}) ! Y2& ' minx&=MIN(minx&,INT{ADD(tr_tmp%,8)}) ! X3& ' miny&=MIN(miny&,INT{ADD(tr_tmp%,10)}) ! Y3& ' maxx&=MAX(maxx&,INT{tr_tmp%}) ! X1& ' maxy&=MAX(maxy&,INT{ADD(tr_tmp%,2)}) ! Y1& ' maxx&=MAX(maxx&,INT{ADD(tr_tmp%,4)}) ! X2& ' maxy&=MAX(maxy&,INT{ADD(tr_tmp%,6)}) ! Y2& ' maxx&=MAX(maxx&,INT{ADD(tr_tmp%,8)}) ! X3& ' maxy&=MAX(maxy&,INT{ADD(tr_tmp%,10)}) ! Y3& ' ADD ad_p%,36 ' LOOP WHILE ad_p%hau& ' pourcent&=ROUND((lar&/global_wf&)*100) ' ELSE ' pourcent&=ROUND((hau&/global_hf&)*100) ' ENDIF ' ENDIF ' IF (dessin_rapide!=TRUE) !OR (pourcent&<=taux_detail&) adr_obje%={ADD(objet%,4)} adr_face%=@adresse_face(adr_obje%) boite(100) nbp%=CARD{adr_obje%} nbf%=CARD{adr_face%} ELSE type_d_objet(uni%,nbp%,nbf%,adr_obje%,adr_face%) ENDIF RETURN ' ****************************************************************************** ' -------------- Proc‚dure commune aux routines GFA & ASM ---------------------- ' ****************************************************************************** > PROCEDURE type_d_objet(uni%,VAR nbp%,nbf%,adr_obje%,adr_face%) LOCAL pt& ' IF dessin_rapide! adr_obje%={ADD(objet%,4)} adr_face%=@adresse_face(adr_obje%) nbp%=CARD{adr_obje%} nbf%=CARD{adr_face%} ELSE pt&=INT{uni%} adr_obje%=@adresse_point(pt&) adr_face%=@adresse_face(adr_obje%) IF pt&=primitive_triangle& triangle(uni%) ELSE IF pt&=primitive_boite& boite(BYTE{ADD(uni%,offset_rapport&)}) ELSE IF pt&=primitive_tronc_de_cone& tronc_de_cone(BYTE{ADD(uni%,offset_rapport&)}) ELSE IF pt&=primitive_boite_arrondie& boite_arrondi(BYTE{ADD(uni%,offset_rapport&)}) ELSE IF pt&=primitive_disque& disque(BYTE{ADD(uni%,offset_rapport&)}) ELSE IF pt&=primitive_tore& tore(BYTE{ADD(uni%,offset_rapport&)},INT{ADD(uni%,offset_force_blob&)},INT{ADD(uni%,ADD(offset_force_blob&,2))}) adr_face%=@adresse_face(adr_obje%) ENDIF nbp%=CARD{adr_obje%} nbf%=CARD{adr_face%} IF BTST(BYTE{ADD(uni%,offset_drapeau0&)},bit_ouvert|) ' Si c'est un tronc de c“ne ouvert! IF primitives_simples! SUB nbf%,16 ELSE SUB nbf%,24 ENDIF ENDIF ENDIF RETURN ' ****************************************************************************** ' *************** Les calculs servant aux routines ci-dessus ******************* ' ------------------------------------------------------------------------------ ' ****************************************************************************** ' *********** Routines g‚n‚rale pour toutes les autres ASM & GFA *************** ' ****************************************************************************** ' -------- Remplissage de la matrice 3 x 3 pour les calculs 3D > PROCEDURE matrice_xyz(anga,angb,angc,matr%) LOCAL cosa,sina LOCAL cosb,sinb LOCAL cosc,sinc LOCAL m% cosa=COSQ(anga) sina=SINQ(anga) cosb=COSQ(angb) sinb=SINQ(angb) cosc=COSQ(angc) sinc=SINQ(angc) m%=ADD(matr%,12) ' {m%}=(cosb*cosc)*1024 ! e0 {ADD(m%,4)}=(cosb*sinc)*1024 ! e3 {ADD(m%,8)}=(sinb)*1024 ! e6 ' {ADD(m%,12)}=(-sinb*sina*cosc-sinc*cosa)*1024 ! e1 {ADD(m%,16)}=(-sinb*sina*sinc+cosa*cosc)*1024 ! e4 {ADD(m%,20)}=(sina*cosb)*1024 ! e7 ' {ADD(m%,24)}=(-sinb*cosa*cosc+sina*sinc)*1024 ! e2 {ADD(m%,28)}=(-sinb*cosa*sinc-sina*cosc)*1024 ! e5 {ADD(m%,32)}=(cosa*cosb)*1024 ! e8 ' RETURN > PROCEDURE matrice_zyx(anga,angb,angc,matr%) LOCAL cosa,sina LOCAL cosb,sinb LOCAL cosc,sinc LOCAL m% cosa=COSQ(anga) sina=SINQ(anga) cosb=COSQ(angb) sinb=SINQ(angb) cosc=COSQ(angc) sinc=SINQ(angc) m%=ADD(matr%,12) ' {m%}=(cosb*cosc)*1024 ! e0 {ADD(m%,4)}=(sinc*cosa-sina*cosc*sinb)*1024 ! e3 {ADD(m%,8)}=(sinc*sina+cosc*sinb*cosa)*1024 ! e6 ' {ADD(m%,12)}=(-sinc*cosb)*1024 ! e1 {ADD(m%,16)}=(cosc*cosa+sinc*sinb*sina)*1024 ! e4 {ADD(m%,20)}=(sina*cosc-sinc*sinb*cosa)*1024 ! e7 ' {ADD(m%,24)}=(-sinb)*1024 ! e2 {ADD(m%,28)}=(cosb*-sina)*1024 ! e5 {ADD(m%,32)}=(cosb*cosa)*1024 ! e8 ' RETURN ' ****************************************************************************** ' *************** utilisant les routines ASM de Fabien et Loic ***************** ' ****************************************************************************** ' Recherche des angles de rotation sur X et Y par rapport … la cam‚ra > PROCEDURE calcul_des_angles_univer LOCAL nox%,noy%,noz% LOCAL cosinus LOCAL hypotenus ' ************ Calcul des angles de la cam‚ra par la m‚thode de Pythagore nox%=ROUND(SINGLE{camera%},3)-ROUND(SINGLE{ADD(camera%,12)},3) noy%=ROUND(SINGLE{ADD(camera%,4)},3)-ROUND(SINGLE{ADD(camera%,16)},3) noz%=ROUND(SINGLE{ADD(camera%,8)},3)-ROUND(SINGLE{ADD(camera%,20)},3) IF nox%=0 AND noy%=0 AND noz%=0 CLR rotationx,rotationy ELSE ' -------------------------------- Calcul de l'angle de rotation autour de Y hypotenus=SQR(nox%^2+noz%^2) IF ROUND(hypotenus,8)=0 cosinus=1 ELSE cosinus=noz%/ROUND(hypotenus,8) ENDIF IF cosinus>1 cosinus=1 ENDIF IF cosinus<-1 cosinus=-1 ENDIF IF ROUND(SINGLE{camera%},3)1 cosinus=1 ENDIF IF cosinus<-1 cosinus=-1 ENDIF IF ROUND(SINGLE{ADD(camera%,4)},3) PROCEDURE calcul_des_angles_camera LOCAL nox%,noy%,noz% LOCAL cosinus LOCAL hypotenus ' ************ Calcul des angles de la cam‚ra par la m‚thode de Pythagore nox%=ROUND(SINGLE{mem_subj%},3)-ROUND(SINGLE{ADD(mem_subj%,12)},3) noy%=ROUND(SINGLE{ADD(mem_subj%,4)},3)-ROUND(SINGLE{ADD(mem_subj%,16)},3) noz%=ROUND(SINGLE{ADD(mem_subj%,8)},3)-ROUND(SINGLE{ADD(mem_subj%,20)},3) IF nox%=0 AND noy%=0 AND noz%=0 CLR rotationx_cam,rotationy_cam ELSE ' -------------------------------- Calcul de l'angle de rotation autour de Y hypotenus=SQR(nox%^2+noz%^2) IF ROUND(hypotenus,8)=0 cosinus=1 ELSE cosinus=noz%/ROUND(hypotenus,8) ENDIF IF cosinus>1 cosinus=1 ENDIF IF cosinus<-1 cosinus=-1 ENDIF IF ROUND(SINGLE{mem_subj%},3)1 cosinus=1 ENDIF IF cosinus<-1 cosinus=-1 ENDIF IF ROUND(SINGLE{ADD(mem_subj%,4)},3) PROCEDURE de_reel_vers_vue(adr_oo%,u_n%,n_b%,ind!,bez!) LOCAL z_o_a%,z_p_a% LOCAL panx%,pany%,panz% LOCAL tanx,tany,tanz LOCAL ranx,rany,ranz bmove(ADD(adr_oo%,2),transfert%,MUL(n_b%,12)) IF INT{u_n%}<>primitive_triangle& IF bez! IF deplace_point_de_controle! panx%={mem_num%} pany%={ADD(mem_num%,4)} panz%={ADD(mem_num%,8)} ELSE panx%=(ROUND(SINGLE{ADD(u_n%,2)},3)*1024) pany%=(ROUND(SINGLE{ADD(u_n%,6)},3)*1024) panz%=(ROUND(SINGLE{ADD(u_n%,10)},3)*1024) ' centre_point_control(transfert%,panx%,pany%,panz%) ENDIF tanx=2 tany=2 tanz=2 matrice_zyx(0,0,0,matrice%) {matrice%}=2 {ADD(matrice%,4)}=2 {ADD(matrice%,8)}=2 {ADD(tracer_rotattrans%,32)}=n_b% {ADD(tracer_rotattrans%,36)}=-panx% {ADD(tracer_rotattrans%,40)}=-pany% {ADD(tracer_rotattrans%,44)}=-panz% ro_tr(tracer_rotattrans%) ELSE tanx=ROUND(SINGLE{ADD(u_n%,14)},3) tany=ROUND(SINGLE{ADD(u_n%,18)},3) tanz=ROUND(SINGLE{ADD(u_n%,22)},3) ENDIF panx%=(ROUND(SINGLE{ADD(u_n%,2)},3)*1024) pany%=(ROUND(SINGLE{ADD(u_n%,6)},3)*1024) panz%=(ROUND(SINGLE{ADD(u_n%,10)},3)*1024) ranx=ROUND(SINGLE{ADD(u_n%,26)},3) rany=ROUND(SINGLE{ADD(u_n%,30)},3) ranz=ROUND(SINGLE{ADD(u_n%,34)},3) ' IF tourne_en_3d! ' matrice_zyx(0,-rany,0,matrice%) ' matrice_zyx(-ranx,0,0,matrice%) ' ELSE matrice_zyx(-ranx,-rany,-ranz,matrice%) ' ENDIF ' ******** Echelle + Rotation + Translation {matrice%}=tanx {ADD(matrice%,4)}=tany {ADD(matrice%,8)}=tanz {ADD(tracer_rotattrans%,32)}=n_b% {ADD(tracer_rotattrans%,36)}=panx% {ADD(tracer_rotattrans%,40)}=pany% {ADD(tracer_rotattrans%,44)}=panz% ro_tr(tracer_rotattrans%) ENDIF IF ind! ' ******** Echelle + Translation + Rotation {ADD(tracer_transrotat%,32)}=n_b% {ADD(tracer_transrotat%,36)}=-SINGLE{camera%}*1024 {ADD(tracer_transrotat%,40)}=-SINGLE{ADD(camera%,4)}*1024 {ADD(tracer_transrotat%,44)}=-SINGLE{ADD(camera%,8)}*1024 tr_ro(tracer_transrotat%) ENDIF RETURN > PROCEDURE de_reel_vers_vue_pour_une_face(adr_oo%,adr_fc%,u_n%,ind!) LOCAL z_o_a%,z_p_a% LOCAL panx%,pany%,panz% LOCAL tanx,tany,tanz LOCAL ranx,rany,ranz LOCAL adr_tra% ' BMOVE ADD(ADD(adr_oo%,2),MUL(CARD{adr_fc%},12)),transfert%,12 BMOVE ADD(ADD(adr_oo%,2),MUL(CARD{ADD(adr_fc%,2)},12)),ADD(transfert%,12),12 BMOVE ADD(ADD(adr_oo%,2),MUL(CARD{ADD(adr_fc%,4)},12)),ADD(transfert%,24),12 IF INT{u_n%}<>primitive_triangle& panx%=ROUND(SINGLE{ADD(u_n%,2)},3)*1024 pany%=ROUND(SINGLE{ADD(u_n%,6)},3)*1024 panz%=ROUND(SINGLE{ADD(u_n%,10)},3)*1024 tanx=ROUND(SINGLE{ADD(u_n%,14)},3) tany=ROUND(SINGLE{ADD(u_n%,18)},3) tanz=ROUND(SINGLE{ADD(u_n%,22)},3) ranx=ROUND(SINGLE{ADD(u_n%,26)},3) rany=ROUND(SINGLE{ADD(u_n%,30)},3) ranz=ROUND(SINGLE{ADD(u_n%,34)},3) matrice_zyx(-ranx,-rany,-ranz,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=tanx {ADD(matrice%,4)}=tany {ADD(matrice%,8)}=tanz {ADD(tracer_rotattrans%,32)}=3 {ADD(tracer_rotattrans%,36)}=panx% {ADD(tracer_rotattrans%,40)}=pany% {ADD(tracer_rotattrans%,44)}=panz% ro_tr(tracer_rotattrans%) ENDIF IF ind! ' ******** Echelle + Translation + Rotation {ADD(tracer_transrotat%,32)}=3 {ADD(tracer_transrotat%,36)}=-SINGLE{camera%}*1024 {ADD(tracer_transrotat%,40)}=-SINGLE{ADD(camera%,4)}*1024 {ADD(tracer_transrotat%,44)}=-SINGLE{ADD(camera%,8)}*1024 tr_ro(tracer_transrotat%) ENDIF RETURN ' ****************************************************************************** ' **** Les routines de gestion du Gouraud et du Phong (C) BARANGER E. **** ' ****************************************************************************** > PROCEDURE refaire_toutes_les_normales(deb&,fin&,jau!,mem!) LOCAL num_ob&,nbp%,nbf%,adr_obje%,adr_face%,vect_norm%,pr_f&,paso LOCAL jx&,jy&,jw&,jh&,jy2&,u_n_iv% LOCAL xj&,yj&,wj&,hj&,tim% ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' Cr‚ation des tables des vecteurs normaux des objets ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ redimention!=FALSE changement_de_taille_transfert_et_ttf INC fin& IF jau! form_center(adr_anajauge%,xj&,yj&,wj&,hj&) xj&=SHL(SHR(xj&,4),4) OB_X(adr_anajauge%,0)=xj& ' pr_f&=@wind_create(0,xj&,yj&,wj&,hj&) IF pr_f&>-1 wind_open(pr_f&,xj&,yj&,wj&,hj&) ENDIF objc_draw(adr_anajauge%,0,12,xj&,yj&,wj&,hj&,-1) objc_offset(adr_anajauge%,anaboite&,jx&,jy&) jw&=OB_W(adr_anajauge%,anaboite&) jh&=DIV(OB_H(adr_anajauge%,anaboite&),2) jy2&=ADD(jy&,jh&) paso=jw&/SUB(fin&,deb&) set_fill_perimeter_visibility(0) ' ELSE ' jx&=-1 ' jy2&=-1 ' jw&=-1 ' jh&=1 ' anime_souris&=SUCC(mouse_world&) ENDIF num_ob&=deb& DO u_n_iv%=@adresse_objet(num_ob&) type_d_objet_en_calcul(num_ob&,u_n_iv%,nbp%,nbf%,adr_obje%,adr_face%) INC nbp% de_reel_vers_vue(adr_obje%,u_n_iv%,nbp%,FALSE,FALSE) IF mem! libere(ADD(edge%,SHL(num_ob&,2))) {ADD(edge%,SHL(num_ob&,2))}=@prendre(MUL(nbp%,14),TRUE,3) vect_norm%=@adresse_edge(num_ob&) ELSE vect_norm%=@adresse_edge(num_ob&) membfill(vect_norm%,MUL(nbp%,14),0) ENDIF IF jau! IF maxcol&<15 set_remplissage(2,2,noir&,-1) ELSE set_remplissage(4,0,vert&,tracer_trame_jauge%) ENDIF ENDIF set_fill_perimeter_visibility(0) IF maxcol&>3 set_writing_mode(mode_transparent|) ENDIF toutes_les_normales(adr_face%,vect_norm%,u_n_iv%,jx&,jy2&,jw&,PRED(ADD(jy2&,jh&))) IF maxcol&>3 set_writing_mode(mode_remplace|) ENDIF set_fill_perimeter_visibility(1) INC num_ob& IF jau! IF maxcol&<15 set_remplissage(2,5,noir&,-1) ELSE set_remplissage(4,0,rouge&,tracer_trame_jauge%) ENDIF set_fill_perimeter_visibility(0) set_writing_mode(mode_transparent|) vdi_11(1,jx&,jy&,jx&+(num_ob&*paso),PRED(ADD(jy&,jh&)),0,0,0,0) set_writing_mode(mode_remplace|) set_fill_perimeter_visibility(1) ENDIF LOOP WHILE num_ob&-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' ELSE ' graf_mouse(fleche&,0) ENDIF ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETURN > PROCEDURE toutes_les_normales(adr_face%,zo_in%,u_n_iv%,j_x&,j_y&,j_w&,j_y2&) LOCAL nbpf_&,fa%,adr_l%,adr_l1%,adr_l2%,adr_l3%,pasf,mem_adr_p% LOCAL pt1%,pt2%,pt3%,nb_f%,bez_t!,face_en_cour% LOCAL x1%,y1%,z1%,test_ok! LOCAL x2%,y2%,z2% LOCAL x3%,y3%,z3% LOCAL xn%,yn%,zn% LOCAL xt%,yt%,zt% ' nb_f%=SUCC(CARD{adr_face%}) CLR fa% pasf=j_w&/nb_f% test_ok!=(INT{u_n_iv%}=primitive_triangle&) test_ok!=test_ok! OR (INT{u_n_iv%}=primitive_disque&) ' test_ok!=test_ok! OR (BTST(BYTE{ADD(u_n_iv%,offset_drapeau0&)},bit_facette|)) ' test_ok!=test_ok! OR (BTST(BYTE{ADD(u_n_iv%,offset_drapeau0&)},bit_bicubic|)) face_en_cour%=ADD(adr_face%,2) DO IF j_x&<>-1 ' graf_mouse(m_off&,0) vdi_11(1,j_x&,j_y&,j_x&+(fa%*pasf),j_y2&,0,0,0,0) ' graf_mouse(m_on&,0) ENDIF ' Alors l…, on calcul la normale … la facette en son centre, puis ' on applique cette normale en chacun des points avec accumulation des ' normales trouv‚es en chaque points pour pouvoir en faire une moyenne ' pond‚r‚e. ' pt1%=CARD{face_en_cour%} pt2%=CARD{ADD(face_en_cour%,2)} pt3%=CARD{ADD(face_en_cour%,4)} ' Adresse des trois points adr_l1%=ADD(transfert%,MUL(pt1%,12)) adr_l2%=ADD(transfert%,MUL(pt2%,12)) adr_l3%=ADD(transfert%,MUL(pt3%,12)) ' Coordonn‚es du premier point x1%={adr_l1%} y1%={ADD(adr_l1%,4)} z1%={ADD(adr_l1%,8)} ' Coordonn‚es du second point x2%={adr_l2%} y2%={ADD(adr_l2%,4)} z2%={ADD(adr_l2%,8)} ' Coordonn‚es du trosiŠme point x3%={adr_l3%} y3%={ADD(adr_l3%,4)} z3%={ADD(adr_l3%,8)} ' BMOVE adr_l1%,ADD(tracer_lestrois_tab%,16),12 BMOVE adr_l2%,ADD(tracer_lestrois_tab%,28),12 BMOVE adr_l3%,ADD(tracer_lestrois_tab%,40),12 ' do_all(tracer_lestrois_tab%) ' xn%={ADD(tracer_lestrois_tab%,16)} ! Normale normalis‚e yn%={ADD(tracer_lestrois_tab%,20)} ! et centr‚e sur zn%={ADD(tracer_lestrois_tab%,24)} ! la facette ' Pour le premier point adr_l%=ADD(zo_in%,MUL(pt1%,14)) IF test_ok! ! Scalaire IF ADD(ADD(MUL(ADD(x1%,xn%),x1%),MUL(ADD(y1%,yn%),y1%)),MUL(ADD(z1%,zn%),z1%))=>0 CARD{adr_l%}=SUCC(CARD{adr_l%}) {ADD(adr_l%,2)}=ADD({ADD(adr_l%,2)},xn%) {ADD(adr_l%,6)}=ADD({ADD(adr_l%,6)},yn%) {ADD(adr_l%,10)}=ADD({ADD(adr_l%,10)},zn%) ENDIF ELSE CARD{adr_l%}=SUCC(CARD{adr_l%}) {ADD(adr_l%,2)}=ADD({ADD(adr_l%,2)},xn%) {ADD(adr_l%,6)}=ADD({ADD(adr_l%,6)},yn%) {ADD(adr_l%,10)}=ADD({ADD(adr_l%,10)},zn%) ENDIF ' Pour le deuxiŠme point adr_l%=ADD(zo_in%,MUL(pt2%,14)) IF test_ok! ! Scalaire IF ADD(ADD(MUL(ADD(x2%,xn%),x2%),MUL(ADD(y2%,yn%),y2%)),MUL(ADD(z2%,zn%),z2%))=>0 CARD{adr_l%}=SUCC(CARD{adr_l%}) {ADD(adr_l%,2)}=ADD({ADD(adr_l%,2)},xn%) {ADD(adr_l%,6)}=ADD({ADD(adr_l%,6)},yn%) {ADD(adr_l%,10)}=ADD({ADD(adr_l%,10)},zn%) ENDIF ELSE CARD{adr_l%}=SUCC(CARD{adr_l%}) {ADD(adr_l%,2)}=ADD({ADD(adr_l%,2)},xn%) {ADD(adr_l%,6)}=ADD({ADD(adr_l%,6)},yn%) {ADD(adr_l%,10)}=ADD({ADD(adr_l%,10)},zn%) ENDIF ' Pour le troisiŠme point adr_l%=ADD(zo_in%,MUL(pt3%,14)) IF test_ok! ! Scalaire IF ADD(ADD(MUL(ADD(x3%,xn%),x3%),MUL(ADD(y3%,yn%),y3%)),MUL(ADD(z3%,zn%),z3%))=>0 CARD{adr_l%}=SUCC(CARD{adr_l%}) {ADD(adr_l%,2)}=ADD({ADD(adr_l%,2)},xn%) {ADD(adr_l%,6)}=ADD({ADD(adr_l%,6)},yn%) {ADD(adr_l%,10)}=ADD({ADD(adr_l%,10)},zn%) ENDIF ELSE CARD{adr_l%}=SUCC(CARD{adr_l%}) {ADD(adr_l%,2)}=ADD({ADD(adr_l%,2)},xn%) {ADD(adr_l%,6)}=ADD({ADD(adr_l%,6)},yn%) {ADD(adr_l%,10)}=ADD({ADD(adr_l%,10)},zn%) ENDIF ' INC fa% ADD face_en_cour%,6 LOOP WHILE fa%-1 objc_draw(adr_anajauge%,0,12,j_x&,j_y&,j_w&,SUCC(SUB(j_y2&,j_y&)),-1) ENDIF RETURN > FUNCTION scalaire_camera LOCAL zzx%,zzy%,zzz% ! centre de la face consid‚r‚e LOCAL r0%,r1%,r2% LOCAL s0%,s1%,s2% LOCAL sca_nor,t% ' t%=transfert% IF {t%}={ADD(t%,24)} AND {ADD(t%,4)}={ADD(t%,28)} AND {ADD(t%,8)}={ADD(t%,32)} RETURN TRUE ELSE bmove(transfert%,ADD(tracer_lestrois_tab%,16),36) ! Les trois points do_all(tracer_lestrois_tab%) ' r0%={ADD(tracer_lestrois_tab%,16)} ! Le vecteur normal normalis‚ r1%={ADD(tracer_lestrois_tab%,20)} r2%={ADD(tracer_lestrois_tab%,24)} ' zzx%={ADD(tracer_lestrois_tab%,40)} ! Le barycentre de la face zzy%={ADD(tracer_lestrois_tab%,44)} zzz%={ADD(tracer_lestrois_tab%,48)} ' Vecteur allant de la cam‚ra - centre de la face face s0%=zzx% ! Focale sur X = 0 s1%=zzy% ! Focale sur Y = 0 s2%=zzz%-SHL(focale&,10) ! Focale de la cam‚ra sur Z ' sca_nor=(s0%*r0%)+(s1%*r1%)+(s2%*r2%) ' RETURN (sca_nor<=0) ENDIF ENDFUNC > FUNCTION scalaire_camera_filaire(j%) LOCAL zzx%,zzy%,zzz% ! centre de la face consid‚r‚e LOCAL r0%,r1%,r2% LOCAL s0%,s1%,s2% LOCAL sca_nor,t% ' ------------------------------- Premier point ------------------------------ BMOVE ADD(transfert%,MUL(CARD{j%},12)),ADD(tracer_lestrois_tab%,16),12 ' ------------------------------- DeuxiŠme point ----------------------------- BMOVE ADD(transfert%,MUL(CARD{ADD(j%,2)},12)),ADD(tracer_lestrois_tab%,28),12 ' ------------------------------- TroisiŠme point ---------------------------- BMOVE ADD(transfert%,MUL(CARD{ADD(j%,4)},12)),ADD(tracer_lestrois_tab%,40),12 ' IF {ADD(tracer_lestrois_tab%,16)}={ADD(tracer_lestrois_tab%,40)} IF {ADD(tracer_lestrois_tab%,20)}={ADD(tracer_lestrois_tab%,44)} IF {ADD(tracer_lestrois_tab%,24)}={ADD(tracer_lestrois_tab%,48)} RETURN TRUE ENDIF ENDIF ENDIF do_all(tracer_lestrois_tab%) ' r0%={ADD(tracer_lestrois_tab%,16)} ! Le vecteur normal normalis‚ r1%={ADD(tracer_lestrois_tab%,20)} r2%={ADD(tracer_lestrois_tab%,24)} ' zzx%={ADD(tracer_lestrois_tab%,40)} ! Le barycentre de la face zzy%={ADD(tracer_lestrois_tab%,44)} zzz%={ADD(tracer_lestrois_tab%,48)} ' ' Vecteur allant de la cam‚ra - centre de la face face s0%=zzx% ! Focale sur X = 0 s1%=zzy% ! Focale sur Y = 0 s2%=zzz%-SHL(focale&,10) ! Focale de la cam‚ra sur Z ' sca_nor=(s0%*r0%)+(s1%*r1%)+(s2%*r2%) ' RETURN (sca_nor<=0) ENDFUNC > FUNCTION visible_de_camera LOCAL zzx%,zzy%,zzz% ! centre de la face consid‚r‚e LOCAL r0%,r1%,r2% LOCAL r0,r1,r2 LOCAL s0,s1,s2 LOCAL taille,sca_fac ' bmove(transfert%,ADD(tracer_lestrois_tab%,16),36) ! Les trois points do_all(tracer_lestrois_tab%) r0%={ADD(tracer_lestrois_tab%,16)} ! Le vecteur normal normalis‚ r1%={ADD(tracer_lestrois_tab%,20)} r2%={ADD(tracer_lestrois_tab%,24)} zzx%={ADD(tracer_lestrois_tab%,40)} ! Le barycentre de la face zzy%={ADD(tracer_lestrois_tab%,44)} zzz%={ADD(tracer_lestrois_tab%,48)} ' Vecteur allant de la cam‚ra vers le point de vis‚e de la cam‚ra r0=ROUND(SINGLE{ADD(camera%,12)},3)-ROUND(SINGLE{camera%},3) r1=ROUND(SINGLE{ADD(camera%,16)},3)-ROUND(SINGLE{ADD(camera%,4)},3) r2=ROUND(SINGLE{ADD(camera%,20)},3)-ROUND(SINGLE{ADD(camera%,8)},3) ' Vecteur allant de la cam‚ra vers le centre de la face s0=ROUND(zzx%/1024,3)-ROUND(SINGLE{camera%},3) s1=ROUND(zzy%/1024,3)-ROUND(SINGLE{ADD(camera%,4)},3) s2=ROUND(zzz%/1024,3)-ROUND(SINGLE{ADD(camera%,8)},3) taille=SQR((r0^2)+(r1^2)+(r2^2)) taille=-1*(taille=0)-taille*(taille<>0) r0=r0/taille r1=r1/taille r2=r2/taille taille=SQR((s0^2)+(s1^2)+(s2^2)) taille=-1*(taille=0)-taille*(taille<>0) s0=s0/taille s1=s1/taille s2=s2/taille ' sca_fac=(r0*s0)+(r1*s1)+(r2*s2) ' RETURN (sca_fac>0.77) ' ENDFUNC > FUNCTION possible_en_camera(zzx%,zzy%,zzz%) LOCAL s0,s1,s2 LOCAL taille ' ' Vecteur allant de la cam‚ra vers le centre de la face s0=-ROUND(zzx%/1024,3) s1=-ROUND(zzy%/1024,3) s2=-ROUND(zzz%/1024,3) taille=SQR((s0^2)+(s1^2)+(s2^2)) taille=-1*(taille=0)-taille*(taille<>0) s0=s0/taille s1=s1/taille s2=s2/taille ' RETURN (s2>0.77) ' ENDFUNC > FUNCTION intensite_lumiere(un_%,zzx%,zzy%,zzz%,r0%,r1%,r2%) ' ............................................................................ ' .... Utilisation d'un d‚riv‚ de l'‚quation de WHITTED. D'aprŠs l'article ... ' .... paru dans ST Magazine Nø80 sign‚ Elys‚e ADE. ... ' ............................................................................ LOCAL pnx%,pny%,pnz% ! D‚placement des sources en fonction de l'objet LOCAL ro|,ve|,bl| ! Composantes rouge, vert, bleu des couleurs LOCAL ksr,ksv,ksb ! Composantes rouge, vert, bleu de r‚flexion sp‚culaire LOCAL kar,kav,kab ! Composantes rouge, vert, bleu de lumiŠre ambiente LOCAL s0%,s1%,s2% ! Pour les calculs LOCAL taille ! Pour la r‚duction … des vecteur unitaires LOCAL fin_s%,adr_sr% ! Variables de bouclages LOCAL tx1%,ty1%,tz1% ! Position des lampes LOCAL px1%,py1%,pz1% ! Point de vis‚ des lampes LOCAL lum_act& ! Nombre de lumiŠres allum‚es LOCAL ig ' LOCAL i ! Intensit‚ caclul‚e du point ' LOCAL ka ! Coefficient de la lumiŠre ambiante LOCAL kd ! Coefficient de diffusion LOCAL ks ! Coefficient de r‚flexion sp‚culaire LOCAL kt ! Coefficient de transmission LOCAL ia ! Intensit‚ de la lumiŠre ambiante LOCAL in ! Intensit‚ de la source lumineuse LOCAL ns ! Puissance du reflet sp‚culaire LOCAL nt ! Puissance de la lumiŠre transmise LOCAL hp ! Vecteur lumineux exprim‚ par H'= (L-nV)/(n-1) LOCAL n ! Rapport entre les milieux 1 et 2 i.e = n1/n2 ' LOCAL lx,ly,lz ! Vecteur incident (la source lumineuse) LOCAL hx,hy,hz ! Vecteur lumineux exprim‚ par H = (L + V)/2 LOCAL vx,vy,vz ! Vecteur vision, il joint le point d'intersection LOCAL nx,ny,nz ! Vecteur normal … la face ' LOCAL n.l ! Produit scalaire Vecteur incident/normale … la face LOCAL n.h ! Produit scalaire Vecteur vision/normale … la face ' ============================================================================ kar=SINGLE{ADD(coef_rendu%,20)} ! Rouge kav=SINGLE{ADD(coef_rendu%,24)} ! Vert kab=SINGLE{ADD(coef_rendu%,28)} ! Bleu ka=(kar+kav+kab)/3 ! Co‚fficient d'ambience ' ============================================================================ kd=SINGLE{ADD(coef_rendu%,16)} ! Co‚fficient de diffusion ' ============================================================================ ' Couleur de la lumiŠre ambiante de l'objet ksr=SINGLE{coef_rendu%} ! Rouge ksv=SINGLE{ADD(coef_rendu%,4)} ! Vert ksb=SINGLE{ADD(coef_rendu%,8)} ! Bleu ks=(ksr+ksv+ksb)/3 ! Coefficient sp‚culaire ' ============================================================================ ' kt ' ============================================================================ ' Couleur ambiente d‚finie dans la fenˆtre d'exportation principale ro|=127 ! Rouge ve|=127 ! Vert bl|=127 ! Bleu ' Son intensit‚ ia=(((ro|*0.299)+(ve|*0.587)+(bl|*0.114))/255) ' ============================================================================ ' Normale … la face en un point rapport‚e … un vecteur unitaire taille=SQR(r0%^2+r1%^2+r2%^2) taille=-1*(taille=0)-taille*(taille<>0) nx=r0%/taille ny=r1%/taille nz=r2%/taille ' ============================================================================ ' Vecteur allant de la face … la camera s0%=-zzx% s1%=-zzy% s2%=SUB(MUL(focale&,1024),zzz%) ' Rapport‚e … un vecteur unitaire taille=SQR(s0%^2+s1%^2+s2%^2) taille=-1*(taille=0)-taille*(taille<>0) vx=s0%/taille vy=s1%/taille vz=s2%/taille ' ============================================================================ ns=SINGLE{ADD(coef_rendu%,12)} ! Puissance du reflet sp‚culaire ' ============================================================================ pnx%=ROUND(SINGLE{ADD(un_%,2)},3)*1024 pny%=ROUND(SINGLE{ADD(un_%,6)},3)*1024 pnz%=ROUND(SINGLE{ADD(un_%,10)},3)*1024 ' CLR ig,lum_act& fin_s%=@adresse_source(nombre_de_source&) adr_sr%=source% $C+ DO IF BYTE{adr_sr%}=1 AND (NOT BTST(BYTE{ADD(adr_sr%,1)},bit_objet_lie|)) ' ======================================================================== ' Intensit‚ de la source (de 0 … 1) ro|=BYTE{ADD(adr_sr%,4)} ve|=BYTE{ADD(adr_sr%,5)} bl|=BYTE{ADD(adr_sr%,6)} in=(((ro|*0.299)+(ve|*0.587)+(bl|*0.114))/255) ' ======================================================================== ' Position de la source dans l'univers en vue camera tx1%=-ROUND(SINGLE{ADD(adr_sr%,8)},6)*1024 ty1%=-ROUND(SINGLE{ADD(adr_sr%,12)},6)*1024 tz1%=-ROUND(SINGLE{ADD(adr_sr%,16)},6)*1024 ADD tx1%,pnx% ADD ty1%,pny% ADD tz1%,pnz% ' ======================================================================== IF BTST(BYTE{ADD(adr_sr%,1)},bit_spot|) ' La source est un spot, point de vis‚ de la lampe px1%=-ROUND(SINGLE{ADD(adr_sr%,20)},6)*1024 py1%=-ROUND(SINGLE{ADD(adr_sr%,24)},6)*1024 pz1%=-ROUND(SINGLE{ADD(adr_sr%,28)},6)*1024 ADD px1%,pnx% ADD py1%,pny% ADD pz1%,pnz% ELSE ' La source est classique, point de vis‚ sur le centre de la face px1%=zzx% py1%=zzy% pz1%=zzz% ENDIF ' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ' //////////////////////////////////////////////////////////////////////// ' Vecteur de la normale a la source elle mˆme s0%=SUB(px1%,tx1%) s1%=SUB(py1%,ty1%) s2%=SUB(pz1%,tz1%) ' Rapport‚e … un vecteur unitaire taille=SQR(s0%^2+s1%^2+s2%^2) taille=-1*(taille=0)-taille*(taille<>0) lx=s0%/taille ly=s1%/taille lz=s2%/taille ' ........................................ n.l=(nx*lx)+(ny*ly)+(nz*lz) ! Le scalaire N.L n.l=0*(n.l<0)-n.l*(n.l=>0) ' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ' //////////////////////////////////////////////////////////////////////// hx=(lx+vx)/2 hy=(ly+vy)/2 hz=(lz+vz)/2 ' Rapport‚e … un vecteur unitaire taille=SQR(hx^2+hy^2+hz^2) taille=-1*(taille=0)-taille*(taille<>0) hx=hx/taille hy=hy/taille hz=hz/taille ' ........................................ n.h=(nx*hx)+(ny*hy)+(nz*hz) ! Le scalaire N.H n.h=0*(n.h<0)-n.h*(n.h=>0) ' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ' //////////////////////////////////////////////////////////////////////// ' ig=ig+(in*(kd*(n.l)+ks*(n.h)^ns)) ' INC lum_act& ENDIF ADD adr_sr%,taille_source& LOOP WHILE adr_sr%1)-i*(i=>0 AND i<=1) ' RETURN i ! Tout est OK, on renvoie l'intensit‚ calcul‚e ' ENDFUNC ' > PROCEDURE face_gouraud(adr_f%,co&,fx&,fw&,z_buf%,xint%,bint%,zpte%,xgau%,yhau%,imin%,zmin%,xdro%,ybas%,imax%,zmax%,lar_gou&) LOCAL inter%,g%,gi%,fin_x&,j%,fin_j%,adf%,adi% LOCAL fxx&,b%,stockee%,z_bu%,adr_i%,interpolat LOCAL db&,c,y_ecran&,y_ecr_min&,y_ecr_max& LOCAL x&,y&,b&,bx%,by%,bz%,z%,dx&,dz% LOCAL x1&,y1&,b1&,bx1%,by1%,bz1%,z1% LOCAL x_int%,b_int%,z_pte% LOCAL x_gau%,y_hau%,i_min%,z_min% LOCAL x_dro%,y_bas%,i_max%,z_max% LOCAL depx,depy&,vraix&,vraiy& objc_offset(adr_vue_fine%,gourphon&,depx&,depy&) ' fxx&=PRED(ADD(fx&,fw&)) adr_i%=mem_vid% ' x&=INT{adr_f%} y&=INT{ADD(adr_f%,2)} y_ecr_min&=y& y_ecr_max&=y& b&=BYTE{adr_i%} z%={ADD(adr_i%,2)} adf%=ADD(adr_f%,4) adi%=ADD(adr_i%,6) x_gau%=xgau% y_hau%=yhau% i_min%=imin% z_min%=zmin% ' x_dro%=xdro% y_bas%=ybas% i_max%=imax% z_max%=zmax% ' -------------------- Premier point ----------------------------------------- x1&=INT{adf%} y1&=INT{ADD(adf%,2)} y_ecr_min&=MIN(y_ecr_min&,y1&) y_ecr_max&=MAX(y_ecr_max&,y1&) b1&=BYTE{adi%} z1%={ADD(adi%,2)} IF y1&=>y& INT{x_gau%}=x& INT{y_hau%}=y& INT{i_min%}=b& {z_min%}=z% INT{x_dro%}=x1& INT{y_bas%}=y1& INT{i_max%}=b1& {z_max%}=z1% ELSE INT{x_gau%}=x1& INT{y_hau%}=y1& INT{i_min%}=b1& {z_min%}=z1% INT{x_dro%}=x& INT{y_bas%}=y& INT{i_max%}=b& {z_max%}=z% ENDIF x&=x1& y&=y1& b&=b1& z%=z1% ADD adf%,4 ADD adi%,6 ' ADD x_gau%,2 ADD y_hau%,2 ADD i_min%,2 ADD z_min%,4 ' ADD x_dro%,2 ADD y_bas%,2 ADD i_max%,2 ADD z_max%,4 ' -------------------- DeuxiŠme point ---------------------------------------- x1&=INT{adf%} y1&=INT{ADD(adf%,2)} y_ecr_min&=MIN(y_ecr_min&,y1&) y_ecr_max&=MAX(y_ecr_max&,y1&) b1&=BYTE{adi%} z1%={ADD(adi%,2)} IF y1&=>y& INT{x_gau%}=x& INT{y_hau%}=y& INT{i_min%}=b& {z_min%}=z% INT{x_dro%}=x1& INT{y_bas%}=y1& INT{i_max%}=b1& {z_max%}=z1% ELSE INT{x_gau%}=x1& INT{y_hau%}=y1& INT{i_min%}=b1& {z_min%}=z1% INT{x_dro%}=x& INT{y_bas%}=y& INT{i_max%}=b& {z_max%}=z% ENDIF x&=x1& y&=y1& b&=b1& z%=z1% ADD adf%,4 ADD adi%,6 ' ADD x_gau%,2 ADD y_hau%,2 ADD i_min%,2 ADD z_min%,4 ' ADD x_dro%,2 ADD y_bas%,2 ADD i_max%,2 ADD z_max%,4 ' -------------------- TroisiŠme point --------------------------------------- x1&=INT{adf%} y1&=INT{ADD(adf%,2)} y_ecr_min&=MIN(y_ecr_min&,y1&) y_ecr_max&=MAX(y_ecr_max&,y1&) b1&=BYTE{adi%} z1%={ADD(adi%,2)} IF y1&=>y& INT{x_gau%}=x& INT{y_hau%}=y& INT{i_min%}=b& {z_min%}=z% INT{x_dro%}=x1& INT{y_bas%}=y1& INT{i_max%}=b1& {z_max%}=z1% ELSE INT{x_gau%}=x1& INT{y_hau%}=y1& INT{i_min%}=b1& {z_min%}=z1% INT{x_dro%}=x& INT{y_bas%}=y& INT{i_max%}=b& {z_max%}=z% ENDIF y_ecran&=y_ecr_min& DO ' ------------------------------------------------------------------------ x_int%=xint% b_int%=bint% z_pte%=zpte% ' x_gau%=xgau% y_hau%=yhau% i_min%=imin% z_min%=zmin% ' x_dro%=xdro% y_bas%=ybas% i_max%=imax% z_max%=zmax% ' CLR inter% ! nombre d'intersections trouv‚es ' ------------------------------------------------------------------------ IF y_ecran&=>INT{y_hau%} AND y_ecran&<=INT{y_bas%} ! Vrai si intersection dy&=SUB(INT{y_bas%},INT{y_hau%}) dy1&=SUB(y_ecran&,INT{y_hau%}) IF dy&<>0 ! segment oblique: 1 seul point INT{x_int%}=INT{x_gau%}+dy1&*SUB(INT{x_dro%},INT{x_gau%})/dy& INT{b_int%}=INT{i_min%}+dy1&*SUB(INT{i_max%},INT{i_min%})/dy& {z_pte%}={z_min%}+dy1&*SUB({z_max%},{z_min%})/dy& ELSE ! segment horiz: deux points INT{x_int%}=INT{x_gau%} INT{b_int%}=INT{i_min%} {z_pte%}={z_min%} INC inter% ADD x_int%,2 ADD b_int%,2 ADD z_pte%,4 INT{x_int%}=INT{x_dro%} INT{b_int%}=INT{i_max%} {z_pte%}={z_max%} ENDIF INC inter% ADD x_int%,2 ADD b_int%,2 ADD z_pte%,4 ENDIF ADD x_gau%,2 ADD y_hau%,2 ADD i_min%,2 ADD z_min%,4 ' ADD x_dro%,2 ADD y_bas%,2 ADD i_max%,2 ADD z_max%,4 ' ------------------------------------------------------------------------ IF y_ecran&=>INT{y_hau%} AND y_ecran&<=INT{y_bas%} ! Vrai si intersection dy&=SUB(INT{y_bas%},INT{y_hau%}) dy1&=SUB(y_ecran&,INT{y_hau%}) IF dy&<>0 ! segment oblique: 1 seul point INT{x_int%}=INT{x_gau%}+dy1&*SUB(INT{x_dro%},INT{x_gau%})/dy& INT{b_int%}=INT{i_min%}+dy1&*SUB(INT{i_max%},INT{i_min%})/dy& {z_pte%}={z_min%}+dy1&*SUB({z_max%},{z_min%})/dy& ELSE ! segment horiz: deux points INT{x_int%}=INT{x_gau%} INT{b_int%}=INT{i_min%} {z_pte%}={z_min%} INC inter% ADD x_int%,2 ADD b_int%,2 ADD z_pte%,4 INT{x_int%}=INT{x_dro%} INT{b_int%}=INT{i_max%} {z_pte%}={z_max%} ENDIF INC inter% ADD x_int%,2 ADD b_int%,2 ADD z_pte%,4 ENDIF ADD x_gau%,2 ADD y_hau%,2 ADD i_min%,2 ADD z_min%,4 ' ADD x_dro%,2 ADD y_bas%,2 ADD i_max%,2 ADD z_max%,4 ' ------------------------------------------------------------------------ IF y_ecran&=>INT{y_hau%} AND y_ecran&<=INT{y_bas%} ! Vrai si intersection dy&=SUB(INT{y_bas%},INT{y_hau%}) dy1&=SUB(y_ecran&,INT{y_hau%}) IF dy&<>0 ! segment oblique: 1 seul point INT{x_int%}=INT{x_gau%}+dy1&*SUB(INT{x_dro%},INT{x_gau%})/dy& INT{b_int%}=INT{i_min%}+dy1&*SUB(INT{i_max%},INT{i_min%})/dy& {z_pte%}={z_min%}+dy1&*SUB({z_max%},{z_min%})/dy& ELSE ! segment horiz: deux points INT{x_int%}=INT{x_gau%} INT{b_int%}=INT{i_min%} {z_pte%}={z_min%} INC inter% ADD x_int%,2 ADD b_int%,2 ADD z_pte%,4 INT{x_int%}=INT{x_dro%} INT{b_int%}=INT{i_max%} {z_pte%}={z_max%} ENDIF INC inter% ADD x_int%,2 ADD b_int%,2 ADD z_pte%,4 ENDIF ' ------------------------------------------------------------------------ IF inter%>0 ! Si quelque chose IF inter%>2 tri_gouraud(xint%,bint%,zpte%,0,PRED(inter%)) INT{ADD(xint%,2)}=INT{ADD(xint%,SHL(PRED(inter%),1))} INT{ADD(bint%,2)}=INT{ADD(bint%,SHL(PRED(inter%),1))} {ADD(zpte%,4)}={ADD(zpte%,SHL(PRED(inter%),2))} inter%=2 ELSE tri_gouraud(xint%,bint%,zpte%,0,PRED(inter%)) ENDIF x_int%=xint% b_int%=bint% z_pte%=zpte% CLR g% fin_g%=PRED(inter%) DO ! group‚s par deux db&=SUB(INT{ADD(b_int%,2)},INT{b_int%}) dx&=SUB(INT{ADD(x_int%,2)},INT{x_int%}) dx&=-1*(dx&=0)-dx&*(dx&<>0) dz%=SUB({ADD(z_pte%,4)},{z_pte%}) ' trace le segment x&=INT{x_int%} fin_x&=INT{ADD(x_int%,2)} vraix&=SUB(x&,depx&) vraiy&=SUB(y_ecran&,depy&) z_bu%=ADD(ADD(z_buf%,MUL(vraiy&,SHL(lar_gou&,2))),SHL(vraix&,2)) DO IF x&=>fx& AND x&<=fxx& interpolat=SUB(x&,INT{x_int%})/dx& b%={z_pte%}+dz%*interpolat stockee%={z_bu%} IF b%>stockee% {z_bu%}=b% c=db&*interpolat c&=INT{b_int%}+ROUND(c) c=c&/255 afficher_un_point(x&,y_ecran&,1,1,c) !,co&) ENDIF ENDIF ADD z_bu%,4 INC x& LOOP WHILE x& PROCEDURE normale_pour_gouraud(un_%,adr_f%,zo_in%) LOCAL adr_o%,adr_l%,ecrire%,c& LOCAL pt1%,pt2%,pt3% LOCAL x1%,y1%,z1% LOCAL xn%,yn%,zn% ecrire%=mem_vid% ' et maintenant, on calcul les normales en chaque point de la face d‚sir‚e ' en prenant la moyenne des normales en un point des faces comportant ce ' ce point pt1%=CARD{adr_f%} pt2%=CARD{ADD(adr_f%,2)} pt3%=CARD{ADD(adr_f%,4)} ' adr_o%=transfert% ! Coordonn‚es du premier point adr_l%=ADD(zo_in%,MUL(pt1%,14)) ! Et sa normale ' x1%={adr_o%} y1%={ADD(adr_o%,4)} z1%={ADD(adr_o%,8)} CARD{adr_l%}=-1*(CARD{adr_l%}=0)-CARD{adr_l%}*(CARD{adr_l%}<>0) xn%={ADD(adr_l%,2)}/CARD{adr_l%} yn%={ADD(adr_l%,6)}/CARD{adr_l%} zn%={ADD(adr_l%,10)}/CARD{adr_l%} ' ------------ Couleur au point Nø1 c&=ROUND(@intensite_lumiere(un_%,x1%,y1%,z1%,xn%,yn%,zn%)*255) c&=0*(c&<0)-255*(c&>255)-c&*(c&>-1 AND c&<256) BYTE{ecrire%}=ROUND(c&) {ADD(ecrire%,2)}=z1% ADD ecrire%,6 ' adr_o%=ADD(transfert%,12) ! Coordonn‚es du second point adr_l%=ADD(zo_in%,MUL(pt2%,14)) ! Et sa normale ' x1%={adr_o%} y1%={ADD(adr_o%,4)} z1%={ADD(adr_o%,8)} CARD{adr_l%}=-1*(CARD{adr_l%}=0)-CARD{adr_l%}*(CARD{adr_l%}<>0) xn%={ADD(adr_l%,2)}/CARD{adr_l%} yn%={ADD(adr_l%,6)}/CARD{adr_l%} zn%={ADD(adr_l%,10)}/CARD{adr_l%} ' ------------ Couleur au point Nø2 c&=ROUND(@intensite_lumiere(un_%,x1%,y1%,z1%,xn%,yn%,zn%)*255) c&=0*(c&<0)-255*(c&>255)-c&*(c&>-1 AND c&<256) BYTE{ecrire%}=ROUND(c&) {ADD(ecrire%,2)}=z1% ADD ecrire%,6 ' adr_o%=ADD(transfert%,24) ! Coordonn‚es du troisiŠme point adr_l%=ADD(zo_in%,MUL(pt3%,14)) ! Et sa normale ' x1%={adr_o%} y1%={ADD(adr_o%,4)} z1%={ADD(adr_o%,8)} CARD{adr_l%}=-1*(CARD{adr_l%}=0)-CARD{adr_l%}*(CARD{adr_l%}<>0) xn%={ADD(adr_l%,2)}/CARD{adr_l%} yn%={ADD(adr_l%,6)}/CARD{adr_l%} zn%={ADD(adr_l%,10)}/CARD{adr_l%} ' ------------ Couleur au point Nø3 c&=ROUND(@intensite_lumiere(un_%,x1%,y1%,z1%,xn%,yn%,zn%)*255) c&=0*(c&<0)-255*(c&>255)-c&*(c&>-1 AND c&<256) BYTE{ecrire%}=ROUND(c&) {ADD(ecrire%,2)}=z1% ADD ecrire%,6 ' BMOVE mem_vid%,ecrire%,6 ' RETURN > PROCEDURE tri_gouraud(posx%,inte%,zpte%,l%,r%) LOCAL z0%,z1%,lue&,mv&,mv% z0%=l% z1%=r% lue&=INT{ADD(posx%,SHL(DIV(ADD(l%,r%),2),1))} REPEAT WHILE INT{ADD(posx%,SHL(z0%,1))}z1% IF l% PROCEDURE face_phong(un_%,z_buf%,adr_f%,co&,fx&,fw&,xint%,ixnte%,iynte%,iznte%,xpte%,ypte%,zpte%,xgau%,yhau%,ixmin%,iymin%,izmin%,xmin%,ymin%,zmin%,xdro%,ybas%,ixmax%,iymax%,izmax%,xmax%,ymax%,zmax%,lar_gou&) LOCAL inter%,gi%,fin_x&,j%,fin_j%,adf%,adi%,c,c& LOCAL fxx&,b%,stockee%,z_bu%,adr_i%,interpolat LOCAL dbx%,dby%,dbz%,y_ecran&,y_ecr_min&,y_ecr_max& LOCAL dx%,dy%,dz%,x&,y&,x%,y%,z%,bx%,by%,bz% LOCAL x1%,y1%,z1%,x1&,y1&,bx1%,by1%,bz1% LOCAL cx%,cy%,cz%,px%,py%,pz% LOCAL x_pos%,i_xnte%,i_ynte%,i_znte%,x_pte%,y_pte%,z_pte%,x_gau%,y_hau% LOCAL i_xmin%,i_ymin%,i_zmin%,x_min%,y_min%,z_min%,x_dro%,y_bas% LOCAL i_xmax%,i_ymax%,i_zmax%,x_max%,y_max%,z_max% LOCAL depx&,depy&,vraix&,vraiy& objc_offset(adr_vue_fine%,gourphon&,depx&,depy&) ' fxx&=PRED(ADD(fx&,fw&)) adr_i%=mem_vid% ' x&=INT{adr_f%} y&=INT{ADD(adr_f%,2)} y_ecr_min&=y& y_ecr_max&=y& bx%={adr_i%} ! Vecteur Normal X by%={ADD(adr_i%,4)} ! Vecteur Normal Y bz%={ADD(adr_i%,8)} ! Vecteur Normal Z x%={ADD(adr_i%,12)} ! Position X y%={ADD(adr_i%,16)} ! Position Y z%={ADD(adr_i%,20)} ! Position Z adf%=ADD(adr_f%,4) adi%=ADD(adr_i%,24) x_gau%=xgau% y_hau%=yhau% i_xmin%=ixmin% i_ymin%=iymin% i_zmin%=izmin% x_min%=xmin% y_min%=ymin% z_min%=zmin% ' x_dro%=xdro% y_bas%=ybas% i_xmax%=ixmax% i_ymax%=iymax% i_zmax%=izmax% x_max%=xmax% y_max%=ymax% z_max%=zmax% ' ---------------------------- Premier point --------------------------------- x1&=INT{adf%} y1&=INT{ADD(adf%,2)} y_ecr_min&=MIN(y_ecr_min&,y1&) y_ecr_max&=MAX(y_ecr_max&,y1&) bx1%={adi%} ! Vecteur Normal X by1%={ADD(adi%,4)} ! Vecteur Normal Y bz1%={ADD(adi%,8)} ! Vecteur Normal z x1%={ADD(adi%,12)} ! Position X y1%={ADD(adi%,16)} ! Position Y z1%={ADD(adi%,20)} ! Position Z IF y1&=>y& INT{x_gau%}=x& INT{y_hau%}=y& {i_xmin%}=bx% {i_ymin%}=by% {i_zmin%}=bz% {x_min%}=x% {y_min%}=y% {z_min%}=z% INT{x_dro%}=x1& INT{y_bas%}=y1& {i_xmax%}=bx1% {i_ymax%}=by1% {i_zmax%}=bz1% {x_max%}=x1% {y_max%}=y1% {z_max%}=z1% ELSE INT{x_gau%}=x1& INT{y_hau%}=y1& {i_xmin%}=bx1% {i_ymin%}=by1% {i_zmin%}=bz1% {x_min%}=x1% {y_min%}=y1% {z_min%}=z1% INT{x_dro%}=x& INT{y_bas%}=y& {i_xmax%}=bx% {i_ymax%}=by% {i_zmax%}=bz% {x_max%}=x% {y_max%}=y% {z_max%}=z% ENDIF x&=x1& y&=y1& bx%=bx1% by%=by1% bz%=bz1% x%=x1% y%=y1% z%=z1% ADD adf%,4 ADD adi%,24 ADD x_gau%,2 ADD y_hau%,2 ADD i_xmin%,4 ADD i_ymin%,4 ADD i_zmin%,4 ADD x_min%,4 ADD y_min%,4 ADD z_min%,4 ' ADD x_dro%,2 ADD y_bas%,2 ADD i_xmax%,4 ADD i_ymax%,4 ADD i_zmax%,4 ADD x_max%,4 ADD y_max%,4 ADD z_max%,4 ' ---------------------------- DeuxiŠme Point -------------------------------- x1&=INT{adf%} y1&=INT{ADD(adf%,2)} y_ecr_min&=MIN(y_ecr_min&,y1&) y_ecr_max&=MAX(y_ecr_max&,y1&) bx1%={adi%} ! Vecteur Normal X by1%={ADD(adi%,4)} ! Vecteur Normal Y bz1%={ADD(adi%,8)} ! Vecteur Normal z x1%={ADD(adi%,12)} ! Position X y1%={ADD(adi%,16)} ! Position Y z1%={ADD(adi%,20)} ! Position Z IF y1&=>y& INT{x_gau%}=x& INT{y_hau%}=y& {i_xmin%}=bx% {i_ymin%}=by% {i_zmin%}=bz% {x_min%}=x% {y_min%}=y% {z_min%}=z% INT{x_dro%}=x1& INT{y_bas%}=y1& {i_xmax%}=bx1% {i_ymax%}=by1% {i_zmax%}=bz1% {x_max%}=x1% {y_max%}=y1% {z_max%}=z1% ELSE INT{x_gau%}=x1& INT{y_hau%}=y1& {i_xmin%}=bx1% {i_ymin%}=by1% {i_zmin%}=bz1% {x_min%}=x1% {y_min%}=y1% {z_min%}=z1% INT{x_dro%}=x& INT{y_bas%}=y& {i_xmax%}=bx% {i_ymax%}=by% {i_zmax%}=bz% {x_max%}=x% {y_max%}=y% {z_max%}=z% ENDIF x&=x1& y&=y1& bx%=bx1% by%=by1% bz%=bz1% x%=x1% y%=y1% z%=z1% ADD adf%,4 ADD adi%,24 ADD x_gau%,2 ADD y_hau%,2 ADD i_xmin%,4 ADD i_ymin%,4 ADD i_zmin%,4 ADD x_min%,4 ADD y_min%,4 ADD z_min%,4 ' ADD x_dro%,2 ADD y_bas%,2 ADD i_xmax%,4 ADD i_ymax%,4 ADD i_zmax%,4 ADD x_max%,4 ADD y_max%,4 ADD z_max%,4 ' ---------------------------- TroisiŠme point ------------------------------- x1&=INT{adf%} y1&=INT{ADD(adf%,2)} y_ecr_min&=MIN(y_ecr_min&,y1&) y_ecr_max&=MAX(y_ecr_max&,y1&) bx1%={adi%} ! Vecteur Normal X by1%={ADD(adi%,4)} ! Vecteur Normal Y bz1%={ADD(adi%,8)} ! Vecteur Normal z x1%={ADD(adi%,12)} ! Position X y1%={ADD(adi%,16)} ! Position Y z1%={ADD(adi%,20)} ! Position Z IF y1&=>y& INT{x_gau%}=x& INT{y_hau%}=y& {i_xmin%}=bx% {i_ymin%}=by% {i_zmin%}=bz% {x_min%}=x% {y_min%}=y% {z_min%}=z% INT{x_dro%}=x1& INT{y_bas%}=y1& {i_xmax%}=bx1% {i_ymax%}=by1% {i_zmax%}=bz1% {x_max%}=x1% {y_max%}=y1% {z_max%}=z1% ELSE INT{x_gau%}=x1& INT{y_hau%}=y1& {i_xmin%}=bx1% {i_ymin%}=by1% {i_zmin%}=bz1% {x_min%}=x1% {y_min%}=y1% {z_min%}=z1% INT{x_dro%}=x& INT{y_bas%}=y& {i_xmax%}=bx% {i_ymax%}=by% {i_zmax%}=bz% {x_max%}=x% {y_max%}=y% {z_max%}=z% ENDIF y_ecran&=y_ecr_min& DO ' ------------------------------------------------------------------------ CLR inter% ! nombre d'intersections trouv‚es x_pos%=xint% i_xnte%=ixnte% i_ynte%=iynte% i_znte%=iznte% x_pte%=xpte% y_pte%=ypte% z_pte%=zpte% ' x_gau%=xgau% y_hau%=yhau% i_xmin%=ixmin% i_ymin%=iymin% i_zmin%=izmin% x_min%=xmin% y_min%=ymin% z_min%=zmin% ' x_dro%=xdro% y_bas%=ybas% i_xmax%=ixmax% i_ymax%=iymax% i_zmax%=izmax% x_max%=xmax% y_max%=ymax% z_max%=zmax% ' ' ------------------------------------------------------------------------ IF y_ecran&=>INT{y_hau%} AND y_ecran&<=INT{y_bas%} ! vrai si intersection dy&=SUB(INT{y_bas%},INT{y_hau%}) dy1&=SUB(y_ecran&,INT{y_hau%}) IF dy&<>0 ! segment oblique: 1 seul point INT{x_pos%}=INT{x_gau%}+dy1&*SUB(INT{x_dro%},INT{x_gau%})/dy& {i_xnte%}={i_xmin%}+dy1&*SUB({i_xmax%},{i_xmin%})/dy& {i_ynte%}={i_ymin%}+dy1&*SUB({i_ymax%},{i_ymin%})/dy& {i_znte%}={i_zmin%}+dy1&*SUB({i_zmax%},{i_zmin%})/dy& {x_pte%}={x_min%}+dy1&*SUB({x_max%},{x_min%})/dy& {y_pte%}={y_min%}+dy1&*SUB({y_max%},{y_min%})/dy& {z_pte%}={z_min%}+dy1&*SUB({z_max%},{z_min%})/dy& ELSE ! segment horiz: deux points INT{x_pos%}=INT{x_gau%} {i_xnte%}={i_xmin%} {i_ynte%}={i_ymin%} {i_znte%}={i_zmin%} {x_pte%}={x_min%} {y_pte%}={y_min%} {z_pte%}={z_min%} INC inter% ADD x_pos%,2 ADD i_xnte%,4 ADD i_ynte%,4 ADD i_znte%,4 ADD x_pte%,4 ADD y_pte%,4 ADD z_pte%,4 ' INT{x_pos%}=INT{x_dro%} {i_xnte%}={i_xmax%} {i_ynte%}={i_ymax%} {i_znte%}={i_zmax%} {x_pte%}={x_max%} {y_pte%}={y_max%} {z_pte%}={z_max%} ENDIF INC inter% ADD x_pos%,2 ADD i_xnte%,4 ADD i_ynte%,4 ADD i_znte%,4 ADD x_pte%,4 ADD y_pte%,4 ADD z_pte%,4 ENDIF ' ADD x_gau%,2 ADD y_hau%,2 ADD i_xmin%,4 ADD i_ymin%,4 ADD i_zmin%,4 ADD x_min%,4 ADD y_min%,4 ADD z_min%,4 ' ADD x_dro%,2 ADD y_bas%,2 ADD i_xmax%,4 ADD i_ymax%,4 ADD i_zmax%,4 ADD x_max%,4 ADD y_max%,4 ADD z_max%,4 ' ------------------------------------------------------------------------ IF y_ecran&=>INT{y_hau%} AND y_ecran&<=INT{y_bas%} ! vrai si intersection dy&=SUB(INT{y_bas%},INT{y_hau%}) dy1&=SUB(y_ecran&,INT{y_hau%}) IF dy&<>0 ! segment oblique: 1 seul point INT{x_pos%}=INT{x_gau%}+dy1&*SUB(INT{x_dro%},INT{x_gau%})/dy& {i_xnte%}={i_xmin%}+dy1&*SUB({i_xmax%},{i_xmin%})/dy& {i_ynte%}={i_ymin%}+dy1&*SUB({i_ymax%},{i_ymin%})/dy& {i_znte%}={i_zmin%}+dy1&*SUB({i_zmax%},{i_zmin%})/dy& {x_pte%}={x_min%}+dy1&*SUB({x_max%},{x_min%})/dy& {y_pte%}={y_min%}+dy1&*SUB({y_max%},{y_min%})/dy& {z_pte%}={z_min%}+dy1&*SUB({z_max%},{z_min%})/dy& ELSE ! segment horiz: deux points INT{x_pos%}=INT{x_gau%} {i_xnte%}={i_xmin%} {i_ynte%}={i_ymin%} {i_znte%}={i_zmin%} {x_pte%}={x_min%} {y_pte%}={y_min%} {z_pte%}={z_min%} INC inter% ADD x_pos%,2 ADD i_xnte%,4 ADD i_ynte%,4 ADD i_znte%,4 ADD x_pte%,4 ADD y_pte%,4 ADD z_pte%,4 ' INT{x_pos%}=INT{x_dro%} {i_xnte%}={i_xmax%} {i_ynte%}={i_ymax%} {i_znte%}={i_zmax%} {x_pte%}={x_max%} {y_pte%}={y_max%} {z_pte%}={z_max%} ENDIF INC inter% ADD x_pos%,2 ADD i_xnte%,4 ADD i_ynte%,4 ADD i_znte%,4 ADD x_pte%,4 ADD y_pte%,4 ADD z_pte%,4 ENDIF ' ADD x_gau%,2 ADD y_hau%,2 ADD i_xmin%,4 ADD i_ymin%,4 ADD i_zmin%,4 ADD x_min%,4 ADD y_min%,4 ADD z_min%,4 ' ADD x_dro%,2 ADD y_bas%,2 ADD i_xmax%,4 ADD i_ymax%,4 ADD i_zmax%,4 ADD x_max%,4 ADD y_max%,4 ADD z_max%,4 ' ------------------------------------------------------------------------ IF y_ecran&=>INT{y_hau%} AND y_ecran&<=INT{y_bas%} ! vrai si intersection dy&=SUB(INT{y_bas%},INT{y_hau%}) dy1&=SUB(y_ecran&,INT{y_hau%}) IF dy&<>0 ! segment oblique: 1 seul point INT{x_pos%}=INT{x_gau%}+dy1&*SUB(INT{x_dro%},INT{x_gau%})/dy& {i_xnte%}={i_xmin%}+dy1&*SUB({i_xmax%},{i_xmin%})/dy& {i_ynte%}={i_ymin%}+dy1&*SUB({i_ymax%},{i_ymin%})/dy& {i_znte%}={i_zmin%}+dy1&*SUB({i_zmax%},{i_zmin%})/dy& {x_pte%}={x_min%}+dy1&*SUB({x_max%},{x_min%})/dy& {y_pte%}={y_min%}+dy1&*SUB({y_max%},{y_min%})/dy& {z_pte%}={z_min%}+dy1&*SUB({z_max%},{z_min%})/dy& ELSE ! segment horiz: deux points INT{x_pos%}=INT{x_gau%} {i_xnte%}={i_xmin%} {i_ynte%}={i_ymin%} {i_znte%}={i_zmin%} {x_pte%}={x_min%} {y_pte%}={y_min%} {z_pte%}={z_min%} INC inter% ADD x_pos%,2 ADD i_xnte%,4 ADD i_ynte%,4 ADD i_znte%,4 ADD x_pte%,4 ADD y_pte%,4 ADD z_pte%,4 ' INT{x_pos%}=INT{x_dro%} {i_xnte%}={i_xmax%} {i_ynte%}={i_ymax%} {i_znte%}={i_zmax%} {x_pte%}={x_max%} {y_pte%}={y_max%} {z_pte%}={z_max%} ENDIF INC inter% ADD x_pos%,2 ADD i_xnte%,4 ADD i_ynte%,4 ADD i_znte%,4 ADD x_pte%,4 ADD y_pte%,4 ADD z_pte%,4 ENDIF ' ------------------------------------------------------------------------ IF inter%>0 IF inter%>2 tri_phong(xint%,ixnte%,iynte%,iznte%,xpte%,ypte%,zpte%,0,PRED(inter%)) INT{ADD(xint%,2)}=INT{ADD(xint%,SHL(PRED(inter%),1))} {ADD(ixnte%,4)}={ADD(ixnte%,SHL(PRED(inter%),2))} {ADD(iynte%,4)}={ADD(iynte%,SHL(PRED(inter%),2))} {ADD(iznte%,4)}={ADD(iznte%,SHL(PRED(inter%),2))} {ADD(xpte%,4)}={ADD(xpte%,SHL(PRED(inter%),2))} {ADD(ypte%,4)}={ADD(ypte%,SHL(PRED(inter%),2))} {ADD(zpte%,4)}={ADD(zpte%,SHL(PRED(inter%),2))} inter%=2 ELSE tri_phong(xint%,ixnte%,iynte%,iznte%,xpte%,ypte%,zpte%,0,PRED(inter%)) ENDIF x_pos%=xint% i_xnte%=ixnte% i_ynte%=iynte% i_znte%=iznte% x_pte%=xpte% y_pte%=ypte% z_pte%=zpte% CLR j% fin_j%=PRED(inter%) DO ! group‚s par deux dbx%=SUB({ADD(i_xnte%,4)},{i_xnte%}) dby%=SUB({ADD(i_ynte%,4)},{i_ynte%}) dbz%=SUB({ADD(i_znte%,4)},{i_znte%}) dx%=SUB({ADD(x_pte%,4)},{x_pte%}) dy%=SUB({ADD(y_pte%,4)},{y_pte%}) dz%=SUB({ADD(z_pte%,4)},{z_pte%}) dx&=SUB(INT{ADD(x_pos%,2)},INT{x_pos%}) dx&=-1*(dx&=0)-dx&*(dx&<>0) ' trace le segment x&=INT{x_pos%} fin_x&=INT{ADD(x_pos%,2)} vraix&=SUB(x&,depx&) vraiy&=SUB(y_ecran&,depy&) z_bu%=ADD(ADD(z_buf%,MUL(vraiy&,SHL(lar_gou&,2))),SHL(vraix&,2)) DO IF x&=>fx& AND x&<=fxx& interpolat=SUB(x&,INT{x_pos%})/dx& b%={z_pte%}+dz%*interpolat stockee%={z_bu%} IF b%=>stockee% {z_bu%}=b% c=dx%*interpolat px%={x_pte%}+ROUND(c) c=dy%*interpolat py%={y_pte%}+ROUND(c) c=dz%*interpolat pz%={z_pte%}+ROUND(c) c=dbx%*interpolat cx%={i_xnte%}+ROUND(c) c=dby%*interpolat cy%={i_ynte%}+ROUND(c) c=dbz%*interpolat cz%={i_znte%}+ROUND(c) c=@intensite_lumiere(un_%,px%,py%,pz%,cx%,cy%,cz%) afficher_un_point(x&,y_ecran&,1,1,c) !,co&) ENDIF ENDIF ' arret_dessin!=BTST(BIOS(&HB,-1),cl_alternate&) EXIT IF arret_dessin! ' ADD z_bu%,4 INC x& LOOP WHILE x& PROCEDURE normale_pour_phong(adr_f%,zo_in%) LOCAL adr_o%,adr_l%,ecrire% LOCAL pt1%,pt2%,pt3% ecrire%=mem_vid% ' et maintenant, on calcul les normales en chaque point de la face d‚sir‚e ' en prenant la moyenne des normales en un point des faces comportant ce ' ce point pt1%=CARD{adr_f%} pt2%=CARD{ADD(adr_f%,2)} pt3%=CARD{ADD(adr_f%,4)} ' adr_o%=transfert% ! Coordonn‚es du premier point adr_l%=ADD(zo_in%,MUL(pt1%,14)) ! Et sa normale ' CARD{adr_l%}=-1*(CARD{adr_l%}=0)-CARD{adr_l%}*(CARD{adr_l%}<>0) {ecrire%}={ADD(adr_l%,2)}/CARD{adr_l%} {ADD(ecrire%,4)}={ADD(adr_l%,6)}/CARD{adr_l%} {ADD(ecrire%,8)}={ADD(adr_l%,10)}/CARD{adr_l%} BMOVE adr_o%,ADD(ecrire%,12),12 ADD ecrire%,24 ' adr_o%=ADD(transfert%,12) ! Coordonn‚es du second point adr_l%=ADD(zo_in%,MUL(pt2%,14)) ! Et sa normale ' CARD{adr_l%}=-1*(CARD{adr_l%}=0)-CARD{adr_l%}*(CARD{adr_l%}<>0) {ecrire%}={ADD(adr_l%,2)}/CARD{adr_l%} {ADD(ecrire%,4)}={ADD(adr_l%,6)}/CARD{adr_l%} {ADD(ecrire%,8)}={ADD(adr_l%,10)}/CARD{adr_l%} BMOVE adr_o%,ADD(ecrire%,12),12 ADD ecrire%,24 ' adr_o%=ADD(transfert%,24) ! Coordonn‚es du troisiŠme point adr_l%=ADD(zo_in%,MUL(pt3%,14)) ! Et sa normale ' CARD{adr_l%}=-1*(CARD{adr_l%}=0)-CARD{adr_l%}*(CARD{adr_l%}<>0) {ecrire%}={ADD(adr_l%,2)}/CARD{adr_l%} {ADD(ecrire%,4)}={ADD(adr_l%,6)}/CARD{adr_l%} {ADD(ecrire%,8)}={ADD(adr_l%,10)}/CARD{adr_l%} BMOVE adr_o%,ADD(ecrire%,12),12 ADD ecrire%,24 ' ------------ Normale au point Nø4 ‚gale au point nø1 BMOVE mem_vid%,ecrire%,24 RETURN > PROCEDURE tri_phong(posx%,ixnte%,iynte%,iznte%,xpte%,ypte%,zpte%,l%,r%) LOCAL z0%,z1%,lue&,mv& z0%=l% z1%=r% lue&=INT{ADD(posx%,SHL(DIV(ADD(l%,r%),2),1))} REPEAT WHILE INT{ADD(posx%,SHL(z0%,1))}z1% IF l% PROCEDURE affichage_couleur_tc(fx&,fy&,fw&,fh&,cr|,cv|,cb|,drx&,dry&,drw&,drh&) LOCAL p_cou1&,p_cou2&,p_tra1%,p_tra2%,p_tra3%,c0 ' set_fill_perimeter_visibility(0) set_writing_mode(mode_remplace|) IF drx&>-1 set_clipping_rectangle(1,drx&,dry&,PRED(ADD(drx&,drw&)),PRED(ADD(dry&,drh&)),0,0) ENDIF BYTE{couleur_point%}=cr| BYTE{SUCC(couleur_point%)}=cv| BYTE{ADD(couleur_point%,2)}=cb| afficher_un_point(fx&,fy&,fw&,fh&,0.5) IF drx&>-1 set_clipping_rectangle(0,drx&,dry&,PRED(ADD(drx&,drw&)),PRED(ADD(dry&,drh&)),0,0) ENDIF RETURN > PROCEDURE afficher_un_point(px&,py&,pw&,ph&,c) ! Simulation du T. C. LOCAL cr&,cv&,cb&,ctte&,csat&,clum& LOCAL p_cou1&,p_cou2&,p_tra1%,p_tra2%,p_tra3% LOCAL px2&,py2& px2&=PRED(ADD(px&,pw&)) py2&=PRED(ADD(py&,ph&)) ' c=((c*2)-1) cr&=BYTE{couleur_point%}+(c*255) cv&=BYTE{SUCC(couleur_point%)}+(c*255) cb&=BYTE{ADD(couleur_point%,2)}+(c*255) cr&=0*(cr&<0)-255*(cr&>255)-cr&*(cr&>-1 AND cr&<256) cv&=0*(cv&<0)-255*(cv&>255)-cv&*(cv&>-1 AND cv&<256) cb&=0*(cb&<0)-255*(cb&>255)-cb&*(cb&>-1 AND cb&<256) ' ' graf_mouse(m_off&,0) $S&,$S> SELECT plan_systeme& ' ************************************************************************** CASE 1,2 ! Mode 2/4 couleurs ' ************************************************************************** p_cou1&=(cr&*0.3)+(cv&*0.59)+(cb&*0.11) p_cou1&=SUB(255,p_cou1&) p_tra1%=ADD(trame%,SHL(p_cou1&,5)) ' set_remplissage(4,1,noir&,p_tra1%) ! Tramage de luminosit‚ vdi_11(1,px&,py&,px2&,py2&,0,0,0,0) ' ************************************************************************** CASE 4,8 ! 16/256 couleurs ' ************************************************************************** couleur_et_trame(cr&,cv&,cb&,p_cou1&,p_cou2&,p_tra1%,p_tra2%,p_tra3%) set_writing_mode(mode_remplace|) set_remplissage(4,1,noir&,p_tra1%) ! Fond noir/blanc vdi_11(1,px&,py&,px2&,py2&,0,0,0,0) set_writing_mode(mode_transparent|) set_remplissage(4,1,p_cou1&,p_tra2%) ! Couleur principale vdi_11(1,px&,py&,px2&,py2&,0,0,0,0) set_remplissage(4,1,p_cou2&,p_tra3%) ! Couleur secondaire vdi_11(1,px&,py&,px2&,py2&,0,0,0,0) set_writing_mode(mode_remplace|) ' ************************************************************************** CASE 15,16,24,32 ! Mode TRUE COLOR (15/16/24/32 bits) ' ************************************************************************** set_color_representation(254,(cr&*3.9216),(cv&*3.9216),(cb&*3.9216),vdihandle%) set_fill_color_index(254) vdi_11(1,px&,py&,px2&,py2&,0,0,0,0) ENDSELECT ' graf_mouse(m_on&,0) RETURN ' ****************************************************************************** ' **** Cr‚ation et gestion de la fenˆtre de hi‚rarchie **** ' ****************************************************************************** > PROCEDURE mise_a_la_taille_hierarchie ! Oh! c'est nouveau ‡a ! non ?? LOCAL ww&,hh& ' ww&=ADD(ADD(OB_W(adr_hierarchie%,hie_sous&),OB_W(adr_hierarchie%,hie_size&)),2) hh&=ADD(ADD(ADD(OB_H(adr_hierarchie%,hie_sous&),OB_Y(adr_hierarchie%,hie_sous&)),OB_H(adr_hierarchie%,hie_size&)),2) ' IF ww&>global_wb& ww&=global_wb& ENDIF IF hh&>global_hb& hh&=global_hb& ENDIF ' OB_W(adr_hierarchie%,0)=ww& OB_H(adr_hierarchie%,0)=hh& OB_W(adr_hierarchie%,1)=PRED(ww&) OB_H(adr_hierarchie%,1)=PRED(hh&) ' ' La barre de d‚placement ' OB_W(adr_hierarchie%,hie_bar0&)=SUB(PRED(ww&),78) OB_W(adr_hierarchie%,hie_bar1&)=PRED(OB_W(adr_hierarchie%,hie_bar0&)) ' ' Ic“ne de taille de la fonte, r‚duction en barre et de fermeture ' OB_X(adr_hierarchie%,hie_fon&)=SUB(PRED(ww&),52) OB_X(adr_hierarchie%,hie_red&)=SUB(PRED(ww&),36) OB_X(adr_hierarchie%,hie_fer&)=SUB(PRED(ww&),20) ' ' Bouton de changement de taille pour servir de r‚f‚rence... ' OB_X(adr_hierarchie%,hie_size&)=SUB(SUB(ww&,OB_W(adr_hierarchie%,hie_size&)),2) OB_Y(adr_hierarchie%,hie_size&)=SUB(SUB(hh&,OB_H(adr_hierarchie%,hie_size&)),2) ' ' Position ascenseur vertical ' OB_X(adr_hierarchie%,hieascv0&)=SUB(SUB(ww&,OB_W(adr_hierarchie%,hie_size&)),2) ' ' Position ascenseur horizontal ' OB_Y(adr_hierarchie%,hieasch0&)=SUB(SUB(hh&,OB_H(adr_hierarchie%,hie_size&)),2) ' ' Taille de l'ascenceur vertical ' hh&=SUB(OB_Y(adr_hierarchie%,hie_size&),OB_Y(adr_hierarchie%,hieascv0&)) OB_H(adr_hierarchie%,hieascv0&)=hh& OB_H(adr_hierarchie%,hieascv1&)=SUB(OB_H(adr_hierarchie%,hieascv0&),65) ' ' Positions boutons ascenseur vertical ' OB_Y(adr_hierarchie%,hiebasto&)=SUB(OB_H(adr_hierarchie%,hieascv0&),18) OB_Y(adr_hierarchie%,hiebas&)=SUB(OB_H(adr_hierarchie%,hieascv0&),34) OB_Y(adr_hierarchie%,hiehaut&)=SUB(OB_H(adr_hierarchie%,hieascv0&),50) OB_Y(adr_hierarchie%,hiehauto&)=SUB(OB_H(adr_hierarchie%,hieascv0&),66) ' ' Taille de l'ascenceur horizontal ' ww&=SUB(OB_X(adr_hierarchie%,hie_size&),OB_X(adr_hierarchie%,hieasch0&)) OB_W(adr_hierarchie%,hieasch0&)=ww& OB_W(adr_hierarchie%,hieasch1&)=SUB(OB_W(adr_hierarchie%,hieasch0&),65) ' ' Positions boutons ascenseur horizontaux ' OB_X(adr_hierarchie%,hiedroto&)=SUB(OB_W(adr_hierarchie%,hieasch0&),18) OB_X(adr_hierarchie%,hiedroit&)=SUB(OB_W(adr_hierarchie%,hieasch0&),34) OB_X(adr_hierarchie%,hiegauch&)=SUB(OB_W(adr_hierarchie%,hieasch0&),50) OB_X(adr_hierarchie%,hiegauto&)=SUB(OB_W(adr_hierarchie%,hieasch0&),66) ' ' Les curseurs d'ascenceur ' OB_X(adr_hierarchie%,hiefilh0&)=0 OB_Y(adr_hierarchie%,hiefilv0&)=0 ' RETURN > PROCEDURE ascenceurs_hierarchie position_curseur_vertical_hierarchie position_curseur_horizontal_hierarchie RETURN > PROCEDURE etat_bouton_hierarchie_vertical(ind!) ob_state(adr_hierarchie%,hiehauto&,aes_disable&,posy_hierarchie%<=0) ob_state(adr_hierarchie%,hiehaut&,aes_disable&,posy_hierarchie%<=0) ob_state(adr_hierarchie%,hiebas&,aes_disable&,posy_hierarchie%=>SUB(hauteur_hierarchie%,OB_H(adr_hierarchie%,hie_sous&))) ob_state(adr_hierarchie%,hiebasto&,aes_disable&,posy_hierarchie%=>SUB(hauteur_hierarchie%,OB_H(adr_hierarchie%,hie_sous&))) IF ind! redraw_elem(adr_hierarchie%,hieascv0&) ENDIF RETURN > PROCEDURE etat_bouton_hierarchie_horizontal(ind!) ob_state(adr_hierarchie%,hiegauto&,aes_disable&,posx_hierarchie%<=0) ob_state(adr_hierarchie%,hiegauch&,aes_disable&,posx_hierarchie%<=0) ob_state(adr_hierarchie%,hiedroit&,aes_disable&,posx_hierarchie%=>SUB(largeur_hierarchie%,OB_W(adr_hierarchie%,hie_sous&))) ob_state(adr_hierarchie%,hiedroto&,aes_disable&,posx_hierarchie%=>SUB(largeur_hierarchie%,OB_W(adr_hierarchie%,hie_sous&))) IF ind! redraw_elem(adr_hierarchie%,hieasch0&) ENDIF RETURN ' > PROCEDURE analyse_scene LOCAL z_h%,i&,adr_sr%,ns&,univ%,ph1&,ph2& LOCAL x1&,y1&,y2&,x3&,x4&,y4&,posx%,posy% LOCAL diff_niveau% ' IF NOT hierachie_ok! ' $S|,$S> SELECT taille_vue_hierarchie| CASE 0 set_text_mode(noir&,0,0,4,-1,vdihandle%) CASE 1 set_text_mode(noir&,0,0,6,-1,vdihandle%) CASE 2 set_text_mode(noir&,0,0,13,-1,vdihandle%) ENDSELECT CHAR{mem_num%}="A"+CHR$(0) inquire_text_extend(mem_num%,vdihandle%,x1&,y1&,wcar&,y2&,x3&,hcar&,x4&,y4&) ph1&=SHL(wcar&,1) ph2&=SHL(hcar&,1) ' CLR nombre_en_hierarchie% ADD nombre_en_hierarchie%,1 ! Nom de la scŠne ADD nombre_en_hierarchie%,1 ! Cam‚ra ADD nombre_en_hierarchie%,1 ! Titre lumiŠre ADD nombre_en_hierarchie%,@nombre_de_source_active ! Sources de lumiŠres ADD nombre_en_hierarchie%,1 ! Titre objet ADD nombre_en_hierarchie%,nombre_d_objets& ! Objets de la scŠnes ' libere(*verif%) libere(*zone_hierarchie%) zone_hierarchie%=@prendre(MUL(nombre_en_hierarchie%,30),TRUE,3) verif%=@prendre(nombre_d_objets&,TRUE,3) ' IF (zone_hierarchie%>0) AND (verif%>0) ' z_h%=zone_hierarchie% ' Nom de la scŠne par d‚faut posx%=MUL(wcar&,2) posy%=hcar& largeur_hierarchie%=MUL(wcar&,28) hauteur_hierarchie%=hcar& INT{z_h%}=1 CHAR{ADD(z_h%,2)}=TRIM$(MID$(CHAR{titre_en_cours%},SUCC(RINSTR(CHAR{titre_en_cours%},"\")),LEN(LEFT$(CHAR{titre_en_cours%},RINSTR(CHAR{titre_en_cours%},"\"))))+CHR$(0)) CARD{ADD(z_h%,24)}=posx% ! Position en X CARD{ADD(z_h%,26)}=posy% ! Position en Y CARD{ADD(z_h%,28)}=0 ! Vide pour le nom ADD largeur_hierarchie%,SHL(wcar&,1) ADD hauteur_hierarchie%,hcar& ' La cam‚ra ADD posx%,SHL(wcar&,1) ADD posy%,hcar& ADD z_h%,30 INT{z_h%}=2 CHAR{ADD(z_h%,2)}="Cam‚ra"+CHR$(0) CARD{ADD(z_h%,24)}=posx% ! Position en X CARD{ADD(z_h%,26)}=posy% ! Position en Y CARD{ADD(z_h%,28)}=0 ! Vide pour la cam‚ra ADD largeur_hierarchie%,SHL(wcar&,1) ADD hauteur_hierarchie%,hcar& ' Titre des sources de lumiŠre ADD posy%,hcar& ADD z_h%,30 INT{z_h%}=5 CHAR{ADD(z_h%,2)}="Eclairage"+CHR$(0) CARD{ADD(z_h%,24)}=posx% ! Position en X CARD{ADD(z_h%,26)}=posy% ! Position en Y CARD{ADD(z_h%,28)}=0 ! Vide pour les titres ADD hauteur_hierarchie%,hcar& ' Les sources de lumiŠre ADD posx%,SHL(wcar&,1) ADD posy%,hcar& ADD z_h%,30 IF nombre_de_source&>0 CLR total_niveau_hierarchie%,niveau_hierarchie% adr_sr%=source% CLR i& DO IF BYTE{adr_sr%}=1 ! Source active INT{z_h%}=3 IF CHAR{ADD(adr_sr%,62)}="" CHAR{ADD(z_h%,2)}="SOURCE_SANS_NOM"+CHR$(0) ELSE CHAR{ADD(z_h%,2)}=CHAR{ADD(adr_sr%,62)}+CHR$(0) ENDIF CARD{ADD(z_h%,24)}=posx% ! Position en X CARD{ADD(z_h%,26)}=posy% ! Position en Y CARD{ADD(z_h%,28)}=i& ! Num‚ro de la source ADD hauteur_hierarchie%,hcar& ' ADD posy%,hcar& ADD z_h%,30 ENDIF INC i& ADD adr_sr%,taille_source& LOOP WHILE i&0 membfill(verif%,nombre_d_objets&,0) univ%=univers% CLR i& DO ' ' Si l'objet n'est pas composant de C.S.G. ou de BLOB ' IF INT{ADD(univ%,offset_relation_csg&)}=-1 ' ' Si l'objet est une C.S.G, la d‚composer ' IF INT{ADD(univ%,offset_csg_type&)}<0 IF BYTE{ADD(verif%,i&)}=0 IF CHAR{ADD(univ%,offset_nom_objet&)}<>"" CHAR{ADD(z_h%,2)}=CHAR{ADD(univ%,offset_nom_objet&)}+CHR$(0) ELSE CHAR{ADD(z_h%,2)}=@nom_objet$(i&,FALSE)+CHR$(0) ENDIF CARD{ADD(z_h%,24)}=posx% ! Position en X CARD{ADD(z_h%,26)}=posy% ! Position en Y CARD{ADD(z_h%,28)}=i& ! Num‚ro de l'objet ADD hauteur_hierarchie%,hcar& BYTE{ADD(verif%,i&)}=1 ! Pour ‚viter les r‚p‚titions IF BYTE{ADD(csg_ouverte%,i&)} INT{z_h%}=7 ADD posy%,hcar& ADD z_h%,30 saute_csg(univ%) ELSE INT{z_h%}=6 ADD posy%,hcar& ADD z_h%,30 hierarchie_dans_csg(ph2&,ph1&,i&,ADD(posx%,SHL(wcar&,1)),univ%,z_h%,posy%) IF niveau_hierarchie%>total_niveau_hierarchie% diff_niveau%=SUB(niveau_hierarchie%,total_niveau_hierarchie%) ADD largeur_hierarchie%,MUL(SHL(wcar&,1),diff_niveau%) total_niveau_hierarchie%=niveau_hierarchie% CLR niveau_hierarchie% ENDIF ENDIF ENDIF ELSE IF BYTE{ADD(verif%,i&)}=0 INT{z_h%}=4 IF CHAR{ADD(univ%,offset_nom_objet&)}<>"" CHAR{ADD(z_h%,2)}=CHAR{ADD(univ%,offset_nom_objet&)}+CHR$(0) ELSE CHAR{ADD(z_h%,2)}=@nom_objet$(i&,FALSE)+CHR$(0) ENDIF CARD{ADD(z_h%,24)}=posx% ! Position en X CARD{ADD(z_h%,26)}=posy% ! Position en Y CARD{ADD(z_h%,28)}=i& ! Num‚ro de l'objet ADD hauteur_hierarchie%,hcar& BYTE{ADD(verif%,i&)}=1 ! Pour ‚viter les r‚p‚titions ADD posy%,hcar& ADD z_h%,30 ENDIF ENDIF ENDIF ' INC i& ADD univ%,taille_objet& LOOP WHILE i& PROCEDURE hierarchie_dans_csg(ph2&,ph1&,i&,calx%,uni%,VAR z_h%,posy%) LOCAL adr_obj%,j&,num_ob&,csg_cpt&,uni0% ' INC niveau_hierarchie% adr_obj%=@adresse_liste_csg(INT{ADD(uni%,offset_force_blob&)}) csg_cpt&=CARD{adr_obj%} ADD adr_obj%,2 CLR j& DO num_ob&=CARD{ADD(adr_obj%,2)} uni0%=@adresse_objet(num_ob&) ' ' Si l'objet est une C.S.G, la d‚composer ' IF INT{ADD(uni0%,offset_csg_type&)}<0 IF BYTE{ADD(verif%,num_ob&)}=0 IF CHAR{ADD(uni0%,offset_nom_objet&)}<>"" CHAR{ADD(z_h%,2)}=CHAR{ADD(uni0%,offset_nom_objet&)}+CHR$(0) ELSE CHAR{ADD(z_h%,2)}=@nom_objet$(j&,FALSE)+CHR$(0) ENDIF CARD{ADD(z_h%,24)}=calx% ! Position en X CARD{ADD(z_h%,26)}=posy% ! Position en Y CARD{ADD(z_h%,28)}=num_ob& ! Num‚ro de l'objet ADD hauteur_hierarchie%,hcar& BYTE{ADD(verif%,num_ob&)}=1 ! Pour ‚viter les r‚p‚titions IF BYTE{ADD(csg_ouverte%,num_ob&)} INT{z_h%}=7 ADD posy%,hcar& ADD z_h%,30 saute_csg(uni0%) ELSE INT{z_h%}=6 ADD posy%,hcar& ADD z_h%,30 hierarchie_dans_csg(ph2&,ph1&,j&,ADD(calx%,SHL(wcar&,1)),uni0%,z_h%,posy%) ENDIF ENDIF ELSE IF BYTE{ADD(verif%,num_ob&)}=0 INT{z_h%}=4 IF CHAR{ADD(uni0%,offset_nom_objet&)}<>"" CHAR{ADD(z_h%,2)}=CHAR{ADD(uni0%,offset_nom_objet&)}+CHR$(0) ELSE CHAR{ADD(z_h%,2)}=@nom_objet$(j&,FALSE)+CHR$(0) ENDIF CARD{ADD(z_h%,24)}=calx% ! Position en X CARD{ADD(z_h%,26)}=posy% ! Position en Y CARD{ADD(z_h%,28)}=num_ob& ! Num‚ro de l'objet ADD hauteur_hierarchie%,hcar& BYTE{ADD(verif%,num_ob&)}=1 ! Pour ‚viter les r‚p‚titions ADD posy%,hcar& ADD z_h%,30 ENDIF ENDIF ' ADD adr_obj%,4 INC j& LOOP WHILE j& PROCEDURE saute_csg(uni_%) LOCAL sadr_obj%,sj&,snum_ob&,scsg_cpt&,suni0% ' sadr_obj%=@adresse_liste_csg(INT{ADD(uni_%,offset_force_blob&)}) scsg_cpt&=CARD{sadr_obj%} ADD sadr_obj%,2 CLR sj& DO snum_ob&=CARD{ADD(sadr_obj%,2)} suni0%=@adresse_objet(snum_ob&) ' BYTE{ADD(verif%,snum_ob&)}=1 ' ADD sadr_obj%,4 INC sj& LOOP WHILE sj& PROCEDURE redessin_hierarchie(ind!) LOCAL zmx&,zmy&,zmw&,zmh& LOCAL i%,z_h%,zox&,zoy&,zow&,zoh&,try& LOCAL desx&,desy&,desw&,desh&,ty%,nom% LOCAL cdx&,cdy&,pf&,pg&,cou&,cl|,obac& LOCAL memzoy&,masquage! ' objc_offset(adr_hierarchie%,hie_sous&,zmx&,zmy&) zmw&=OB_W(adr_hierarchie%,hie_sous&) zmh&=OB_H(adr_hierarchie%,hie_sous&) ' IF NOT ind! set_clipping_rectangle(1,zmx&,zmy&,PRED(ADD(zmx&,zmw&)),PRED(ADD(zmy&,zmh&)),0,0) ENDIF z_h%=zone_hierarchie% CLR i% DO ty%=INT{z_h%} obac&=INT{ADD(z_h%,28)} CLR cou&,cl| IF (ty%=4) OR (ty%=6) OR (ty%=7) cou&=INT{ADD(@adresse_objet(obac&),offset_couleur&)} cl|=SUCC(@calque_actif(@adresse_objet(obac&))) masquage!=BTST(BYTE{ADD(@adresse_objet(obac&),offset_drapeau0&)},bit_masque|) ELSE IF ty%=3 cou&=obac& ENDIF ' nom%=ADD(z_h%,2) ' zox&=zmx& zoy&=zmy& zow&=zmw& zoh&=zmh& memzoy&=zoy& ' cdx&=CARD{ADD(z_h%,24)} cdy&=CARD{ADD(z_h%,26)} desx&=SUB(ADD(zox&,cdx&),posx_hierarchie%) desy&=SUB(ADD(zoy&,cdy&),posy_hierarchie%) desw&=MUL(wcar&,22) desh&=hcar& pg&=ADD(wcar&,SHR(wcar&,1)) pf&=ADD(hcar&,DIV(hcar&,2)) ' try&=SUB(desy&,pf&) IF i%>0 IF CARD{ADD(SUB(z_h%,30),24)}>cdx& try&=@position_y_dans_la_colonne(cdx&,PRED(i%),memzoy&) ENDIF ENDIF IF RC_INTERSECT(desx&,desy&,desw&,desh&,zox&,zoy&,zow&,zoh&) dessin_d_objet_hierarchie(obac&,desx&,desy&,desw&,desh&,nom%,ty%,try&,cou&,cl|,masquage!) ELSE line(SUB(desx&,pg&),try&,SUB(desx&,pg&),PRED(ADD(desy&,SHR(desh&,1)))) ENDIF EXIT IF desy&>PRED(ADD(zmy&,zmh&)) ' ADD z_h%,30 INC i% LOOP WHILE i% PROCEDURE dessin_d_objet_hierarchie(obac&,desx&,desy&,desw&,desh&,nom%,ty%,try&,cou&,cl|,masquage!) LOCAL desx0&,desx1&,desy1&,desx2&,desy2&,desmy& LOCAL cr|,cv|,cb| LOCAL x1&,y1&,x2&,y2&,x3&,y3&,x4&,y4& ' desx0&=SUB(desx&,ADD(wcar&,SHR(wcar&,1))) desx1&=desx& desy1&=SUB(desy&,hcar&) desx2&=PRED(ADD(desx&,desw&)) desy2&=desy& desmy&=PRED(ADD(desy1&,SHR(desh&,1))) ' set_type_de_ligne(noir&,1,0,0,0,-1) IF ty%=1 line(desx0&,desmy&,SUB(desx1&,SHR(wcar&,1)),desmy&) set_type_de_ligne(rouge&,1,0,0,0,-1) fleche_en_bas(desx1&,desy1&) ELSE line(desx0&,desmy&,SUB(desx1&,SHR(wcar&,1)),desmy&) line(desx0&,try&,desx0&,desmy&) $S%,$S> SELECT ty% CASE 1 ! Nom de la scŠne set_type_de_ligne(noir&,1,0,0,0,-1) fleche_en_bas(desx1&,desy1&) CASE 5 ! Titre (lampe et objets) set_type_de_ligne(vert&,1,0,0,0,-1) fleche_en_bas(desx1&,desy1&) CASE 6 ! CSG/Blob ouverts set_type_de_ligne(rouge&,1,0,0,0,-1) fleche_en_bas(desx1&,desy1&) CASE 7 ! CSG/Blob ferm‚s set_type_de_ligne(bleu&,1,0,0,0,-1) fleche_en_bas(desx1&,desy1&) DEFAULT ! Tous les autres set_type_de_ligne(noir&,1,0,0,0,-1) fleche_a_droite(desx1&,desy1&) ENDSELECT ENDIF ' set_type_de_ligne(noir&,1,0,0,0,-1) set_writing_mode(mode_xor|) IF taille_vue_hierarchie|=0 set_text_mode(noir&,0,0,4,-1,vdihandle%) text(ADD(desx&,wcar&),SUB(desy2&,1),nom%) ELSE IF taille_vue_hierarchie|=1 set_text_mode(noir&,0,0,6,-1,vdihandle%) text(ADD(desx&,wcar&),SUB(desy2&,2),nom%) ELSE IF taille_vue_hierarchie|=2 set_text_mode(noir&,0,0,13,-1,vdihandle%) text(ADD(desx&,wcar&),SUB(desy2&,3),nom%) ENDIF graf_mouse(m_off&,0) set_writing_mode(mode_remplace|) ' IF ty%=3 cr|=BYTE{ADD(@adresse_source(cou&),4)} cv|=BYTE{ADD(@adresse_source(cou&),5)} cb|=BYTE{ADD(@adresse_source(cou&),6)} affichage_couleur_tc(SUCC(desx2&),SUCC(desy1&),SUB(desh&,2),SUB(desh&,2),cr|,cv|,cb|,-1,-1,-1,-1) box(SUCC(desx2&),SUCC(desy1&),SUB(ADD(desx2&,desh&),2),SUB(desy2&,2)) ENDIF IF (ty%=4) OR (ty%=6) OR (ty%=7) set_remplissage(2,8,cou&,-1) vdi_11(1,SUCC(desx2&),SUCC(desy1&),SUB(ADD(desx2&,desh&),2),SUB(desy2&,2),0,0,0,0) box(SUCC(desx2&),SUCC(desy1&),SUB(ADD(desx2&,desh&),2),SUB(desy2&,2)) CHAR{mem_num%}=STR$(cl|,2) set_writing_mode(mode_xor|) text(ADD(desx2&,SHL(wcar&,1)),SUB(desy2&,3),mem_num%) set_writing_mode(mode_remplace|) IF obac&=objet_actif& set_type_de_ligne(rouge&,1,0,0,0,-1) box(PRED(desx1&),PRED(desy1&),PRED(desx2&),SUB(desy2&,2)) ENDIF set_type_de_ligne(noir&,1,0,0,0,-1) desx1&=SUCC(ADD(desx2&,SHL(wcar&,2))) desx2&=PRED(ADD(desx1&,SHL(wcar&,1))) SUB desy2&,3 box(desx1&,desy1&,desx2&,desy2&) IF NOT masquage! line(desx1&,desy1&,desx2&,desy2&) line(desx1&,desy2&,desx2&,desy1&) ENDIF ENDIF graf_mouse(m_on&,0) ' RETURN > PROCEDURE fleche_a_droite(flx&,fly&) LOCAL x1&,y1&,x2&,y2&,x3&,y3& ' x1&=flx& y1&=ADD(fly&,DIV(hcar&,4)) x2&=PRED(ADD(flx&,wcar&)) y2&=PRED(ADD(fly&,SHR(hcar&,1))) x3&=flx& y3&=SUB(PRED(ADD(fly&,hcar&)),DIV(hcar&,4)) ' line(x1&,y1&,x2&,y2&) line(x2&,y2&,x3&,y3&) line(x3&,y3&,x1&,y1&) RETURN > PROCEDURE fleche_en_bas(flx&,fly&) LOCAL x1&,y1&,x2&,y2&,x3&,y3& ' x1&=flx& y1&=ADD(fly&,DIV(hcar&,3)) x2&=PRED(ADD(flx&,wcar&)) y2&=ADD(fly&,DIV(hcar&,3)) x3&=PRED(ADD(flx&,SHR(wcar&,1))) y3&=SUB(PRED(ADD(fly&,hcar&)),DIV(hcar&,3)) ' line(x1&,y1&,x2&,y2&) line(x2&,y2&,x3&,y3&) line(x3&,y3&,x1&,y1&) RETURN ' > FUNCTION clique_dans_hierarchie LOCAL i%,z_h%,zox&,zoy&,zow&,zoh&,dxc&,dyc& LOCAL desx&,desy&,desw&,desh&,ty%,nom% LOCAL finx&,finy&,zox2&,zoy2& ' couleur_hierarchie!=FALSE calque_hierarchie!=FALSE ferme_ouvre_hierarchie!=FALSE masque_hierarchie!=FALSE ' z_h%=zone_hierarchie% CLR i% DO ty%=INT{z_h%} objc_offset(adr_hierarchie%,hie_sous&,zox&,zoy&) ' dxc&=CARD{ADD(z_h%,24)} dyc&=CARD{ADD(z_h%,26)} desx&=SUB(SUB(ADD(zox&,dxc&),posx_hierarchie%),wcar&) desy&=SUB(ADD(zoy&,dyc&),posy_hierarchie%) SUB desy&,hcar& desw&=ADD(MUL(wcar&,28),SHR(wcar&,1)) desh&=hcar& ' finx&=PRED(ADD(desx&,desw&)) finy&=PRED(ADD(desy&,desh&)) ' zow&=OB_W(adr_hierarchie%,hie_sous&) zoh&=OB_H(adr_hierarchie%,hie_sous&) zox2&=PRED(ADD(zox&,zow&)) zoy2&=PRED(ADD(zoy&,zoh&)) ' IF ((global_mx&=>desx&) AND (global_mx&<=finx&)) AND ((global_my&=>desy&) AND (global_my&<=finy&)) IF (global_mx&SUB(finx&,MUL(wcar&,6)) AND (global_mx&SUB(finx&,MUL(wcar&,4)) AND (global_mx&<=SUB(finx&,MUL(wcar&,2)))) AND ((ty%=4) OR (ty%=6) OR (ty%=7)) calque_hierarchie!=TRUE ENDIF IF (global_mx&>SUB(finx&,MUL(wcar&,2)) AND (global_mx&<=finx&)) AND ((ty%=4) OR (ty%=6) OR (ty%=7)) masque_hierarchie!=TRUE ENDIF set_clipping_rectangle(1,zox&,zoy&,zox2&,zoy2&,0,0) set_remplissage(2,8,noir&,-1) set_writing_mode(mode_xor|) pbox(SUB(desx&,2),desy&,ADD(finx&,4),finy&) videsouris pbox(SUB(desx&,2),desy&,ADD(finx&,4),finy&) set_writing_mode(mode_remplace|) set_clipping_rectangle(0,zox&,zoy&,zox2&,zoy2&,0,0) RETURN i% ENDIF ' ADD z_h%,30 INC i% LOOP WHILE i% FUNCTION nombre_de_source_active LOCAL adr_sr%,fin_s%,cpt_scr% ' CLR cpt_scr% fin_s%=@adresse_source(nombre_de_source&) adr_sr%=source% DO IF BYTE{adr_sr%}=1 INC cpt_scr% ENDIF ADD adr_sr%,taille_source& LOOP WHILE adr_sr% FUNCTION position_y_dans_la_colonne(flx&,num%,zoy&) LOCAL z_adr% DO z_adr%=ADD(zone_hierarchie%,MUL(num%,30)) IF CARD{ADD(z_adr%,24)}=flx& RETURN SUB(SUB(ADD(zoy&,CARD{ADD(z_adr%,26)}),posy_hierarchie%),ADD(hcar&,DIV(hcar&,2))) ENDIF DEC num% LOOP WHILE num%>0 RETURN SUB(SUB(ADD(zoy&,CARD{ADD(zone_hierarchie%,26)}),posy_hierarchie%),ADD(hcar&,DIV(hcar&,2))) ENDFUNC ' ********************** Gestion des calques (10 au maximum) ******************* > FUNCTION ecrire_etat_calques ! Comment qui sont ces calques LOCAL co|,n%,i&,ret&,ob_spec%,te_color& ob_state(adr_calques%,caldef01&,aes_checked&,FALSE) ob_state(adr_calques%,caldef02&,aes_checked&,FALSE) ob_state(adr_calques%,caldef03&,aes_checked&,FALSE) ob_state(adr_calques%,caldef04&,aes_checked&,FALSE) ob_state(adr_calques%,caldef05&,aes_checked&,FALSE) ob_state(adr_calques%,caldef06&,aes_checked&,FALSE) ob_state(adr_calques%,caldef07&,aes_checked&,FALSE) ob_state(adr_calques%,caldef08&,aes_checked&,FALSE) ob_state(adr_calques%,caldef09&,aes_checked&,FALSE) ob_state(adr_calques%,caldef10&,aes_checked&,FALSE) CLR ret&,i& n%=nom_calque% DO BYTE{ADD(n%,33)}=0 CHAR{{OB_SPEC(adr_calques%,ADD(calnom01&,i&))}}=CHAR{n%} IF BYTE{ADD(n%,35)}=0 ret&=BSET(ret&,0) ob_state(adr_calques%,ADD(caviof01&,i&),aes_selected&,TRUE) ob_state(adr_calques%,ADD(cavion01&,i&),aes_selected&,FALSE) ELSE ob_state(adr_calques%,ADD(caviof01&,i&),aes_selected&,FALSE) ob_state(adr_calques%,ADD(cavion01&,i&),aes_selected&,TRUE) ENDIF co|=BYTE{ADD(n%,34)} ob_spec%=OB_SPEC(adr_calques%,ADD(calcou01&,i&)) te_color&=INT{ADD(ob_spec%,18)} te_color&=te_color& AND -128 te_color&=te_color& OR 112 ! Trame pleine te_color&=te_color& OR co| ! Couleur de l'objet INT{ADD(ob_spec%,18)}=te_color& CHAR{{OB_SPEC(adr_calques%,ADD(calcou01&,i&))}}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(coul0&,co|))}} ' ADD n%,36 INC i& LOOP WHILE i&<10 couleur_active&=BYTE{ADD(ADD(nom_calque%,MUL(calque_actif|,36)),34)} ob_state(adr_calques%,ADD(caldef01&,calque_actif|),aes_checked&,TRUE) RETURN ret& ENDFUNC > FUNCTION lire_etat_calques ! Et bien maintenant c'est ainsi LOCAL n%,i|,vis|,ret&,i& CLR vis|,ret&,i& n%=nom_calque% DO CHAR{n%}=LEFT$(CHAR{{OB_SPEC(adr_calques%,ADD(calnom01&,i&))}},33) BYTE{ADD(n%,33)}=0 IF BTST(OB_STATE(adr_calques%,ADD(cavion01&,i&)),aes_selected&) ret&=BSET(ret&,0) BYTE{ADD(n%,35)}=1 INC vis| ELSE BYTE{ADD(n%,35)}=0 ENDIF IF BTST(OB_STATE(adr_calques%,ADD(caldef01&,i&)),aes_checked&) calque_actif|=i& ENDIF INC i& ADD n%,36 LOOP WHILE i&<10 ' ------------ Si aucun calque n'est visible, on force le calque actif IF vis|=0 BYTE{ADD(ADD(nom_calque%,MUL(calque_actif|,36)),35)}=1 ENDIF couleur_active&=BYTE{ADD(ADD(nom_calque%,MUL(calque_actif|,36)),34)} RETURN ret& ENDFUNC > PROCEDURE indique_calque_actif(unv%) ! Actif ou non actif... BYTE{ADD(unv%,offset_calque&)}=calque_actif| RETURN > FUNCTION calque_actif(unv%) ! ... tel est la question ! RETURN BYTE{ADD(unv%,offset_calque&)} ENDFUNC > PROCEDURE les_calque_invisibles_sauf(clq|) LOCAL n%,i| calque_actif|=clq| n%=nom_calque% CLR i| DO BYTE{ADD(n%,35)}=ABS(i|=clq|) ! 0 si diff‚rent ou 1 si ‚gale ADD n%,36 INC i| LOOP WHILE i|<10 RETURN > PROCEDURE tous_les_calques_visibles LOCAL n%,i| n%=nom_calque% CLR i| DO BYTE{ADD(n%,35)}=1 ADD n%,36 INC i| LOOP WHILE i|<10 RETURN > PROCEDURE calque_on_off(nu&,i!) ob_state(adr_calques%,ADD(cavion01&,nu&),aes_selected&,i!) ob_state(adr_calques%,ADD(caviof01&,nu&),aes_selected&,NOT i!) redraw_elem(adr_calques%,ADD(cavion01&,nu&)) redraw_elem(adr_calques%,ADD(caviof01&,nu&)) RETURN > FUNCTION nombre_d_objets_affichable LOCAL tto&,mem_act& ' mem_act&=objet_actif& CLR clq|,tto& DO IF BYTE{ADD(ADD(nom_calque%,MUL(clq|,36)),35)}=1 ADD tto&,@nombre_d_objets_dans_calque(clq|) ENDIF INC clq| LOOP WHILE clq|<10 objet_actif&=mem_act& ' RETURN tto& ' ENDFUNC > FUNCTION nombre_d_objets_dans_calque(clq|) LOCAL niv%,fin_niv%,num&,act&,nnou!,obac& nnou!=(@calque_actif(@adresse_objet(objet_actif&))<>clq|) CLR num& IF nombre_d_objets&>0 obac&=-1 CLR act& niv%=univers% fin_niv%=@adresse_objet(nombre_d_objets&) DO IF @calque_actif(niv%)=clq| INC num& IF obac&=-1 obac&=act& ENDIF ENDIF INC act& ADD niv%,taille_objet& LOOP WHILE niv% PROCEDURE charger_zone_predefinie(n&,adrs_d%,in|) ! LOCAL taille_loc& LOCAL zone_charger_local% ' zone_charger_local%=adrs_d% nom_fichier_texture(in|) taille_loc&=taille_couleur& ' OPEN "i",#1,CHAR{mem_nom%} SEEK #1,MUL(n&,taille_loc&) BGET #1,zone_charger_local%,taille_loc& CLOSE #1 ' RETURN > PROCEDURE ajout_de_definition(ad_r%,in|) ! LOCAL adr_mvt%,n%,pos& LOCAL total_local& LOCAL bouton_local& LOCAL arbre_local% LOCAL include_local% LOCAL taille_local& LOCAL zone_sauver_local%,tt% LOCAL adr_p%,adr_n%,adr_f%,adr_h% ' zone_sauver_local%=ad_r% arbre_local%=adr_predefinie% bouton_local&=ficcolor& taille_local&=taille_couleur& ABSOLUTE include_local%,*include_couleur% ABSOLUTE total_local&,*total_couleur& zone_sauver_local%=ADD(ad_r%,2) ' nom_fichier_texture(in|) CHAR{{OB_SPEC(adr_saisie%,saisinom&)}}="" n%=@saisie_d_un_nom(arbre_local%,bouton_local&) IF n%<>-1 OPEN "o",#1,CHAR{mem_che%} BPUT #1,include_local%,MUL(total_local&,22) CLOSE #1 libere(*include_local%) INC total_local& include_local%=@prendre(MUL(total_local&,22),TRUE,3) OPEN "i",#1,CHAR{mem_che%} tt%=LOF(#1) BGET #1,include_local%,tt% CLOSE #1 adr_mvt%=ADD(include_local%,MUL(PRED(total_local&),22)) CHAR{{OB_SPEC(arbre_local%,bouton_local&)}}=TRIM$(LEFT$(CHAR{n%}+SPACE$(20),20)) CHAR{adr_mvt%}=TRIM$(LEFT$(CHAR{n%}+SPACE$(20),20)) OPEN "o",#1,CHAR{mem_che%} BPUT #1,include_local%,MUL(total_local&,22) CLOSE #1 INT{ad_r%}=PRED(total_local&) ' IF NOT @s_exist(mem_nom%) membfill(coord_polygon%,1024,0) OPEN "o",#1,CHAR{mem_nom%} BPUT #1,coord_polygon%,taille_local& CLOSE #1 ENDIF OPEN "a",#1,CHAR{mem_nom%} BPUT #1,zone_sauver_local%,taille_local& CLOSE #1 ENDIF redraw_elem(arbre_local%,bouton_local&) RETURN > PROCEDURE modif_de_definition(ad_r%,in|) ! LOCAL adr_mvt%,n%,pos% LOCAL total_local& LOCAL bouton_local& LOCAL arbre_local% LOCAL include_local% LOCAL taille_local& LOCAL zone_sauver_local% LOCAL adr_p%,adr_n%,adr_f%,adr_h% ' zone_sauver_local%=ad_r% total_local&=total_couleur& arbre_local%=adr_predefinie% bouton_local&=ficcolor& taille_local&=taille_couleur& include_local%=include_couleur% zone_sauver_local%=ADD(ad_r%,2) nom_fichier_texture(in|) ' pos%=CARD{ad_r%} CHAR{{OB_SPEC(adr_saisie%,saisinom&)}}=CHAR{{OB_SPEC(arbre_local%,bouton_local&)}} IF NOT preview_texture! n%=@saisie_d_un_nom(arbre_local%,bouton_local&) ELSE n%={OB_SPEC(arbre_local%,bouton_local&)} ENDIF IF n%<>-1 adr_mvt%=ADD(include_local%,MUL(pos%,22)) CHAR{{OB_SPEC(arbre_local%,bouton_local&)}}=TRIM$(LEFT$(CHAR{n%}+SPACE$(20),20)) CHAR{adr_mvt%}=TRIM$(LEFT$(CHAR{n%}+SPACE$(20),20)) OPEN "o",#1,CHAR{mem_che%} BPUT #1,include_local%,MUL(total_local&,22) CLOSE #1 CARD{ad_r%}=pos% OPEN "a",#1,CHAR{mem_nom%} SEEK #1,MUL(pos%,taille_local&) BPUT #1,zone_sauver_local%,taille_local& CLOSE #1 ENDIF redraw_elem(arbre_local%,bouton_local&) RETURN > PROCEDURE efface_une_definition(ad_r%,in|) ! LOCAL adr_mvt%,n%,pos& LOCAL total_local& LOCAL bouton_local& LOCAL arbre_local% LOCAL include_local% LOCAL taille_local& LOCAL adr_p%,adr_n%,adr_f%,adr_h% ' total_local&=total_couleur& arbre_local%=adr_predefinie% bouton_local&=ficcolor& taille_local&=taille_couleur& include_local%=include_couleur% ' IF @afficher_alerte(adr_nomimage%)=1 nom_fichier_texture(in|) ' pos&=INT{ad_r%} adr_mvt%=ADD(include_local%,MUL(pos&,22)) CHAR{adr_mvt%}="Vide "+CHR$(0) CHAR{{OB_SPEC(arbre_local%,bouton_local&)}}=TRIM$(LEFT$(CHAR{adr_mvt%}+SPACE$(20),20)) OPEN "o",#1,CHAR{mem_che%} BPUT #1,include_local%,MUL(total_local&,22) CLOSE #1 ' OPEN "a",#1,CHAR{mem_nom%} SEEK #1,MUL(pos&,taille_local&) INT{coord_polygon%}=pos& BPUT #1,ADD(coord_polygon%,2),taille_local& CLOSE #1 ENDIF ' redraw_elem(arbre_local%,bouton_local&) RETURN ' ............................ Les noms des fichiers ........................... > PROCEDURE nom_fichier_texture(n&) ! membfill(coord_polygon%,1024,0) CHAR{mem_nom%}=CHAR{eb_temp%}+"\textures\eb_"+CHR$(0) CHAR{mem_che%}=CHAR{eb_temp%}+"\textures\eb_"+CHR$(0) $S&,$S> SELECT n& CASE 0 CHAR{mem_nom%}=CHAR{mem_nom%}+"textu.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"textu.idx"+CHR$(0) CASE 1 CHAR{mem_nom%}=CHAR{mem_nom%}+"coule.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"coule.idx"+CHR$(0) CASE 2 CHAR{mem_nom%}=CHAR{mem_nom%}+"pigme.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"pigme.idx"+CHR$(0) CASE 3 CHAR{mem_nom%}=CHAR{mem_nom%}+"norma.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"norma.idx"+CHR$(0) CASE 4 CHAR{mem_nom%}=CHAR{mem_nom%}+"finis.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"finis.idx"+CHR$(0) CASE 5 CHAR{mem_nom%}=CHAR{mem_nom%}+"inter.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"inter.idx"+CHR$(0) CASE 6 CHAR{mem_nom%}=CHAR{mem_nom%}+"c_map.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"c_map.idx"+CHR$(0) CASE 7 CHAR{mem_nom%}=CHAR{mem_nom%}+"t_map.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"t_map.idx"+CHR$(0) CASE 8 CHAR{mem_nom%}=CHAR{mem_nom%}+"p_map.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"p_map.idx"+CHR$(0) CASE 9 CHAR{mem_nom%}=CHAR{mem_nom%}+"n_map.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"n_map.idx"+CHR$(0) CASE 10 CHAR{mem_nom%}=CHAR{mem_nom%}+"warp.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"warp.idx"+CHR$(0) CASE 11 CHAR{mem_nom%}=CHAR{mem_nom%}+"proje.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"proje.idx"+CHR$(0) CASE 12 CHAR{mem_nom%}=CHAR{mem_nom%}+"atmos.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"atmos.idx"+CHR$(0) CASE 13 CHAR{mem_nom%}=CHAR{mem_nom%}+"s_map.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"s_map.idx"+CHR$(0) CASE 14 CHAR{mem_nom%}=CHAR{mem_nom%}+"media.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"media.idx"+CHR$(0) CASE 15 CHAR{mem_nom%}=CHAR{mem_nom%}+"scatt.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"scatt.idx"+CHR$(0) CASE 16 CHAR{mem_nom%}=CHAR{mem_nom%}+"densi.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"densi.idx"+CHR$(0) CASE 17 CHAR{mem_nom%}=CHAR{mem_nom%}+"d_map.ovl"+CHR$(0) CHAR{mem_che%}=CHAR{mem_che%}+"d_map.idx"+CHR$(0) ENDSELECT minuscule(mem_che%) minuscule(mem_nom%) RETURN ' ****************************************************************************** > PROCEDURE recupere_les_sources SINGLE{ADD(mem_src%,8)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,sourenx&)}}) SINGLE{ADD(mem_src%,12)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,soureny&)}}) SINGLE{ADD(mem_src%,16)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,sourenz&)}}) SINGLE{ADD(mem_src%,20)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,viseenx&)}}) SINGLE{ADD(mem_src%,24)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,viseeny&)}}) SINGLE{ADD(mem_src%,28)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,viseenz&)}}) SINGLE{ADD(mem_src%,32)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,surflarg&)}}) SINGLE{ADD(mem_src%,36)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,surflong&)}}) SINGLE{ADD(mem_src%,40)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,surfrotx&)}}) SINGLE{ADD(mem_src%,44)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,surfroty&)}}) INT{ADD(mem_src%,48)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,radius&)}}) INT{ADD(mem_src%,50)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,falloff&)}}) INT{ADD(mem_src%,52)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,filstigh&)}}) BYTE{ADD(mem_src%,56)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,surfadap&)}}) SINGLE{ADD(mem_src%,58)}=VAL(CHAR{{OB_SPEC(adr_lumieres%,surdista&)}}) CHAR{ADD(mem_src%,62)}=CHAR{{OB_SPEC(adr_lumieres%,nom_src&)}} RETURN ' ****************************************************************************** > FUNCTION saisie_d_un_nom(arb_adr%,edi&) ! Bon, on a besoin d'un nom l… ! LOCAL x&,y&,w&,h&,obje&,sortie!,ret! videsouris sortie!=FALSE objc_offset(arb_adr%,0,x&,y&) objc_offset(arb_adr%,edi&,obje&,y&) w&=OB_W(arb_adr%,0) IF PRED(ADD(obje&,OB_W(adr_saisie%,0)))=>PRED(ADD(x&,w&)) x&=SUB(PRED(ADD(x&,w&)),OB_W(adr_saisie%,0)) ELSE objc_offset(arb_adr%,edi&,x&,y&) ENDIF ADD x&,16 x&=SHL(SHR(x&,4),4) objc_offset(arb_adr%,edi&,obje&,y&) OB_X(adr_saisie%,0)=x& OB_Y(adr_saisie%,0)=y& w&=OB_W(adr_saisie%,0) h&=OB_H(adr_saisie%,0) objc_draw(adr_saisie%,0,12,PRED(x&),PRED(y&),ADD(w&,2),ADD(h&,2),-1) videsouris DO obje&=@form_do(adr_saisie%,saisinom&) SELECT obje& CASE annsais& objc_change(adr_saisie%,obje&) ret!=FALSE sortie!=TRUE CASE valisais& objc_change(adr_saisie%,obje&) ret!=TRUE sortie!=TRUE ENDSELECT LOOP WHILE NOT sortie! objc_draw(arb_adr%,0,12,PRED(x&),PRED(y&),ADD(w&,2),ADD(h&,2),-1) IF ret! RETURN {OB_SPEC(adr_saisie%,saisinom&)} ELSE RETURN -1 ENDIF ENDFUNC > PROCEDURE saisie_d_une_composante(arb_adr%,edi_&,mi,ma,lo&,vi&) ! Clavier LOCAL sortie!,ret!,val,x&,y&,w&,h&,x0&,y0& LOCAL evnt&,champ&,i_& videsouris sortie!=FALSE modifie_la_saisie(arb_adr%,edi_&,mi,ma,lo&,vi&,x&,y&,w&,h&) DO evnt&=@xform_do(&X110011,adr_saisie%,0) IF BTST(evnt&,0) ! EVENEMENT CLAVIER IF BYTE(key&)=&HD ' RETRUN ou ENTER objc_change(adr_saisie%,valisais&) ret!=TRUE sortie!=TRUE ELSE IF key&=&H6100 ' UNDO objc_change(adr_saisie%,annsais&) ret!=FALSE sortie!=TRUE objc_change(adr_saisie%,annsais&) ELSE IF key&=&H5000 ! Si flŠche vers le bas champ&=@next(arb_adr%,edi_&) ! Chercher champ suivant ' S'il y en a un et qu'il n'est pas DISABLE IF champ&>-1 IF NOT BTST(OB_STATE(arb_adr%,champ&),aes_disable&) IF mi<>ma val=VAL(CHAR{{OB_SPEC(adr_saisie%,saisinom&)}}) val=-val*(val>mi AND val<=ma)-mi*(val<=mi)-ma*(val>ma) CHAR{{OB_SPEC(arb_adr%,edi_&)}}=STR$(val,lo&,vi&) ELSE CHAR{{OB_SPEC(arb_adr%,edi_&)}}=LEFT$(CHAR{{OB_SPEC(adr_saisie%,saisinom&)}}+SPACE$(lo&),lo&) ENDIF objc_draw(arb_adr%,0,12,x&,y&,w&,h&,-1) redraw_elem(arb_adr%,edi_&) edi_&=champ& nouveau_masque_de_saisie(arb_adr%,edi_&,mi,ma,lo&,vi&) modifie_la_saisie(arb_adr%,edi_&,mi,ma,lo&,vi&,x&,y&,w&,h&) ENDIF ENDIF ELSE IF key&=&H4800 ! Si flŠche vers le bas champ&=@prev(arb_adr%,edi_&) ! Chercher champ pr‚c‚dent ' S'il y en a un et qu'il n'est pas DISABLE IF champ&>-1 IF BTST(OB_STATE(arb_adr%,champ&),aes_disable&)=0 IF mi<>ma val=VAL(CHAR{{OB_SPEC(adr_saisie%,saisinom&)}}) val=-val*(val>mi AND val<=ma)-mi*(val<=mi)-ma*(val>ma) CHAR{{OB_SPEC(arb_adr%,edi_&)}}=STR$(val,lo&,vi&) ELSE CHAR{{OB_SPEC(arb_adr%,edi_&)}}=LEFT$(CHAR{{OB_SPEC(adr_saisie%,saisinom&)}}+SPACE$(lo&),lo&) ENDIF objc_draw(arb_adr%,0,12,x&,y&,w&,h&,-1) redraw_elem(arb_adr%,edi_&) edi_&=champ& nouveau_masque_de_saisie(arb_adr%,edi_&,mi,ma,lo&,vi&) modifie_la_saisie(arb_adr%,edi_&,mi,ma,lo&,vi&,x&,y&,w&,h&) ENDIF ENDIF ENDIF CLR evnt& ENDIF IF BTST(evnt&,1) ! EVENEMENT DE CLIC SOURIS $S&,$S> SELECT objet& CASE annsais& objc_change(adr_saisie%,objet&) ret!=FALSE sortie!=TRUE CASE valisais& objc_change(adr_saisie%,objet&) ret!=TRUE sortie!=TRUE ENDSELECT CLR evnt& ENDIF LOOP WHILE NOT sortie! IF edit&>0 objc_edit(adr_saisie%,edit&,0,pos&,3,pos&) CLR edit& ENDIF ' IF LEN(CHAR{{OB_SPEC(adr_saisie%,saisinom&)}}) ' FOR i_&=1 TO LEN(CHAR{{OB_SPEC(adr_saisie%,saisinom&)}}) ' NEXT i_& ' ENDIF IF ret! IF mi<>ma val=VAL(CHAR{{OB_SPEC(adr_saisie%,saisinom&)}}) val=-val*(val>mi AND val<=ma)-mi*(val<=mi)-ma*(val>ma) CHAR{{OB_SPEC(arb_adr%,edi_&)}}=STR$(val,lo&,vi&) ELSE CHAR{{OB_SPEC(arb_adr%,edi_&)}}=LEFT$(CHAR{{OB_SPEC(adr_saisie%,saisinom&)}}+SPACE$(lo&),lo&) ENDIF ENDIF objc_draw(arb_adr%,0,12,x&,y&,w&,h&,-1) form_dial(3,x&,y&,w&,h&,x&,y&,w&,h&) RETURN > PROCEDURE nouveau_masque_de_saisie(arb_adr%,edi_&,VAR mi,ma,lo&,vi&) ' Avec : mi = Valeur minimum autoris‚e ' ma = Valeur maximum autoris‚e ' lo&= Longueur de la chaine totale en caractŠres ' vi&= Nombre de caractŠres aprŠs la virgule mi=0 ma=0 lo&=0 vi&=0 CLR lo&,vi& $S%,$S> SELECT arb_adr% CASE adr_bicubics% $S&,$S> SELECT edi_& CASE somx01&,somx02&,somx03&,somx04&,somy01&,somy02&,somy03&,somy04&,somz01&,somz02&,somz03&,somz04& mi=-999999999 ma=999999999 lo&=10 vi&=3 CASE somx05&,somx06&,somx07&,somx08&,somy05&,somy06&,somy07&,somy08&,somz05&,somz06&,somz07&,somz08& mi=-999999999 ma=999999999 lo&=10 vi&=3 CASE somx09&,somx10&,somx11&,somx12&,somy09&,somy10&,somy11&,somy12&,somz09&,somz10&,somz11&,somz12& mi=-999999999 ma=999999999 lo&=10 vi&=3 CASE somx13&,somx14&,somx15&,somx16&,somy13&,somy14&,somy15&,somy16&,somz13&,somz14&,somz15&,somz16& mi=-999999999 ma=999999999 lo&=10 vi&=3 ENDSELECT CASE adr_quadric% $S&,$S> SELECT edi_& CASE valquad0& TO valquad1& mi=-32768 ma=32767 lo&=9 vi&=3 ENDSELECT CASE adr_quartic% $S&,$S> SELECT edi_& CASE valquar0& TO valquar1& mi=-32768 ma=32767 lo&=9 vi&=3 ENDSELECT CASE adr_fonctions% $S&,$S> SELECT edi_& CASE blobtres& mi=0.00001 ma=0.99999 lo&=8 vi&=5 ENDSELECT CASE adr_vue_subjective% $S&,$S> SELECT edi_& CASE possubx&,possuby&,possubz&,subversx&,subversy&,subversz& mi=-32768 ma=32767 lo&=10 vi&=3 ENDSELECT CASE adr_copier% $S&,$S> SELECT edi_& CASE conombr& mi=1 ma=9999 lo&=4 CASE comdistx&,comdisty&,comdistz& mi=-32768 ma=32767 lo&=9 vi&=3 CASE codegrex&,codegrey&,codegrez& mi=-180 ma=180 lo&=8 vi&=3 CASE coptauxx&,coptauxy&,coptauxz& mi=1 ma=999 lo&=3 vi&=0 CASE coalea0x&,coalea0y&,coalea0z& mi=0 ma=100 lo&=3 vi&=0 CASE coalea1x&,coalea1y&,coalea1z& mi=0 ma=100 lo&=3 vi&=0 CASE coalea2x&,coalea2y&,coalea2z& mi=0 ma=100 lo&=3 vi&=0 CASE coinitia& mi=0 ma=999999999 lo&=9 vi&=0 ENDSELECT CASE adr_calage% $S&,$S> SELECT edi_& CASE refx&,refy&,refz& mi=-32768 ma=32767 lo&=10 vi&=3 ENDSELECT CASE adr_parametres% $S&,$S> SELECT edi_& CASE def_x&,def_y&,def_z& mi=0.01 ma=500 lo&=7 vi&=3 CASE limites& mi=10 ma=32767 lo&=5 CASE cheundo& ma=32767 lo&=5 CASE tailgril& mi=2 ma=500 lo&=3 CASE consxpov&,consypov& ma=999 lo&=3 CASE chedetai& ma=100 lo&=3 ENDSELECT CASE adr_lanceur% $S&,$S> SELECT edi_& CASE povbuffe& ma=999999 lo&=6 CASE povslabs& mi=1 ma=999 lo&=3 CASE povlarge&,povhaute&,cpovdebu&,cpovfin&,rpovdebu&,rpovfin& ma=32767 lo&=5 ENDSELECT CASE adr_lumieres% $S&,$S> SELECT edi_& CASE sourenx&,soureny&,sourenz&,viseenx&,viseeny&,viseenz&,surflarg&,surflong& mi=-32768 ma=32767 lo&=10 vi&=3 CASE surfrotx&,surfroty& mo=-180 ma=180 lo&=7 vi&=2 CASE surfadap& mi=-32768 ma=32767 lo&=6 CASE radius&,falloff& mi=1 ma=180 lo&=3 CASE filstigh& mi=0 ma=100 lo&=3 ENDSELECT CASE adr_camera% $S&,$S> SELECT edi_& CASE poscamx&,poscamy&,poscamz&,posversx&,posversy&,posversz&,posfocax&,posfocay&,posfocaz& mi=-32768 ma=32767 lo&=10 vi&=3 CASE possampl&,posapert& mi=0 ma=100 lo&=3 vi&=0 CASE posangle& mi=-180 ma=180 lo&=8 vi&=3 CASE posobdeg& ma=180 lo&=7 vi&=3 ENDSELECT CASE adr_modifier% $S&,$S> SELECT edi_& CASE modtora1&,modtora2& mi=-360 ma=360 lo&=4 CASE modpx&,modpy&,modpz& mi=-32768 ma=32767 lo&=10 vi&=3 CASE modtx&,modty&,modtz& mi=0.001 ma=65535 lo&=9 vi&=3 CASE trisomx1&,trisomy1&,trisomz1&,trisomx2&,trisomy2&,trisomz2&,trisomx3&,trisomy3&,trisomz3& mi=-32768 ma=32767 lo&=10 vi&=3 CASE modthrbl& mi=0.00001 ma=1 lo&=8 vi&=5 CASE modforbl& mi=-1 ma=1 lo&=8 vi&=5 CASE modrx&,modry&,modrz& mi=-180 ma=180 lo&=8 vi&=3 ENDSELECT CASE adr_calques% $S&,$S> SELECT edi_& CASE calnom01& TO calnom10& lo&=12 ENDSELECT ENDSELECT RETURN > PROCEDURE modifie_la_saisie(arb_adr%,edi_&,mi,ma,lo&,vi&,VAR x&,y&,w&,h&) LOCAL val,x0&,y0& IF mi<>ma val=VAL(CHAR{{OB_SPEC(arb_adr%,edi_&)}}) CHAR{{OB_SPEC(adr_saisie%,saisinom&)}}=STR$(val,lo&,vi&) ELSE CHAR{{OB_SPEC(adr_saisie%,saisinom&)}}=TRIM$(LEFT$(CHAR{{OB_SPEC(arb_adr%,edi_&)}}+SPACE$(lo&),lo&)) ENDIF objc_offset(arb_adr%,0,x&,y&) objc_offset(arb_adr%,edi_&,x0&,y0&) w&=OB_W(arb_adr%,0) h&=OB_H(arb_adr%,0) IF PRED(ADD(x0&,OB_W(adr_saisie%,0)))=>PRED(ADD(x&,w&)) x&=SUB(PRED(ADD(x&,w&)),OB_W(adr_saisie%,0)) ELSE objc_offset(arb_adr%,edi_&,x&,y0&) ENDIF x&=SHL(SHR(x&,4),4) IF PRED(ADD(y0&,OB_H(adr_saisie%,0)))=>PRED(ADD(y&,h&)) y&=SUB(PRED(ADD(y&,h&)),OB_H(adr_saisie%,0)) ELSE objc_offset(arb_adr%,edi_&,x0&,y&) ENDIF IF x&<0 x&=0 ENDIF IF y& PROCEDURE saisie_d_une_ligne(arb_adr%,edi&,bok&,min,max,lo&,vi&) ! Clavier LOCAL obj&,sortie!,ret!,val IF vi&=0 CHAR{{OB_SPEC(arb_adr%,edi&)}}=TRIM$(CHAR{{OB_SPEC(arb_adr%,edi&)}}) ENDIF ob_flags(arb_adr%,bok&,aes_default&,FALSE) ob_flags(arb_adr%,edi&,aes_editable&,TRUE) ob_flags(arb_adr%,edi&,aes_default&,TRUE) sortie!=FALSE videsouris DO obj&=@form_do(arb_adr%,edi&) SELECT obj& CASE edi& objc_change(arb_adr%,obj&) sortie!=TRUE DEFAULT objc_change(arb_adr%,obj&) ENDSELECT LOOP WHILE NOT sortie! IF mi<>ma val=VAL(CHAR{{OB_SPEC(arb_adr%,edi&)}}) val=-val*(val>mi AND val<=ma)-mi*(val<=mi)-ma*(val>ma) CHAR{{OB_SPEC(arb_adr%,edi&)}}=STR$(val,lo&,vi&) ELSE CHAR{{OB_SPEC(arb_adr%,edi&)}}=LEFT$(CHAR{{OB_SPEC(arb_adr%,edi&)}}+SPACE$(lo&),lo&) ENDIF objc_change(arb_adr%,edi&) ob_flags(arb_adr%,edi&,aes_default&,FALSE) ob_flags(arb_adr%,edi&,aes_editable&,FALSE) ob_flags(arb_adr%,bok&,aes_default&,TRUE) redraw_elem(arb_adr%,edi&) RETURN ' ****************************************************************************** > PROCEDURE image_deja_presente(ind!,sel!) LOCAL obspec% IF ind! definition_fichier(adr_parametres%,cheimg&,nom_en_cours%,ind!,sel!,OB_SPEC(adr_divers%,lin0&)) CHAR{masque%}=LEFT$(TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}}),3)+CHR$(0) minuscule(masque%) IF CHAR{nom_en_cours%}<>"" CHAR{nom_divers%}=CHAR{nom_en_cours%}+CHR$(0) IF INSTR(CHAR{nom_divers%},".") extend(nom_divers%,masque%,nom_divers%) CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}=LEFT$(CHAR{nom_divers%}+" ",12) ELSE IF LEN(CHAR{nom_divers%})<39 CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}=LEFT$(CHAR{nom_divers%}+"_"+CHAR{masque%}+SPACE$(43),43) ELSE CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}=LEFT$(CHAR{nom_divers%},39)+"_"+CHAR{masque%} ENDIF ENDIF ENDIF ENDIF membfill(mem_che%,512,0) obspec%=OB_SPEC(adr_parametres%,cheimg&) CHAR{mem_che%}=LEFT$(CHAR{{obspec%}},RINSTR(CHAR{{obspec%}},"\"))+TRIM$(CHAR{{OB_SPEC(adr_lanceur%,povimage&)}})+CHR$(0) IF @s_exist(mem_che%) ob_state(adr_lanceur%,cpovdebu&,aes_disable&,TRUE) ob_state(adr_lanceur%,cpovfin&,aes_disable&,TRUE) ob_state(adr_lanceur%,rpovdebu&,aes_disable&,TRUE) ob_state(adr_lanceur%,rpovfin&,aes_disable&,TRUE) ob_state(adr_lanceur%,povcont&,aes_disable&,FALSE) ELSE ob_state(adr_lanceur%,cpovdebu&,aes_disable&,FALSE) ob_state(adr_lanceur%,cpovfin&,aes_disable&,FALSE) ob_state(adr_lanceur%,rpovdebu&,aes_disable&,FALSE) ob_state(adr_lanceur%,rpovfin&,aes_disable&,FALSE) ob_state(adr_lanceur%,povcont&,aes_disable&,TRUE) ENDIF RETURN ' ****************************************************************************** > PROCEDURE creation(type&,in!) ! La, on ajoute une primitive … la scŠne LOCAL univ%,top&,temp&,vect_norm% LOCAL nbp%,nbf%,adr_obje%,adr_face% ' IF nombre_d_objets&=>limite_des_objets& ~@afficher_alerte(adr_depasse%) ELSE hierachie_ok!=FALSE objet_actif&=nombre_d_objets& univ%=@adresse_objet(objet_actif&) INT{univ%}=type& SINGLE{ADD(univ%,2)}=0 SINGLE{ADD(univ%,6)}=0 SINGLE{ADD(univ%,10)}=0 SINGLE{ADD(univ%,14)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_x&)}}) SINGLE{ADD(univ%,18)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_y&)}}) SINGLE{ADD(univ%,22)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_z&)}}) SINGLE{ADD(univ%,26)}=0 SINGLE{ADD(univ%,30)}=0 SINGLE{ADD(univ%,34)}=0 BYTE{ADD(univ%,offset_rapport&)}=0 INT{ADD(univ%,offset_couleur&)}=BYTE{ADD(ADD(nom_calque%,MUL(calque_actif|,36)),34)} INT{ADD(univ%,offset_relation_csg&)}=-1 indique_calque_actif(univ%) $S&,$S> SELECT type& CASE primitive_triangle& SINGLE{ADD(univ%,2)}=-VAL(CHAR{{OB_SPEC(adr_parametres%,def_x&)}})/2 SINGLE{ADD(univ%,6)}=-VAL(CHAR{{OB_SPEC(adr_parametres%,def_y&)}})/2 SINGLE{ADD(univ%,10)}=0 SINGLE{ADD(univ%,14)}=0 SINGLE{ADD(univ%,18)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_y&)}})/2 SINGLE{ADD(univ%,22)}=0 SINGLE{ADD(univ%,26)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_x&)}})/2 SINGLE{ADD(univ%,30)}=-VAL(CHAR{{OB_SPEC(adr_parametres%,def_y&)}})/2 SINGLE{ADD(univ%,34)}=0 CASE primitive_segment& SINGLE{ADD(univ%,14)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_x&)}}) SINGLE{ADD(univ%,18)}=0 SINGLE{ADD(univ%,22)}=0 CASE primitive_disque& SINGLE{ADD(univ%,14)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_x&)}}) SINGLE{ADD(univ%,18)}=2 SINGLE{ADD(univ%,22)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_z&)}}) CASE primitive_plan& SINGLE{ADD(univ%,14)}=2000 SINGLE{ADD(univ%,18)}=2 SINGLE{ADD(univ%,22)}=2000 CASE primitive_tronc_de_cone& BYTE{ADD(univ%,offset_rapport&)}=50 CASE primitive_boite& BYTE{ADD(univ%,offset_rapport&)}=100 CASE primitive_boite_arrondie& BYTE{ADD(univ%,offset_rapport&)}=20 CASE primitive_disque& BYTE{ADD(univ%,offset_rapport&)}=0 CASE primitive_tore& BYTE{ADD(univ%,offset_rapport&)}=80 INT{ADD(univ%,offset_force_blob&)}=0 INT{ADD(univ%,ADD(offset_force_blob&,2))}=360 ENDSELECT CHAR{ADD(univ%,offset_nom_objet&)}=@nom_objet$(type&,TRUE) vider_un_objet(objet_actif&) INC nombre_d_objets& CLR debut_texture&,debut_couleur& IF nombre_d_objets&=1 scene_remplie ENDIF CLR debut_liste_csg&,debut_liste_eff& CLR debut_popup_choix&,debut_popup_lum& tri_3d!=FALSE trace_3d_plein!=FALSE tri_2d!=FALSE tri_fi!=FALSE redimention!=FALSE redessin_deja_fait!=FALSE refaire_toutes_les_normales(objet_actif&,objet_actif&,FALSE,TRUE) IF in! ! Cr‚ation automatique creation_manuelle!=FALSE modif_normale!=FALSE redraw_force(idx_info&,idx_animation&) ELSE ! Cr‚ation manuelle creation_manuelle!=TRUE modif_normale!=TRUE ENDIF ENDIF RETURN ' ****************************************************************************** ' **** R‚alisations des op‚rations Bool‚ennes pour les calculs de C.S.G. **** ' **** Merci … Philippe REVERDY pour les calculs de C.S.G. **** ' ****************************************************************************** > PROCEDURE creation_pour_csg ! On groupe des objets entre eux LOCAL univ%,adr_obj%,adr_fac%,i&,num_ob&,univ2%,csg_pt& LOCAL nbp%,pot&,point_tot%,face_tot%,mem_f! LOCAL taille_p%,taille_f%,j%,fin_o% LOCAL adr_obj_tot%,adr_fac_tot%,cptp&,cpts& LOCAL adr_o%,adr_t%,decalage%,adr_obj% LOCAL lar,hau,pro,milx,mily,milz LOCAL drap|,adr_f2%,mode_facette| LOCAL nbp%,nbf%,adr_obje%,adr_face%,mem_csg% LOCAL ob1&,ob2&,taille_csg%,taille_totale%,taille_ajoute% ' IF (nombre_d_objets&=>limite_des_objets&) AND (NOT modif_csg!) ~@afficher_alerte(adr_depasse%) ELSE hierachie_ok!=FALSE changement_de_taille_transfert_et_ttf mem_f!=dessin_rapide! dessin_rapide!=FALSE IF modif_csg! univ%=@adresse_objet(objet_actif&) csg_pt&=INT{univ%} mem_csg%=INT{ADD(univ%,offset_force_blob&)} libere(ADD(edge%,SHL(objet_actif&,2))) libere(ADD(objet%,SHL(csg_pt&,2))) ELSE objet_actif&=nombre_d_objets& univ%=@adresse_objet(nombre_d_objets&) vider_un_objet(nombre_d_objets&) csg_pt&=primitive& INT{univ%}=primitive& mem_csg%=nombre_de_csg% INC nombre_de_csg% objet_actif&=nombre_d_objets& SELECT type_de_csg& CASE -1 CHAR{ADD(univ%,offset_nom_objet&)}="UNION_D_OBJETS" CASE -2 CHAR{ADD(univ%,offset_nom_objet&)}="INTERSECTION_D_OBJETS" CASE -3 CHAR{ADD(univ%,offset_nom_objet&)}="DIFFERENCE_D_OBJETS" CASE -4 CHAR{ADD(univ%,offset_nom_objet&)}="MERGE_D_OBJETS" CASE -5 CHAR{ADD(univ%,offset_nom_objet&)}="UN_BLOB" ENDSELECT INT{ADD(univ%,offset_relation_csg&)}=-1 indique_calque_actif(univ%) INT{ADD(univ%,offset_couleur&)}=BYTE{ADD(ADD(nom_calque%,MUL(calque_actif|,36)),34)} ENDIF INT{ADD(univ%,offset_csg_type&)}=type_de_csg& CARD{ADD(univ%,offset_force_blob&)}=mem_csg% ' CLR cptp& DO univ2%=@adresse_objet(cptp&) IF INT{ADD(univ2%,offset_relation_csg&)}=objet_actif& INT{ADD(univ2%,offset_relation_csg&)}=-1 ENDIF INC cptp& LOOP WHILE cptp&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ' <<<< Nouvelle zone depuis la version 3.40a >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> libere(ADD(liste_csg%,SHL(mem_csg%,2))) {ADD(liste_csg%,SHL(mem_csg%,2))}=@prendre(taille_ajoute%,TRUE,3) adr_obj%=@adresse_liste_csg(mem_csg%) CARD{adr_obj%}=compteur_csg& ADD adr_obj%,2 CLR cptp& DO num_ob&=CARD{ADD(effacement%,SHL(cptp&,1))} INT{adr_obj%}=cptp& CARD{ADD(adr_obj%,2)}=num_ob& INC cptp& ADD adr_obj%,4 LOOP WHILE cptp&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ' adr_obj%=@adresse_point(csg_pt&) IF taille_csg%=-1 creation_de_la_boite_csg(ob1&,ob2&) CARD{adr_obj%}=7 bmove(transfert%,ADD(adr_obj%,2),96) bmove(@adresse_face({ADD(objet%,4)}),@adresse_face(adr_obj%),74) ELSE ~@construire_une_c.s.g(adr_obj%,0,0) ENDIF nbp%=SUCC(CARD{adr_obj%}) repositionne_csg(adr_obj%,nbp%,lar,hau,pro,milx,mily,milz) IF NOT modif_csg! SINGLE{ADD(univ%,2)}=ROUND(milx,3) SINGLE{ADD(univ%,6)}=ROUND(mily,3) SINGLE{ADD(univ%,10)}=ROUND(milz,3) SINGLE{ADD(univ%,14)}=ROUND(lar,3) SINGLE{ADD(univ%,18)}=ROUND(hau,3) SINGLE{ADD(univ%,22)}=ROUND(pro,3) ENDIF garbage_collector ' IF compteur_csg&>2 ! Du Nø2 au dernier ob1&=objet_actif& cptp&=2 DO ' ********************************************************************** ob2&=CARD{ADD(effacement%,SHL(cptp&,1))} ' ----------------------------------------------- taille_csg%=@construire_une_c.s.g(0,ob1&,ob2&) IF taille_csg%=-1 ' mettre une boŒte puisque le calcul de C.S.G. n'a pu ˆtre fait. taille_totale%=172 ELSE ' Sinon, le calcul a ‚t‚ fait et on r‚serve de quoi ranger ' tout cela. taille_totale%=taille_csg% ENDIF taille_ajoute%=ADD(ADD(2,SHL(compteur_csg&,2)),6) ' libere(ADD(objet%,SHL(csg_pt&,2))) {ADD(objet%,SHL(csg_pt&,2))}=@prendre(taille_totale%,TRUE,3) ' adr_obj%=@adresse_point(csg_pt&) IF taille_csg%=-1 creation_de_la_boite_csg(ob1&,ob2&) CARD{adr_obj%}=7 bmove(transfert%,ADD(adr_obj%,2),96) bmove(@adresse_face({ADD(objet%,4)}),@adresse_face(adr_obj%),74) ELSE ~@construire_une_c.s.g(adr_obj%,0,0) ENDIF nbp%=SUCC(CARD{adr_obj%}) repositionne_csg(adr_obj%,nbp%,lar,hau,pro,milx,mily,milz) IF NOT modif_csg! SINGLE{ADD(univ%,2)}=ROUND(milx,3) SINGLE{ADD(univ%,6)}=ROUND(mily,3) SINGLE{ADD(univ%,10)}=ROUND(milz,3) SINGLE{ADD(univ%,14)}=ROUND(lar,3) SINGLE{ADD(univ%,18)}=ROUND(hau,3) SINGLE{ADD(univ%,22)}=ROUND(pro,3) ENDIF garbage_collector garbage_collector garbage_collector garbage_collector PAUSE 5 ' ********************************************************************** INC cptp& LOOP WHILE cptp&0 libere(*deplacement_multiple%) CLR objets_a_deplacer& ENDIF calcul_selection_multiple!=FALSE objet_suivant objet_precedent ENDIF ' ************************************************************************** ' dessin_rapide!=mem_f! sui: redraw_force(idx_info&,idx_animation&) ENDIF RETURN ' > FUNCTION construire_une_c.s.g(adr_csg%,ob1&,ob2&) LOCAL tail_p%,tail_f%,taille_c% LOCAL off_ob1&,off_ob2&,tt% LOCAL adresse_objet1%,adresse_objet2% LOCAL uni%,nbp%,nbf%,adr_obje%,adr_face% ' ' ob1& : Num‚ro du premier objet ' ob2& : Num‚ro du second objet ' type_de_csg& : Type d'op‚ration Bool‚enne : -1=UNION ' -2=INTERSECTION ' -3=DIFFERENCE ' -4=MERGE (idem UNION) (mettre -1) ' -5=BLOBS (mettre -1 pour l'instant) ' ' *************** Forcer le chemin systŠme pour le module C.S.G ************** chemin_systeme CHAR{commande%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"csg.ovl"+CHR$(0) IF NOT @s_exist(commande%) les_messages_d_erreur(998) RETURN -1 ENDIF ' IF adr_csg%=0 ' ' On dimensionne, tourne et d‚place les deux objets et on les sauve ' temporairement sur le disque pour le module de calcul de C.S.G. ' uni%=@adresse_objet(ob1&) type_d_objet(uni%,nbp%,nbf%,adr_obje%,adr_face%) tail_p%=ADD(MUL(SUCC(nbp%),12),2) tail_f%=ADD(MUL(SUCC(nbf%),6),2) de_reel_vers_vue(adr_obje%,uni%,SUCC(nbp%),FALSE,FALSE) adresse_objet1%=@prendre(ADD(tail_p%,tail_f%),TRUE,3) bmove(transfert%,ADD(adresse_objet1%,2),SUB(tail_p%,2)) CARD{adresse_objet1%}=nbp% bmove(adr_face%,ADD(adresse_objet1%,tail_p%),tail_f%) ' OPEN "o",#1,CHAR{eb_temp%}+"\objet1.obj" BPUT #1,adresse_objet1%,ADD(tail_p%,tail_f%) CLOSE #1 libere(*adresse_objet1%) ' **************************************************************************** uni%=@adresse_objet(ob2&) type_d_objet(uni%,nbp%,nbf%,adr_obje%,adr_face%) tail_p%=ADD(MUL(SUCC(nbp%),12),2) tail_f%=ADD(MUL(SUCC(nbf%),6),2) de_reel_vers_vue(adr_obje%,uni%,SUCC(nbp%),FALSE,FALSE) adresse_objet2%=@prendre(ADD(tail_p%,tail_f%),TRUE,3) bmove(transfert%,ADD(adresse_objet2%,2),SUB(tail_p%,2)) CARD{adresse_objet2%}=nbp% bmove(adr_face%,ADD(adresse_objet2%,tail_p%),tail_f%) ' OPEN "o",#1,CHAR{eb_temp%}+"\objet2.obj" BPUT #1,adresse_objet2%,ADD(tail_p%,tail_f%) CLOSE #1 libere(*adresse_objet2%) ' ecrire_transfert(FALSE) ' CHAR{commande%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"csg.ovl"+CHR$(0) minuscule(commande%) ' ************* Lancement du module de calcul de C.S.G. ************** graf_mouse(m_off&,0) CHAR{mem_num%}=CHR$(0) ret%=GEMDOS(&H4B,shw_load_go&,L:commande%,L:mem_num%,L:mem_num%) graf_mouse(m_on&,0) ' -------------------------------------------------------------------- IF (ret%=-66) OR (ret%=-39) OR (ret%=-33) OR (ret%=-32) OR (ret%=-40) les_messages_d_erreur(ret%) effacer_fichiers_csg(TRUE) RETURN -1 ! Taille … -1 pour anuler ELSE IF ret%<>0 les_messages_d_erreur(999) effacer_fichiers_csg(TRUE) RETURN -1 ! Taille … -1 pour anuler ELSE taille_c%=@lire_retour_csg effacer_fichiers_csg(FALSE) IF taille_c%=-1 les_messages_d_erreur(999) ENDIF RETURN taille_c% ! La taille … r‚server ENDIF ELSE ' ************* l…, on r‚cupŠre l'objet CSG cr‚‚ ******************* ' CHAR{mem_che%}=CHAR{eb_temp%}+"\objet.obj"+CHR$(0) IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} tt%=LOF(#1) BGET #1,adr_csg%,tt% CLOSE #1 ENDIF effacer_fichiers_csg(TRUE) ' RETURN 0 ! Un retour vide, mais retour quand mˆme ENDIF ' ENDFUNC > FUNCTION lire_retour_csg LOCAL termine! LOCAL retour% ' retour%=-1 chemin_systeme CHAR{mem_che%}=CHAR{eb_temp%}+"\eb_model.shm"+CHR$(0) minuscule(mem_che%) OPEN "i",#1,CHAR{mem_che%} IF LOF(#1) DO membfill(mem_che%,512,0) termine!=@lire_une_ligne(mem_che%) EXIT IF LEFT$(CHAR{mem_che%},3)="EOF" IF LEN(CHAR{mem_che%})>1 $S$,$S> SELECT VAL(LEFT$(CHAR{ligne%},3)) CASE 0 enleve_code(mem_che%) retour%=VAL(CHAR{mem_che%}) termine!=TRUE ENDSELECT ENDIF EXIT IF termine! LOOP ENDIF CLOSE #1 RETURN retour% ENDFUNC > PROCEDURE effacer_fichiers_csg(in!) chemin_systeme CHAR{mem_che%}=CHAR{eb_temp%}+"\eb_model.shm"+CHR$(0) efface_fichier CHAR{mem_che%}=CHAR{eb_temp%}+"\objet2.obj"+CHR$(0) efface_fichier CHAR{mem_che%}=CHAR{eb_temp%}+"\objet1.obj"+CHR$(0) efface_fichier IF in! CHAR{mem_che%}=CHAR{eb_temp%}+"\objet.obj"+CHR$(0) efface_fichier ENDIF RETURN > PROCEDURE repositionne_csg(ad%,nbp%,VAR lar,hau,pro,milx,mily,milz) LOCAL x,y,z,i%,u% LOCAL minx,miny,minz LOCAL maxx,maxy,maxz LOCAL fin_i% minx=3.599386269725E+308 miny=3.599386269725E+308 minz=3.599386269725E+308 maxx=-3.599386269725E+308 maxy=-3.599386269725E+308 maxz=-3.599386269725E+308 fin_i%=ADD(ADD(ad%,2),MUL(nbp%,12)) i%=ADD(ad%,2) DO x=ROUND({i%}/1024,3) y=ROUND({ADD(i%,4)}/1024,3) z=ROUND({ADD(i%,8)}/1024,3) minx=MIN(minx,x) miny=MIN(miny,y) minz=MIN(minz,z) maxx=MAX(maxx,x) maxy=MAX(maxy,y) maxz=MAX(maxz,z) ADD i%,12 LOOP WHILE i%1 {i%}=((x-milx)/(lar/2))*1024 ELSE {i%}=(x-milx)*1024 ENDIF IF hau>1 {ADD(i%,4)}=((y-mily)/(hau/2))*1024 ELSE {ADD(i%,4)}=(y-mily)*1024 ENDIF IF pro>1 {ADD(i%,8)}=((z-milz)/(pro/2))*1024 ELSE {ADD(i%,8)}=(z-milz)*1024 ENDIF ADD i%,12 LOOP WHILE i% PROCEDURE creation_de_la_boite_csg(ob1&,ob2&) LOCAL uni%,nbp%,nbf%,adr_obje% LOCAL lar,hau,pro,milx,mily,milz LOCAL minx,miny,minz,maxx,maxy,maxz LOCAL panx,pany,panz,tanx,tany,tanz,ranx,rany,ranz LOCAL k%,fin_k%,boucle| ' minx=3.599386269725E+308 miny=3.599386269725E+308 minz=3.599386269725E+308 maxx=-3.599386269725E+308 maxy=-3.599386269725E+308 maxz=-3.599386269725E+308 ' FOR boucle|=0 TO 1 IF boucle|=0 uni%=@adresse_objet(ob1&) ELSE uni%=@adresse_objet(ob2&) ENDIF IF INT{uni%}<>primitive_plan& ' R‚cup‚rer les points et faces d'une boŒte englobante pour calcul total IF INT{uni%}=primitive_triangle& pour_triangle_active(uni%,panx,pany,panz,tanx,tany,tanz) bmove(ADD({ADD(objet%,4)},2),transfert%,96) matrice_xyz(0,0,0,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=tanx {ADD(matrice%,4)}=tany {ADD(matrice%,8)}=tanz {ADD(tracer_rotattrans%,32)}=8 {ADD(tracer_rotattrans%,36)}=panx*1024 {ADD(tracer_rotattrans%,40)}=pany*1024 {ADD(tracer_rotattrans%,44)}=panz*1024 ro_tr(tracer_rotattrans%) ELSE panx=ROUND(SINGLE{ADD(uni%,2)},3) pany=ROUND(SINGLE{ADD(uni%,6)},3) panz=ROUND(SINGLE{ADD(uni%,10)},3) tanx=ROUND(SINGLE{ADD(uni%,14)},3) tany=ROUND(SINGLE{ADD(uni%,18)},3) tanz=ROUND(SINGLE{ADD(uni%,22)},3) ranx=ROUND(SINGLE{ADD(uni%,26)},3) rany=ROUND(SINGLE{ADD(uni%,30)},3) ranz=ROUND(SINGLE{ADD(uni%,34)},3) bmove(ADD({ADD(objet%,4)},2),transfert%,96) matrice_zyx(-ranx,-rany,-ranz,matrice%) ' ******** Echelle + Rotation + Translation {matrice%}=tanx {ADD(matrice%,4)}=tany {ADD(matrice%,8)}=tanz {ADD(tracer_rotattrans%,32)}=8 {ADD(tracer_rotattrans%,36)}=panx*1024 {ADD(tracer_rotattrans%,40)}=pany*1024 {ADD(tracer_rotattrans%,44)}=panz*1024 ro_tr(tracer_rotattrans%) ENDIF fin_k%=ADD(transfert%,96) k%=transfert% DO minx=MIN(minx,{k%}/1024) miny=MIN(miny,{ADD(k%,4)}/1024) minz=MIN(minz,{ADD(k%,8)}/1024) maxx=MAX(maxx,{k%}/1024) maxy=MAX(maxy,{ADD(k%,4)}/1024) maxz=MAX(maxz,{ADD(k%,8)}/1024) ADD k%,12 LOOP WHILE k% PROCEDURE refaire_une_csg LOCAL un0%,pt&,i&,num_ob& LOCAL adr_obj%,mem_objet_actif& ' mem_objet_actif&=objet_actif& membfill(effacement%,SHL(limite_des_objets&,1),0) un0%=@adresse_objet(objet_actif&) ' adr_obj%=@adresse_liste_csg(INT{ADD(un0%,offset_force_blob&)}) compteur_csg&=CARD{adr_obj%} ADD adr_obj%,2 CLR i& DO num_ob&=CARD{ADD(adr_obj%,2)} CARD{ADD(effacement%,SHL(i&,1))}=num_ob& ADD adr_obj%,4 INC i& LOOP WHILE i& PROCEDURE reconstruction_des_csg LOCAL u_niv%,fin_u%,adr_obje%,obj_act&,num& LOCAL xj&,yj&,wj&,hj&,pas_j ' objc_offset(adr_fenetre%,fen_act&,xj&,yj&) wj&=OB_W(adr_fenetre%,fen_act&) hj&=10 pas_j=wj&/nombre_d_objets& ' graf_mouse(m_off&,0) set_remplissage(2,8,fond_ecran&,-1) vdi_11(1,xj&,yj&,PRED(ADD(xj&,wj&)),PRED(ADD(yj&,hj&)),0,0,0,0) set_remplissage(2,8,cyan&,-1) ' CLR num& fin_u%=@adresse_objet(nombre_d_objets&) u_niv%=univers% ' Ensuite, et bien, toutes les C.S.G. si il y en a DO IF INT{u_niv%}>12 IF INT{ADD(u_niv%,offset_csg_type&)}<0 ! Une C.S.G. objet_actif&=num& refaire_une_csg ENDIF ENDIF ADD u_niv%,taille_objet& INC num& vdi_11(1,xj&,yj&,xj&+(num&*pas_j),PRED(ADD(yj&,hj&)),0,0,0,0) LOOP WHILE u_niv% PROCEDURE creation_quadric ! La, on ajoute un quadric … la scŠne LOCAL univ%,top&,temp&,adr_def% LOCAL pm01,pm02,pm03,pm04,pm05,pm06,pm07,pm08,pm09,pm10 LOCAL i&,j&,np&,x&,y&,z&,adr_poi%,adr_fac%,i%,fin_i% LOCAL nbp%,nbf%,adr_obje%,adr_face% pm01=VAL(CHAR{{OB_SPEC(adr_quadric%,valquad0&)}}) pm02=VAL(CHAR{{OB_SPEC(adr_quadric%,SUCC(valquad0&))}}) pm03=VAL(CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,2))}}) pm04=VAL(CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,3))}}) pm05=VAL(CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,4))}}) pm06=VAL(CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,5))}}) pm07=VAL(CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,6))}}) pm08=VAL(CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,7))}}) pm09=VAL(CHAR{{OB_SPEC(adr_quadric%,ADD(valquad0&,8))}}) pm10=VAL(CHAR{{OB_SPEC(adr_quadric%,valquad1&)}}) IF pm01+pm02+pm03+pm04+pm05+pm06+pm07+pm08+pm09+pm10=0 ~@afficher_alerte(adr_vide%) ELSE IF nombre_d_objets&=>limite_des_objets& ~@afficher_alerte(adr_depasse%) ELSE hierachie_ok!=FALSE IF modif_quadr! univ%=@adresse_objet(objet_actif&) num&=INT{univ%} adr_poi%=@adresse_point(num&) adr_fac%=@adresse_face(adr_poi%) adr_def%=@adresse_point_extrude(CARD{ADD(univ%,offset_force_blob&)}) {ADD(adr_def%,2)}=pm01*1024 {ADD(ADD(adr_def%,2),4)}=pm02*1024 {ADD(ADD(adr_def%,2),8)}=pm03*1024 {ADD(ADD(adr_def%,2),12)}=pm04*1024 {ADD(ADD(adr_def%,2),16)}=pm05*1024 {ADD(ADD(adr_def%,2),20)}=pm06*1024 {ADD(ADD(adr_def%,2),24)}=pm07*1024 {ADD(ADD(adr_def%,2),28)}=pm08*1024 {ADD(ADD(adr_def%,2),32)}=pm09*1024 {ADD(ADD(adr_def%,2),36)}=pm10*1024 CHAR{ADD(ADD(adr_def%,2),40)}=CHAR{{OB_SPEC(adr_quadric%,nomquadr&)}}+CHR$(0) modif_quadr!=FALSE ELSE univ%=@adresse_objet(nombre_d_objets&) vider_un_objet(nombre_d_objets&) indique_calque_actif(univ%) BYTE{ADD(univ%,offset_drapeau1&)}=BSET(BYTE{ADD(univ%,offset_drapeau1&)},bit_quadric|) INT{univ%}=primitive& SINGLE{ADD(univ%,2)}=0 SINGLE{ADD(univ%,6)}=0 SINGLE{ADD(univ%,10)}=0 SINGLE{ADD(univ%,14)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_x&)}}) SINGLE{ADD(univ%,18)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_y&)}}) SINGLE{ADD(univ%,22)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_z&)}}) SINGLE{ADD(univ%,26)}=0 SINGLE{ADD(univ%,30)}=0 SINGLE{ADD(univ%,34)}=0 INT{ADD(univ%,offset_couleur&)}=BYTE{ADD(ADD(nom_calque%,MUL(calque_actif|,36)),34)} CHAR{ADD(univ%,offset_nom_objet&)}="UN_QUADRIC" INT{ADD(univ%,offset_relation_csg&)}=-1 ' ********************************************************************** ' **** Avec en paramŠtres ' **** + 40 octets ( 10*4 les paramŠtres ) ' **** + 23 octets ( le nom + NULL) ' **** Ce qui donne 16 points et donc, d'aprŠs la formule 2+(nbp*4)+4 ' **** Taille totale : 70 octets ' ********************************************************************** CARD{ADD(univ%,offset_force_blob&)}=nombre_extrude% {ADD(courbe_extrude%,SHL(nombre_extrude%,2))}=@prendre(70,TRUE,3) INC nombre_extrude% ' ********************************************************************** ' ************ Essais de cr‚ation de QUADRIC automatique *************** ' ********************************************************************** ' **** Cr‚ation de la boŒte englobant le QUADRIC ' **** 8 points ' **** taille : (8 * 12 octets) + 2 octets ' **** soit : 98 octets ' **** ' **** 12 faces de 3 points chacunes ' **** taille : (12 * 6 octets) + 2 octets ' **** soit : 74 octets ' **** Taille totale : 172 octets ' ********************************************************************** {ADD(objet%,SHL(primitive&,2))}=@prendre(172,TRUE,3) adr_poi%=@adresse_point(primitive&) boite_de_remplacement(adr_poi%) ' ----------------------------- Les paramŠtres de cr‚ation/modifications adr_def%=@adresse_point_extrude(CARD{ADD(univ%,offset_force_blob&)}) CARD{adr_def%}=15 {ADD(adr_def%,2)}=pm01*1024 {ADD(ADD(adr_def%,2),4)}=pm02*1024 {ADD(ADD(adr_def%,2),8)}=pm03*1024 {ADD(ADD(adr_def%,2),12)}=pm04*1024 {ADD(ADD(adr_def%,2),16)}=pm05*1024 {ADD(ADD(adr_def%,2),20)}=pm06*1024 {ADD(ADD(adr_def%,2),24)}=pm07*1024 {ADD(ADD(adr_def%,2),28)}=pm08*1024 {ADD(ADD(adr_def%,2),32)}=pm09*1024 {ADD(ADD(adr_def%,2),36)}=pm10*1024 CHAR{ADD(ADD(adr_def%,2),40)}=TRIM$(CHAR{{OB_SPEC(adr_quadric%,nomquadr&)}})+CHR$(0) ' ---------------------------------------------------------------------- objet_actif&=nombre_d_objets& INC primitive& refaire_toutes_les_normales(objet_actif&,objet_actif&,FALSE,TRUE) INC nombre_d_objets& CLR debut_texture&,debut_couleur& IF nombre_d_objets&=1 scene_remplie ENDIF CLR debut_liste_csg&,debut_liste_eff& CLR debut_popup_choix&,debut_popup_lum& tri_3d!=FALSE trace_3d_plein!=FALSE tri_2d!=FALSE tri_fi!=FALSE redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_info&,idx_animation&) ENDIF ENDIF ENDIF RETURN ' ------------------------------------------------------------------------------ > PROCEDURE creation_quartic ! La, on ajoute un quartic … la scŠne LOCAL univ%,top&,temp& LOCAL pm01,pm02,pm03,pm04,pm05,pm06,pm07,pm08,pm09,pm10 LOCAL pm11,pm12,pm13,pm14,pm15,pm16,pm17,pm18,pm19,pm20 LOCAL pm21,pm22,pm23,pm24,pm25,pm26,pm27,pm28,pm29,pm30 LOCAL pm31,pm32,pm33,pm34,pm35,adr_def% LOCAL i&,j&,np&,x&,y&,z&,adr_poi%,adr_fac%,i%,fin_i% LOCAL nbp%,nbf%,adr_obje%,adr_face% pm01=VAL(CHAR{{OB_SPEC(adr_quartic%,valquar0&)}}) pm02=VAL(CHAR{{OB_SPEC(adr_quartic%,SUCC(valquar0&))}}) pm03=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,2))}}) pm04=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,3))}}) pm05=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,4))}}) pm06=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,5))}}) pm07=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,6))}}) pm08=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,7))}}) pm09=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,8))}}) pm10=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,9))}}) pm11=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,10))}}) pm12=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,11))}}) pm13=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,12))}}) pm14=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,13))}}) pm15=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,14))}}) pm16=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,15))}}) pm17=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,16))}}) pm18=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,17))}}) pm19=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,18))}}) pm20=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,19))}}) pm21=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,20))}}) pm22=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,21))}}) pm23=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,22))}}) pm24=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,23))}}) pm25=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,24))}}) pm26=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,25))}}) pm27=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,26))}}) pm28=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,27))}}) pm29=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,28))}}) pm30=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,29))}}) pm31=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,30))}}) pm32=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,31))}}) pm33=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,32))}}) pm34=VAL(CHAR{{OB_SPEC(adr_quartic%,ADD(valquar0&,33))}}) pm35=VAL(CHAR{{OB_SPEC(adr_quartic%,valquar1&)}}) IF pm01+pm02+pm03+pm04+pm05+pm06+pm07+pm08+pm09+pm10+pm11+pm12+pm13+pm14+pm15+pm16+pm17+pm18+pm19+pm20+pm21+pm22+pm23+pm24+pm25+pm26+pm27+pm28+pm29+pm30+pm31+pm32+pm33+pm34+pm35=0 ~@afficher_alerte(adr_vide%) ELSE IF nombre_d_objets&=>limite_des_objets& ~@afficher_alerte(adr_depasse%) ELSE hierachie_ok!=FALSE IF modif_quart! univ%=@adresse_objet(objet_actif&) num&=INT{univ%} adr_poi%=@adresse_point(num&) adr_fac%=@adresse_face(adr_poi%) adr_def%=@adresse_point_extrude(CARD{ADD(univ%,offset_force_blob&)}) {ADD(adr_def%,2)}=pm01*1024 {ADD(ADD(adr_def%,2),4)}=pm02*1024 {ADD(ADD(adr_def%,2),8)}=pm03*1024 {ADD(ADD(adr_def%,2),12)}=pm04*1024 {ADD(ADD(adr_def%,2),16)}=pm05*1024 {ADD(ADD(adr_def%,2),20)}=pm06*1024 {ADD(ADD(adr_def%,2),24)}=pm07*1024 {ADD(ADD(adr_def%,2),28)}=pm08*1024 {ADD(ADD(adr_def%,2),32)}=pm09*1024 {ADD(ADD(adr_def%,2),36)}=pm10*1024 {ADD(ADD(adr_def%,2),40)}=pm11*1024 {ADD(ADD(adr_def%,2),44)}=pm12*1024 {ADD(ADD(adr_def%,2),48)}=pm13*1024 {ADD(ADD(adr_def%,2),52)}=pm14*1024 {ADD(ADD(adr_def%,2),56)}=pm15*1024 {ADD(ADD(adr_def%,2),60)}=pm16*1024 {ADD(ADD(adr_def%,2),64)}=pm17*1024 {ADD(ADD(adr_def%,2),68)}=pm18*1024 {ADD(ADD(adr_def%,2),72)}=pm19*1024 {ADD(ADD(adr_def%,2),76)}=pm20*1024 {ADD(ADD(adr_def%,2),80)}=pm21*1024 {ADD(ADD(adr_def%,2),84)}=pm22*1024 {ADD(ADD(adr_def%,2),88)}=pm23*1024 {ADD(ADD(adr_def%,2),92)}=pm24*1024 {ADD(ADD(adr_def%,2),96)}=pm25*1024 {ADD(ADD(adr_def%,2),100)}=pm26*1024 {ADD(ADD(adr_def%,2),104)}=pm27*1024 {ADD(ADD(adr_def%,2),108)}=pm28*1024 {ADD(ADD(adr_def%,2),112)}=pm29*1024 {ADD(ADD(adr_def%,2),116)}=pm30*1024 {ADD(ADD(adr_def%,2),120)}=pm31*1024 {ADD(ADD(adr_def%,2),124)}=pm32*1024 {ADD(ADD(adr_def%,2),128)}=pm33*1024 {ADD(ADD(adr_def%,2),132)}=pm34*1024 {ADD(ADD(adr_def%,2),136)}=pm35*1024 CHAR{ADD(ADD(adr_def%,2),140)}=CHAR{{OB_SPEC(adr_quartic%,nomquart&)}}+CHR$(0) modif_quart!=FALSE ELSE univ%=@adresse_objet(nombre_d_objets&) vider_un_objet(nombre_d_objets&) indique_calque_actif(univ%) BYTE{ADD(univ%,offset_drapeau1&)}=BSET(BYTE{ADD(univ%,offset_drapeau1&)},bit_quartic|) INT{univ%}=primitive& SINGLE{ADD(univ%,2)}=0 SINGLE{ADD(univ%,6)}=0 SINGLE{ADD(univ%,10)}=0 SINGLE{ADD(univ%,14)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_x&)}}) SINGLE{ADD(univ%,18)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_y&)}}) SINGLE{ADD(univ%,22)}=VAL(CHAR{{OB_SPEC(adr_parametres%,def_z&)}}) SINGLE{ADD(univ%,26)}=0 SINGLE{ADD(univ%,30)}=0 SINGLE{ADD(univ%,34)}=0 INT{ADD(univ%,offset_couleur&)}=BYTE{ADD(ADD(nom_calque%,MUL(calque_actif|,36)),34)} CHAR{ADD(univ%,offset_nom_objet&)}="UN_QUARTIC" INT{ADD(univ%,offset_relation_csg&)}=-1 ' ********************************************************************** ' **** Avec en paramŠtres ' **** + 140 octets ( 35*4 les paramŠtres ) ' **** + 23 octets ( le nom + NULL) ' **** Ce qui donne 41 points et donc, d'aprŠs la formule 2+(nbp*4)+4 ' **** Taille totale : 170 octets ' ********************************************************************** CARD{ADD(univ%,offset_force_blob&)}=nombre_extrude% {ADD(courbe_extrude%,SHL(nombre_extrude%,2))}=@prendre(170,TRUE,3) INC nombre_extrude% ' ********************************************************************** ' ************* Essais de cr‚ation de QUADRIC automatique ************** ' ********************************************************************** ' **** Cr‚ation de la boŒte englobant le QUADRIC ' **** 8 points ' **** taille : (8 * 12 octets) + 2 octets ' **** soit : 98 octets ' **** ' **** 12 faces de 3 points chacunes ' **** taille : (12 * 6 octets) + 2 octets ' **** soit : 74 octets ' **** Taille totale : 172 octets ' ********************************************************************** {ADD(objet%,SHL(primitive&,2))}=@prendre(172,TRUE,3) adr_poi%=@adresse_point(primitive&) boite_de_remplacement(adr_poi%) ' ----------------------------- Les paramŠtres de cr‚ation/modifications adr_def%=@adresse_point_extrude(CARD{ADD(univ%,offset_force_blob&)}) CARD{adr_def%}=40 {ADD(adr_def%,2)}=pm01*1024 {ADD(ADD(adr_def%,2),4)}=pm02*1024 {ADD(ADD(adr_def%,2),8)}=pm03*1024 {ADD(ADD(adr_def%,2),12)}=pm04*1024 {ADD(ADD(adr_def%,2),16)}=pm05*1024 {ADD(ADD(adr_def%,2),20)}=pm06*1024 {ADD(ADD(adr_def%,2),24)}=pm07*1024 {ADD(ADD(adr_def%,2),28)}=pm08*1024 {ADD(ADD(adr_def%,2),32)}=pm09*1024 {ADD(ADD(adr_def%,2),36)}=pm10*1024 {ADD(ADD(adr_def%,2),40)}=pm11*1024 {ADD(ADD(adr_def%,2),44)}=pm12*1024 {ADD(ADD(adr_def%,2),48)}=pm13*1024 {ADD(ADD(adr_def%,2),52)}=pm14*1024 {ADD(ADD(adr_def%,2),56)}=pm15*1024 {ADD(ADD(adr_def%,2),60)}=pm16*1024 {ADD(ADD(adr_def%,2),64)}=pm17*1024 {ADD(ADD(adr_def%,2),68)}=pm18*1024 {ADD(ADD(adr_def%,2),72)}=pm19*1024 {ADD(ADD(adr_def%,2),76)}=pm20*1024 {ADD(ADD(adr_def%,2),80)}=pm21*1024 {ADD(ADD(adr_def%,2),84)}=pm22*1024 {ADD(ADD(adr_def%,2),88)}=pm23*1024 {ADD(ADD(adr_def%,2),92)}=pm24*1024 {ADD(ADD(adr_def%,2),96)}=pm25*1024 {ADD(ADD(adr_def%,2),100)}=pm26*1024 {ADD(ADD(adr_def%,2),104)}=pm27*1024 {ADD(ADD(adr_def%,2),108)}=pm28*1024 {ADD(ADD(adr_def%,2),112)}=pm29*1024 {ADD(ADD(adr_def%,2),116)}=pm30*1024 {ADD(ADD(adr_def%,2),120)}=pm31*1024 {ADD(ADD(adr_def%,2),124)}=pm32*1024 {ADD(ADD(adr_def%,2),128)}=pm33*1024 {ADD(ADD(adr_def%,2),132)}=pm34*1024 {ADD(ADD(adr_def%,2),136)}=pm35*1024 CHAR{ADD(ADD(adr_def%,2),140)}=CHAR{{OB_SPEC(adr_quartic%,nomquart&)}}+CHR$(0) ' ---------------------------------------------------------------------- objet_actif&=nombre_d_objets& INC primitive& refaire_toutes_les_normales(objet_actif&,objet_actif&,FALSE,TRUE) INC nombre_d_objets& CLR debut_texture&,debut_couleur& IF nombre_d_objets&=1 scene_remplie ENDIF CLR debut_liste_csg&,debut_liste_eff& CLR debut_popup_choix&,debut_popup_lum& tri_3d!=FALSE trace_3d_plein!=FALSE tri_2d!=FALSE tri_fi!=FALSE redimention!=FALSE redessin_deja_fait!=FALSE redraw_force(idx_info&,idx_animation&) ENDIF ENDIF ENDIF RETURN ' ------------------------------------------------------------------------------ > PROCEDURE generation_de_bicubic ! La, on ajoute un objet BICUBIC_PATCH LOCAL pt&,disx,disy,disz LOCAL ij%,ki%,kj%,adr%,adr2%,ad2% LOCAL adr_poi%,adr_fac%,adr_pt_ctrl% LOCAL offpt&,adr_src% LOCAL mui,muj,bi,bj ' IF nombre_d_objets&=>limite_des_objets& ~@afficher_alerte(adr_depasse%) ELSE hierachie_ok!=FALSE IF modif_bez! univ%=@adresse_objet(objet_actif&) num&=INT{univ%} adr_poi%=@adresse_point(num&) adr_fac%=@adresse_face(adr_poi%) INT{ADD(univ%,offset_csg_type&)}=0 vect_norm%=@adresse_edge(objet_actif&) num_point_control%=CARD{ADD(univ%,offset_force_blob&)} adr_pt_ctrl%=@adresse_point_control(num_point_control%) ELSE univ%=@adresse_objet(nombre_d_objets&) vider_un_objet(nombre_d_objets&) indique_calque_actif(univ%) BYTE{ADD(univ%,offset_drapeau0&)}=BSET(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) BYTE{ADD(univ%,offset_drapeau0&)}=BSET(BYTE{ADD(univ%,offset_drapeau0&)},bit_in_out|) INT{univ%}=primitive& SINGLE{ADD(univ%,26)}=0 SINGLE{ADD(univ%,30)}=0 SINGLE{ADD(univ%,34)}=0 INT{ADD(univ%,offset_couleur&)}=BYTE{ADD(ADD(nom_calque%,MUL(calque_actif|,36)),34)} CHAR{ADD(univ%,offset_nom_objet&)}="CARREAUX_DE_BEZIER" INT{ADD(univ%,offset_csg_type&)}=0 INT{ADD(univ%,offset_relation_csg&)}=-1 num_point_control%=nombre_de_carreaux% INC nombre_de_carreaux% CARD{ADD(univ%,offset_force_blob&)}=num_point_control% ' ************************************************************************ ' A partir de EB Model 3.35a, les points de contr“le sont s‚par‚s du ' carreau. ' ' +16 points de control ' +6 octets pour les paramŠtres des BICUBIC ' + 2 octets pour type ' + 2 octets pour flatness ' + 2 octets pour u_steps et v_steps ' Soit : 198 octets ' ************************************************************************ ' A partir de EB Model 3.42a, les points de contr“le dispose ailleurs en ' m‚moire de la possiblit‚ d'avoir un autre point de contr“le comme pŠre. ' ' +16 information pour les pŠre ' + 2 octets pour le carreau du pŠre ' + 2 octets pour le num‚ro du point pŠre ' 16 fois : 4 octets par points ' Soit : 64 octets ' ************************************************************************ ' A partir de EB Model 3.51a, les carreaux sont calcul‚s par une fonction ' totalement nouvelle trouv‚e sur le NET. ' ' 64 points pour le dessin des courbes ' Soit : 770 octets ' ' 98 faces … partir de EB Model 3.51a et plus ' Soit : 590 octets ' ' Soit un total de : 770+590 : 1360 ' ************************************************************************ {ADD(objet%,SHL(primitive&,2))}=@prendre(1360,TRUE,3) adr_poi%=@adresse_point(primitive&) CARD{adr_poi%}=63 adr_fac%=@adresse_face(adr_poi%) CARD{adr_fac%}=97 INC primitive& ' objet_actif&=nombre_d_objets& {ADD(pt_control%,SHL(num_point_control%,2))}=@prendre(198,TRUE,3) adr_pt_ctrl%=@adresse_point_control(num_point_control%) ' ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' Cr‚ation de la table des vecteurs normaux en chaque points de l'objet ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ {ADD(edge%,SHL(objet_actif&,2))}=@prendre(MUL(64,14),TRUE,3) vect_norm%=@adresse_edge(objet_actif&) ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ INC nombre_d_objets& CLR debut_texture&,debut_couleur& scene_remplie CLR debut_liste_csg&,debut_liste_eff& CLR debut_popup_choix&,debut_popup_lum& recupere_les_points_bicubic(univ%) ENDIF ' creer_les_faces_carreaux(ADD(adr_fac%,2)) ' adr_des%=ADD(adr_poi%,2) CLR j% DO muj=j%/7 CLR i% DO mui=i%/7 SINGLE{adr_des%}=0 SINGLE{ADD(adr_des%,4)}=0 SINGLE{ADD(adr_des%,8)}=0 ' adr_src%=adr_pt_ctrl% CLR kj% DO bj=@bezierblend(kj%,muj) CLR ki% DO bi=@bezierblend(ki%,mui) SINGLE{adr_des%}=ROUND(SINGLE{adr_des%}+(({adr_src%}/1024)*bi*bj),3) SINGLE{ADD(adr_des%,4)}=ROUND(SINGLE{ADD(adr_des%,4)}+(({ADD(adr_src%,4)}/1024)*bi*bj),3) SINGLE{ADD(adr_des%,8)}=ROUND(SINGLE{ADD(adr_des%,8)}+(({ADD(adr_src%,8)}/1024)*bi*bj),3) ADD adr_src%,12 INC ki% LOOP WHILE ki%<4 INC kj% LOOP WHILE kj%<4 ' ADD adr_des%,12 INC i% LOOP WHILE i%<8 INC j% LOOP WHILE j%<8 ' repositionne_objet(adr_poi%,64,lar,hau,pro,milx,mily,milz) IF NOT modif_bez! SINGLE{ADD(univ%,2)}=ROUND(milx,3) SINGLE{ADD(univ%,6)}=ROUND(mily,3) SINGLE{ADD(univ%,10)}=ROUND(milz,3) SINGLE{ADD(univ%,14)}=ROUND(lar,3) SINGLE{ADD(univ%,18)}=ROUND(hau,3) SINGLE{ADD(univ%,22)}=ROUND(pro,3) CHAR{{OB_SPEC(adr_modifier%,modpx&)}}=STR$(ROUND(milx,3),10,3) CHAR{{OB_SPEC(adr_modifier%,modpy&)}}=STR$(ROUND(mily,3),10,3) CHAR{{OB_SPEC(adr_modifier%,modpz&)}}=STR$(ROUND(milz,3),10,3) CHAR{{OB_SPEC(adr_modifier%,modtx&)}}=STR$(ROUND(lar,3),9,3) CHAR{{OB_SPEC(adr_modifier%,modty&)}}=STR$(ROUND(hau,3),9,3) CHAR{{OB_SPEC(adr_modifier%,modtz&)}}=STR$(ROUND(pro,3),9,3) ELSE disx=SINGLE{ADD(univ%,2)}-milx disy=SINGLE{ADD(univ%,6)}-mily disz=SINGLE{ADD(univ%,10)}-milz IF (ROUND(disx,3)<>0) OR (ROUND(disy,3)<>0) OR (ROUND(disz,3)<>0) deplacer_les_points_bicubic(univ%,disx,disy,disz) ENDIF ENDIF ' refaire_toutes_les_normales(objet_actif&,objet_actif&,FALSE,TRUE) IF NOT modif_bez! redessin_deja_fait!=FALSE ENDIF modif_bez!=FALSE redimention!=FALSE tri_3d!=FALSE trace_3d_plein!=FALSE tri_2d!=FALSE tri_fi!=FALSE ' ENDIF RETURN > FUNCTION bezierblend(k%,mu) ! Calcul d'une surface de Bezier LOCAL kn%,nkn% LOCAL blend ' kn%=k% nkn%=SUB(3,k%) ' blend=3 IF (kn%>1) blend=blend/kn% DEC kn% ENDIF IF nkn%>1 blend=blend/nkn% DEC nkn% ENDIF ' blend=blend*2 IF (kn%>1) blend=blend/kn% DEC kn% ENDIF IF nkn%>1 blend=blend/nkn% DEC nkn% ENDIF ' ' blend=blend*1 IF (kn%>1) blend=blend/kn% DEC kn% ENDIF IF nkn%>1 blend=blend/nkn% DEC nkn% ENDIF ' IF k%>0 blend=blend*(mu^k%) ENDIF IF SUB(3,k%)>0 blend=blend*((1-mu)^SUB(3,k%)) ENDIF ' RETURN blend ' ENDFUNC ' ------------------------------------------------------------------------------ > PROCEDURE afficher_les_points_bicubic(univ%,ind!) LOCAL offi&,i&,adr%,adr_p%,t&,ad2% LOCAL p1,p2,p3,px,py,pz,adr_po% adr_po%=@adresse_point_control(CARD{ADD(univ%,offset_force_blob&)}) CLR i& adr%=adr_po% DO offi&=MUL(i&,3) ad2%=@adr_ctrl(adr%,i&,0) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx01&,offi&))}}=STR$(ROUND({ad2%}/1024,3),10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy01&,offi&))}}=STR$(ROUND({ADD(ad2%,4)}/1024,3),10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz01&,offi&))}}=STR$(ROUND({ADD(ad2%,8)}/1024,3),10,3) ' ad2%=@adr_ctrl(adr%,i&,1) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx05&,offi&))}}=STR$(ROUND({ad2%}/1024,3),10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy05&,offi&))}}=STR$(ROUND({ADD(ad2%,4)}/1024,3),10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz05&,offi&))}}=STR$(ROUND({ADD(ad2%,8)}/1024,3),10,3) ' ad2%=@adr_ctrl(adr%,i&,2) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx09&,offi&))}}=STR$(ROUND({ad2%}/1024,3),10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy09&,offi&))}}=STR$(ROUND({ADD(ad2%,4)}/1024,3),10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz09&,offi&))}}=STR$(ROUND({ADD(ad2%,8)}/1024,3),10,3) ' ad2%=@adr_ctrl(adr%,i&,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somx13&,offi&))}}=STR$(ROUND({ad2%}/1024,3),10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somy13&,offi&))}}=STR$(ROUND({ADD(ad2%,4)}/1024,3),10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(somz13&,offi&))}}=STR$(ROUND({ADD(ad2%,8)}/1024,3),10,3) ' INC i& LOOP WHILE i&<4 adr%=ADD(adr_po%,192) ob_state(adr_bicubics%,fraopt&,aes_selected&,(INT{adr%}=1)) CHAR{{OB_SPEC(adr_bicubics%,SUB(niv01&,2))}}=STR$(INT{ADD(adr%,2)},1) CHAR{{OB_SPEC(adr_bicubics%,SUB(sou01&,2))}}=STR$(INT{ADD(adr%,4)},1) IF ind! FOR i&=somx01& TO somz16& redraw_elem(adr_bicubics%,i&) NEXT i& redraw_elem(adr_bicubics%,fraopt&) redraw_elem(adr_bicubics%,niv01&) redraw_elem(adr_bicubics%,sou01&) ENDIF RETURN > PROCEDURE recupere_les_points_bicubic(univ%) LOCAL offi&,i&,adr%,adr_p%,t&,ad2% LOCAL p1,p2,p3,px,py,pz,adr_po% ' adr_po%=@adresse_point_control(CARD{ADD(univ%,offset_force_blob&)}) CLR i& adr%=adr_po% DO offi&=MUL(i&,3) ad2%=@adr_ctrl(adr%,i&,0) {ad2%}=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx01&,offi&))}})*1024 {ADD(ad2%,4)}=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy01&,offi&))}})*1024 {ADD(ad2%,8)}=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz01&,offi&))}})*1024 ' ad2%=@adr_ctrl(adr%,i&,1) {ad2%}=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx05&,offi&))}})*1024 {ADD(ad2%,4)}=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy05&,offi&))}})*1024 {ADD(ad2%,8)}=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz05&,offi&))}})*1024 ' ad2%=@adr_ctrl(adr%,i&,2) {ad2%}=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx09&,offi&))}})*1024 {ADD(ad2%,4)}=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy09&,offi&))}})*1024 {ADD(ad2%,8)}=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz09&,offi&))}})*1024 ' ad2%=@adr_ctrl(adr%,i&,3) {ad2%}=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somx13&,offi&))}})*1024 {ADD(ad2%,4)}=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somy13&,offi&))}})*1024 {ADD(ad2%,8)}=VAL(CHAR{{OB_SPEC(adr_bicubics%,ADD(somz13&,offi&))}})*1024 ' INC i& LOOP WHILE i&<4 ' adr%=ADD(adr_po%,192) INT{adr%}=0 IF BTST(OB_STATE(adr_bicubics%,fraopt&),aes_selected&) INT{adr%}=1 ENDIF INT{ADD(adr%,2)}=VAL(CHAR{{OB_SPEC(adr_bicubics%,SUB(niv01&,2))}}) INT{ADD(adr%,4)}=VAL(CHAR{{OB_SPEC(adr_bicubics%,SUB(sou01&,2))}}) ' RETURN > FUNCTION adr_ctrl(adres%,ox&,oy&) ! adresse des points de contr“le ' Structure : ' 4 octets => Coordonn‚e X du point de contr“le ' 4 octets => Coordonn‚e Y du point de contr“le ' 4 octets => Coordonn‚e Z du point de contr“le RETURN ADD(adres%,MUL(ADD(SHL(oy&,2),ox&),12)) ENDFUNC > PROCEDURE creer_les_faces_carreaux(adr%) ! Cr‚ation des faces LOCAL pty&,ptx&,num_f&,a_d%,offx& a_d%=adr% CLR pty& DO CLR ptx& DO offx&=ADD(ptx&,pty&) CARD{a_d%}=offx& CARD{ADD(a_d%,2)}=ADD(offx&,1) CARD{ADD(a_d%,4)}=ADD(offx&,9) ADD a_d%,6 CARD{a_d%}=ADD(offx&,9) CARD{ADD(a_d%,2)}=ADD(offx&,8) CARD{ADD(a_d%,4)}=offx& ADD a_d%,6 INC ptx& LOOP WHILE ptx&<7 ADD pty&,8 LOOP WHILE pty&<56 RETURN ' -------------------- Objets BICUBIC pr‚-d‚termin‚s --------------------------- > PROCEDURE creation_objet_bicubic_pre_definie(reponse&) LOCAL lue,i&,j&,nombre_de_carreaux& LOCAL x_lue,y_lue,z_lue ' hierachie_ok!=FALSE CLR nombre_de_carreaux& $S&,$S> SELECT reponse& CASE 0 ! Une sphŠre en 8 carreaux de B‚zier RESTORE bic0 nombre_de_carreaux&=8 CASE 1 ! Une demie sphŠre en 4 carreaux de B‚zier RESTORE bic1 nombre_de_carreaux&=4 CASE 2 ! Un cylmindre en 12 carreaux de B‚zier RESTORE bic2 nombre_de_carreaux&=12 CASE 3 ! Une boŒte en 6 carreaux de B‚zier RESTORE bic3 nombre_de_carreaux&=6 CASE 4 ! Un demi cylindre en 2 carreaux de B‚zier RESTORE bic4 nombre_de_carreaux&=2 CASE 5 ! Une Th‚iŠre de Newell en 32 carreaux de B‚zier RESTORE bic5 nombre_de_carreaux&=32 CASE 6 ! Un plan vierge en 4 carreaux de B‚zier RESTORE bic6 nombre_de_carreaux&=4 ENDSELECT IF nombre_de_carreaux&>0 j&=1 INC nombre_de_carreaux& DO CHAR{OB_SPEC(adr_divers%,lin14&)}=LEFT$(CHAR{OB_SPEC(adr_divers%,lin14&)},SUB(LEN(CHAR{OB_SPEC(adr_divers%,lin14&)}),5))+STR$(j&,2)+"/"+STR$(PRED(nombre_de_carreaux&),2) CHAR{{OB_SPEC(adr_fenetre%,fenvue06&)}}=CHAR{OB_SPEC(adr_divers%,lin14&)} redraw_element_fenetre(48,adr_fenetre%,fenvue06&) FOR i&=somx01& TO somz16& STEP 3 READ x_lue,y_lue,z_lue x_lue=(x_lue/100)*VAL(CHAR{{OB_SPEC(adr_parametres%,def_x&)}}) y_lue=(y_lue/100)*VAL(CHAR{{OB_SPEC(adr_parametres%,def_y&)}}) z_lue=(z_lue/100)*VAL(CHAR{{OB_SPEC(adr_parametres%,def_z&)}}) CHAR{{OB_SPEC(adr_bicubics%,i&)}}=STR$(ROUND(x_lue,3),10,3) CHAR{{OB_SPEC(adr_bicubics%,SUCC(i&))}}=STR$(ROUND(y_lue,3),10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(i&,2))}}=STR$(ROUND(z_lue,3),10,3) NEXT i& ob_state(adr_bicubics%,fraopt&,aes_selected&,FALSE) CHAR{{OB_SPEC(adr_bicubics%,SUB(niv01&,2))}}="2" CHAR{{OB_SPEC(adr_bicubics%,SUB(sou01&,2))}}="2" generation_de_bicubic INC j& LOOP WHILE j& PROCEDURE mettre_bicubic_par_defaut LOCAL i&,x_lue,y_lue,z_lue ' RESTORE bicubic_par_defaut FOR i&=somx01& TO somz16& STEP 3 READ x_lue,y_lue,z_lue x_lue=(x_lue/100)*VAL(CHAR{{OB_SPEC(adr_parametres%,def_x&)}}) y_lue=(y_lue/100)*VAL(CHAR{{OB_SPEC(adr_parametres%,def_y&)}}) z_lue=(z_lue/100)*VAL(CHAR{{OB_SPEC(adr_parametres%,def_z&)}}) CHAR{{OB_SPEC(adr_bicubics%,i&)}}=STR$(ROUND(x_lue,3),10,3) CHAR{{OB_SPEC(adr_bicubics%,SUCC(i&))}}=STR$(ROUND(y_lue,3),10,3) CHAR{{OB_SPEC(adr_bicubics%,ADD(i&,2))}}=STR$(ROUND(z_lue,3),10,3) NEXT i& ob_state(adr_bicubics%,fraopt&,aes_selected&,FALSE) CHAR{{OB_SPEC(adr_bicubics%,SUB(niv01&,2))}}="2" CHAR{{OB_SPEC(adr_bicubics%,SUB(sou01&,2))}}="2" ' bicubic_par_defaut: DATA -100,-100,-100,-100,-100,-33,-100,-100,33,-100,-100,100 DATA -33,-100,-100,-33,100,-33,-33,100,33,-33,-100,100 DATA 33,-100,-100,33,100,-33,33,100,33,33,-100,100 DATA 100,-100,-100,100,-100,-33,100,-100,33,100,-100,100 ' RETURN ' ****************************************************************************** > PROCEDURE copier_objet_actif ! Plusieurs fois le mˆme c'est mieux LOCAL i&,u_n% LOCAL nbr_copie& LOCAL rotx,disx,agrx,talx,prx,trx,rrx LOCAL roty,disy,agry,taly,pry,try,rry LOCAL rotz,disz,agrz,talz,prz,trz,rrz CHAR{{OB_SPEC(adr_copier%,conombr&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,conombr&)}}),4) CHAR{{OB_SPEC(adr_copier%,comdistx&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,comdistx&)}}),10,3) CHAR{{OB_SPEC(adr_copier%,comdisty&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,comdisty&)}}),10,3) CHAR{{OB_SPEC(adr_copier%,comdistz&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,comdistz&)}}),10,3) CHAR{{OB_SPEC(adr_copier%,codegrex&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,codegrex&)}}),8,3) CHAR{{OB_SPEC(adr_copier%,codegrey&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,codegrey&)}}),8,3) CHAR{{OB_SPEC(adr_copier%,codegrez&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,codegrez&)}}),8,3) CHAR{{OB_SPEC(adr_copier%,coptauxx&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coptauxx&)}}),3,0) CHAR{{OB_SPEC(adr_copier%,coptauxy&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coptauxy&)}}),3,0) CHAR{{OB_SPEC(adr_copier%,coptauxz&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coptauxz&)}}),3,0) CHAR{{OB_SPEC(adr_copier%,coinitia&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coinitia&)}}),9) CHAR{{OB_SPEC(adr_copier%,coalea0x&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coalea0x&)}}),3) CHAR{{OB_SPEC(adr_copier%,coalea0y&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coalea0y&)}}),3) CHAR{{OB_SPEC(adr_copier%,coalea0z&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coalea0z&)}}),3) CHAR{{OB_SPEC(adr_copier%,coalea1x&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coalea1x&)}}),3) CHAR{{OB_SPEC(adr_copier%,coalea1y&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coalea1y&)}}),3) CHAR{{OB_SPEC(adr_copier%,coalea1z&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coalea1z&)}}),3) CHAR{{OB_SPEC(adr_copier%,coalea2x&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coalea2x&)}}),3) CHAR{{OB_SPEC(adr_copier%,coalea2y&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coalea2y&)}}),3) CHAR{{OB_SPEC(adr_copier%,coalea2z&)}}=STR$(VAL(CHAR{{OB_SPEC(adr_copier%,coalea2z&)}}),3) IF nombre_d_objets&=>limite_des_objets& ~@afficher_alerte(adr_depasse%) redraw_force(idx_info&,idx_animation&) ELSE IF @position_de_la_copie=7 hierachie_ok!=FALSE IF copie_reference! u_n%=@adresse_objet(objet_actif&) prx=SINGLE{ADD(u_n%,2)} pry=SINGLE{ADD(u_n%,6)} prz=SINGLE{ADD(u_n%,10)} trx=SINGLE{ADD(u_n%,14)} try=SINGLE{ADD(u_n%,18)} trz=SINGLE{ADD(u_n%,22)} rrx=SINGLE{ADD(u_n%,26)} rry=SINGLE{ADD(u_n%,30)} rrz=SINGLE{ADD(u_n%,34)} ENDIF nbr_copie&=VAL(CHAR{{OB_SPEC(adr_copier%,conombr&)}}) IF ADD(nombre_d_objets&,nbr_copie&)=>limite_des_objets& ~@afficher_alerte(adr_depasse%) redraw_force(idx_info&,idx_animation&) ELSE RANDOMIZE VAL(CHAR{{OB_SPEC(adr_copier%,coinitia&)}}) IF nbr_copie&>1 INC nbr_copie& ENDIF i&=1 DO CLR rotx,roty,rotz,disx,disy,disz,agrx,agry,agrz ' --------------------- Les distances ----------------------- ' taux al‚atoires sur X talx=VAL(CHAR{{OB_SPEC(adr_copier%,coalea0x&)}})/100 IF talx=0 disx=VAL(CHAR{{OB_SPEC(adr_copier%,comdistx&)}}) ELSE IF BTST(OB_STATE(adr_copier%,distri0x&),aes_selected&) talx=RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,comdistx&)}}))*talx disx=talx-RANDOM(talx*2) ELSE disx=RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,comdistx&)}}))*talx ENDIF ENDIF ' ' taux al‚atoires sur Y taly=VAL(CHAR{{OB_SPEC(adr_copier%,coalea0y&)}})/100 IF taly=0 disy=VAL(CHAR{{OB_SPEC(adr_copier%,comdisty&)}}) ELSE IF BTST(OB_STATE(adr_copier%,distri0y&),aes_selected&) taly=RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,comdisty&)}}))*taly disy=taly-RANDOM(taly*2) ELSE disy=RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,comdisty&)}}))*taly ENDIF ENDIF ' ' taux al‚atoires sur Y talz=VAL(CHAR{{OB_SPEC(adr_copier%,coalea0z&)}})/100 IF talz=0 disz=VAL(CHAR{{OB_SPEC(adr_copier%,comdistz&)}}) ELSE IF BTST(OB_STATE(adr_copier%,distri0z&),aes_selected&) talz=RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,comdistz&)}}))*talz disz=talz-RANDOM(talz*2) ELSE disz=RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,comdistz&)}}))*talz ENDIF ENDIF ' --------------------- Les rotations ----------------------- ' taux al‚atoires talx=VAL(CHAR{{OB_SPEC(adr_copier%,coalea1x&)}})/100 IF talx=0 rotx=VAL(CHAR{{OB_SPEC(adr_copier%,codegrex&)}}) ELSE IF BTST(OB_STATE(adr_copier%,distri1x&),aes_selected&) talx=RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,codegrex&)}}))*talx rotx=talx-RANDOM(talx*2) ELSE rotx=RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,codegrex&)}}))*talx ENDIF ENDIF ' taly=VAL(CHAR{{OB_SPEC(adr_copier%,coalea1y&)}})/100 IF taly=0 roty=VAL(CHAR{{OB_SPEC(adr_copier%,codegrey&)}}) ELSE IF BTST(OB_STATE(adr_copier%,distri1y&),aes_selected&) taly=RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,codegrey&)}}))*taly roty=taly-RANDOM(taly*2) ELSE roty=RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,codegrey&)}}))*taly ENDIF ENDIF ' talz=VAL(CHAR{{OB_SPEC(adr_copier%,coalea1z&)}})/100 IF talz=0 rotz=VAL(CHAR{{OB_SPEC(adr_copier%,codegrez&)}}) ELSE IF BTST(OB_STATE(adr_copier%,distri1z&),aes_selected&) talz=RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,codegrez&)}}))*talz rotz=talz-RANDOM(talz*2) ELSE rotz=RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,codegrez&)}}))*talz ENDIF ENDIF ' --------------------- Agrandir/R‚tr‚cir ------------------- ' taux al‚atoires talx=VAL(CHAR{{OB_SPEC(adr_copier%,coalea2x&)}})/100 IF talx=0 agrx=1 ELSE agrx=(RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,coptauxx&)}}))/100)*talx ENDIF taly=VAL(CHAR{{OB_SPEC(adr_copier%,coalea2y&)}})/100 IF taly=0 agry=1 ELSE agry=(RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,coptauxy&)}}))/100)*taly ENDIF talz=VAL(CHAR{{OB_SPEC(adr_copier%,coalea2z&)}})/100 IF talz=0 agrz=1 ELSE agrz=(RANDOM(VAL(CHAR{{OB_SPEC(adr_copier%,coptauxz&)}}))/100)*talz ENDIF ' ----------------------------------------------------------- copie_d_objet(prx,pry,prz,trx,try,trz,rrx,rry,rrz,rotx,roty,rotz,disx,disy,disz,agrx,agry,agrz,i&,nbr_copie&) INC i& LOOP WHILE i&1 DEC nbr_copie& ENDIF objet_actif&=PRED(nombre_d_objets&) CLR debut_texture&,debut_couleur& CLR debut_liste_csg&,debut_liste_eff& CLR debut_popup_choix&,debut_popup_lum& redimention!=FALSE tri_3d!=FALSE trace_3d_plein!=FALSE tri_2d!=FALSE tri_fi!=FALSE redessin_deja_fait!=FALSE ENDIF ENDIF redraw_force(idx_info&,idx_animation&) ENDIF RETURN ' > PROCEDURE copie_d_objet(rpx,rpy,rpz,rtx,rty,rtz,rxr,ryr,rzr,rox,roy,roz,dix,diy,diz,agx,agy,agz,nu&,nbr_copie&) LOCAL univs%,num_point_control% LOCAL univd%,num_pts%,mem_ob& LOCAL adr_nom_obj%,pos%,adr_po% LOCAL nbp%,nbf%,adr_obje%,adr_face% ' univs%=@adresse_objet(objet_actif&) univd%=@adresse_objet(nombre_d_objets&) ' bmove(univs%,univd%,taille_objet&) ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' Cr‚ation de la table des vecteurs normaux en chaque points de l'objet ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ type_d_objet_en_calcul(objet_actif&,univs%,nbp%,nbf%,adr_obje%,adr_face%) INC nbp% de_reel_vers_vue(adr_obje%,univs%,nbp%,TRUE,FALSE) {ADD(edge%,SHL(nombre_d_objets&,2))}=@prendre(MUL(nbp%,14),TRUE,3) bmove({ADD(edge%,SHL(objet_actif&,2))},{ADD(edge%,SHL(nombre_d_objets&,2))},MUL(nbp%,14)) ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IF BTST(BYTE{ADD(univs%,offset_drapeau0&)},bit_bicubic|) ' Le carreaux graphiquement INT{univd%}=primitive& {ADD(objet%,SHL(primitive&,2))}=@prendre(1360,TRUE,3) bmove({ADD(objet%,SHL(INT{univs%},2))},{ADD(objet%,SHL(primitive&,2))},1360) ' Les points de contr“le num_point_control%=nombre_de_carreaux% INC nombre_de_carreaux% {ADD(pt_control%,SHL(num_point_control%,2))}=@prendre(198,TRUE,3) num_pts%=CARD{ADD(univs%,offset_force_blob&)} bmove(@adresse_point_control(num_pts%),@adresse_point_control(num_point_control%),198) CARD{ADD(univd%,offset_force_blob&)}=num_point_control% ' INC primitive& deplacer_les_points_bicubic(univd%,dix,diy,diz) modif_bez!=TRUE mem_ob&=objet_actif& objet_actif&=nu& generation_de_bicubic objet_actif&=mem_ob& modif_bez!=FALSE ELSE INT{univd%}=INT{univs%} INT{ADD(univd%,offset_relation_csg&)}=-1 IF copie_reference! IF INT{univs%}=primitive_triangle& SINGLE{ADD(univd%,2)}=rpx+dix SINGLE{ADD(univd%,6)}=rpy+diy SINGLE{ADD(univd%,10)}=rpz+diz SINGLE{ADD(univd%,14)}=rpx+dix SINGLE{ADD(univd%,18)}=rpy+diy SINGLE{ADD(univd%,22)}=rpz+diz SINGLE{ADD(univd%,26)}=rpx+dix SINGLE{ADD(univd%,30)}=rpy+diy SINGLE{ADD(univd%,34)}=rpz+diz ELSE SINGLE{ADD(univd%,2)}=rpx+dix SINGLE{ADD(univd%,6)}=rpy+diy SINGLE{ADD(univd%,10)}=rpz+diz SINGLE{ADD(univd%,14)}=rtx*agx SINGLE{ADD(univd%,18)}=rty*agy SINGLE{ADD(univd%,22)}=rtz*agz SINGLE{ADD(univd%,26)}=(rxr+rox) MOD 360 SINGLE{ADD(univd%,30)}=(ryr+roy) MOD 360 SINGLE{ADD(univd%,34)}=(rzr+roz) MOD 360 ENDIF ELSE IF INT{univs%}=primitive_triangle& SINGLE{ADD(univd%,2)}=SINGLE{ADD(univs%,2)}+dix SINGLE{ADD(univd%,6)}=SINGLE{ADD(univs%,6)}+diy SINGLE{ADD(univd%,10)}=SINGLE{ADD(univs%,10)}+diz SINGLE{ADD(univd%,14)}=SINGLE{ADD(univs%,14)}+dix SINGLE{ADD(univd%,18)}=SINGLE{ADD(univs%,18)}+diy SINGLE{ADD(univd%,22)}=SINGLE{ADD(univs%,22)}+diz SINGLE{ADD(univd%,26)}=SINGLE{ADD(univs%,26)}+dix SINGLE{ADD(univd%,30)}=SINGLE{ADD(univs%,30)}+diy SINGLE{ADD(univd%,34)}=SINGLE{ADD(univs%,34)}+diz ELSE SINGLE{ADD(univd%,2)}=SINGLE{ADD(univs%,2)}+dix SINGLE{ADD(univd%,6)}=SINGLE{ADD(univs%,6)}+diy SINGLE{ADD(univd%,10)}=SINGLE{ADD(univs%,10)}+diz SINGLE{ADD(univd%,14)}=SINGLE{ADD(univs%,14)}*agx SINGLE{ADD(univd%,18)}=SINGLE{ADD(univs%,18)}*agy SINGLE{ADD(univd%,22)}=SINGLE{ADD(univs%,22)}*agz SINGLE{ADD(univd%,26)}=(SINGLE{ADD(univs%,26)}+rox) MOD 360 SINGLE{ADD(univd%,30)}=(SINGLE{ADD(univs%,30)}+roy) MOD 360 SINGLE{ADD(univd%,34)}=(SINGLE{ADD(univs%,34)}+roz) MOD 360 ENDIF ENDIF ENDIF univs%=@adresse_texture(objet_actif&) univd%=@adresse_texture(nombre_d_objets&) bmove(univs%,univd%,taille_texture&) univs%=@adresse_pigment(objet_actif&) univd%=@adresse_pigment(nombre_d_objets&) bmove(univs%,univd%,taille_pigment&) univs%=@adresse_normal(objet_actif&) univd%=@adresse_normal(nombre_d_objets&) bmove(univs%,univd%,taille_normal&) univs%=@adresse_finish(objet_actif&) univd%=@adresse_finish(nombre_d_objets&) bmove(univs%,univd%,taille_finish&) univs%=@adresse_interior(objet_actif&) univd%=@adresse_interior(nombre_d_objets&) bmove(univs%,univd%,taille_interior&) ' objet_actif&=nombre_d_objets& INC nombre_d_objets& ' RETURN > FUNCTION position_de_la_copie ! Heu! comment on la fait la copie ? LOCAL fx&,fy&,fw&,fh&,evnt&,mem_ob&,pr_f& ' videsouris ' ob_state(adr_copier%,corefer0&,aes_selected&,copie_reference!) ob_state(adr_copier%,corefer1&,aes_selected&,NOT copie_reference!) form_center(adr_copier%,fx&,fy&,fw&,fh&) x&=SHL(SHR(x&,4),4) form_dial(0,fx&,fy&,ADD(fw&,4),ADD(fh&,4),fx&,fy&,ADD(fw&,4),ADD(fh&,4)) ' pr_f&=@wind_create(0,fx&,fy&,fw&,fh&) IF pr_f&>-1 wind_open(pr_f&,fx&,fy&,fw&,fh&) ENDIF ' objc_draw(adr_copier%,0,12,fx&,fy&,fw&,fh&,-1) DO ' Appel fonction xform_do() juste pour la fenˆtre concern‚e evnt&=@xform_do(&X110011,adr_copier%,0) IF BTST(evnt&,0) ! EVENEMENT CLAVIER IF key&=&H11B ' ESC objc_change(adr_copier%,coannul&) videsouris objc_change(adr_copier%,coannul&) form_dial(3,fx&,fy&,ADD(fw&,4),ADD(fh&,4),fx&,fy&,ADD(fw&,4),ADD(fh&,4)) ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' RETURN 6 ENDIF CLR evnt& ENDIF IF BTST(evnt&,1) ! EVENEMENT DE CLIC SOURIS $S&,$S> SELECT objet& CASE corefer0& objc_change(adr_copier%,objet&) copie_reference!=TRUE ob_state(adr_copier%,corefer0&,aes_selected&,TRUE) ob_state(adr_copier%,corefer1&,aes_selected&,FALSE) redraw_elem(adr_copier%,corefer0&) redraw_elem(adr_copier%,corefer1&) CASE corefer1& objc_change(adr_copier%,objet&) copie_reference!=FALSE ob_state(adr_copier%,corefer0&,aes_selected&,FALSE) ob_state(adr_copier%,corefer1&,aes_selected&,TRUE) redraw_elem(adr_copier%,corefer0&) redraw_elem(adr_copier%,corefer1&) CASE conombr& objc_change(adr_copier%,objet&) saisie_d_une_composante(adr_copier%,objet&,1,9999,4,0) objc_change(adr_copier%,conombr&) CASE comdistx&,comdisty&,comdistz& objc_change(adr_copier%,objet&) mem_ob&=objet& saisie_d_une_composante(adr_copier%,objet&,-32768,32767,10,3) objc_change(adr_copier%,mem_ob&) CASE codegrex&,codegrey&,codegrez& objc_change(adr_copier%,objet&) mem_ob&=objet& saisie_d_une_composante(adr_copier%,objet&,-180,180,8,3) objc_change(adr_copier%,mem_ob&) CASE coptauxx&,coptauxy&,coptauxz& objc_change(adr_copier%,objet&) mem_ob&=objet& saisie_d_une_composante(adr_copier%,objet&,1,999,3,0) objc_change(adr_copier%,mem_ob&) CASE coalea0x&,coalea0y&,coalea0z&,coalea1x&,coalea1y&,coalea1z&,coalea2x&,coalea2y&,coalea2z& objc_change(adr_copier%,objet&) mem_ob&=objet& saisie_d_une_composante(adr_copier%,objet&,0,100,3,0) objc_change(adr_copier%,mem_ob&) CASE coinitia& objc_change(adr_copier%,objet&) saisie_d_une_composante(adr_copier%,objet&,0,999999999,9,0) objc_change(adr_copier%,coinitia&) CASE coannul& objc_change(adr_copier%,objet&) form_dial(3,fx&,fy&,ADD(fw&,4),ADD(fh&,4),fx&,fy&,ADD(fw&,4),ADD(fh&,4)) ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' RETURN 6 CASE copimult& objc_change(adr_copier%,objet&) form_dial(3,fx&,fy&,ADD(fw&,4),ADD(fh&,4),fx&,fy&,ADD(fw&,4),ADD(fh&,4)) ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' RETURN 7 ENDSELECT ENDIF LOOP ENDFUNC > PROCEDURE copie_selection_multiple(disx,disy,disz) LOCAL j& LOCAL univ2% ' CLR j& DO objet_actif&=CARD{ADD(deplacement_multiple%,SHL(j&,1))} univ2%=@adresse_objet(objet_actif&) copie_reference!=FALSE copie_d_objet(0,0,0,0,0,0,0,0,0,0,0,0,disx,disy,disz,1,1,1,objet_actif&,1) INC j& LOOP WHILE j& PROCEDURE statistiques_par_objet(ob&,nb&) ! Combien de points et de faces LOCAL fx&,fy&,fw&,fh&,evnt&,sort_stat! LOCAL numero_en_cours& LOCAL objet_en_cours& LOCAL evnt&,pr_f& ' ' CLR objet_en_cours& numero_en_cours&=1 sort_stat!=FALSE form_center(adr_stat_par_objet%,fx&,fy&,fw&,fh&) form_dial(0,fx&,fy&,ADD(fw&,4),ADD(fh&,4),fx&,fy&,ADD(fw&,4),ADD(fh&,4)) ' pr_f&=@wind_create(0,fx&,fy&,fw&,fh&) IF pr_f&>-1 wind_open(pr_f&,fx&,fy&,fw&,fh&) ENDIF ' CHAR{{OB_SPEC(adr_stat_par_objet%,nbrstaob&)}}=STR$(numero_en_cours&,4)+STR$(nb&,4) objet_en_cours&=@avance_info_objet(ob&,objet_en_cours&) IF nb&=1 ob_flags(adr_stat_par_objet%,zerstaob&,aes_hidetree&,TRUE) ob_flags(adr_stat_par_objet%,haustaob&,aes_hidetree&,TRUE) ob_flags(adr_stat_par_objet%,basstaob&,aes_hidetree&,TRUE) ob_flags(adr_stat_par_objet%,maxstaob&,aes_hidetree&,TRUE) ELSE ob_flags(adr_stat_par_objet%,zerstaob&,aes_hidetree&,FALSE) ob_flags(adr_stat_par_objet%,haustaob&,aes_hidetree&,FALSE) ob_flags(adr_stat_par_objet%,basstaob&,aes_hidetree&,FALSE) ob_flags(adr_stat_par_objet%,maxstaob&,aes_hidetree&,FALSE) ENDIF objc_draw(adr_stat_par_objet%,0,12,fx&,fy&,fw&,fh&,-1) DO ' Appel fonction xform_do() juste pour la fenˆtre concern‚e evnt&=@xform_do(&X110011,adr_stat_par_objet%,0) IF BTST(evnt&,0) ! EVENEMENT CLAVIER IF key&=&H11B ' ESC objc_change(adr_stat_par_objet%,finstaob&) videsouris objc_change(adr_stat_par_objet%,finstaob&) sort_stat!=TRUE ENDIF ENDIF IF BTST(evnt&,1) $S&,$S> SELECT objet& CASE finstaob& objc_change(adr_stat_par_objet%,objet&) sort_stat!=TRUE CASE zerstaob& objc_change(adr_stat_par_objet%,objet&) IF numero_en_cours&>1 numero_en_cours&=1 CHAR{{OB_SPEC(adr_stat_par_objet%,nbrstaob&)}}=STR$(numero_en_cours&,4)+STR$(nb&,4) objet_en_cours&=@avance_info_objet(ob&,0) redraw_elem(adr_stat_par_objet%,soustaob&) redraw_elem(adr_stat_par_objet%,nbrstaob&) ENDIF CASE haustaob& objc_change(adr_stat_par_objet%,objet&) IF numero_en_cours&>1 DEC numero_en_cours& CHAR{{OB_SPEC(adr_stat_par_objet%,nbrstaob&)}}=STR$(numero_en_cours&,4)+STR$(nb&,4) objet_en_cours&=@recule_info_objet(ob&,PRED(objet_en_cours&)) redraw_elem(adr_stat_par_objet%,soustaob&) redraw_elem(adr_stat_par_objet%,nbrstaob&) ENDIF CASE basstaob& objc_change(adr_stat_par_objet%,objet&) IF numero_en_cours&-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' RETURN > FUNCTION avance_info_objet(ob&,objet_en_cours&) $S&,$S> SELECT ob& CASE i0& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="BOITE" objet_en_cours&=@renseignement_sur_objet_apres(1,objet_en_cours&) CASE i1& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="SPHERE" objet_en_cours&=@renseignement_sur_objet_apres(2,objet_en_cours&) CASE i2& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="PLAN" objet_en_cours&=@renseignement_sur_objet_apres(11,objet_en_cours&) CASE i3& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="PRISME" objet_en_cours&=@renseignement_sur_objet_apres(3,objet_en_cours&) CASE i4& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="HEMISPHERE" objet_en_cours&=@renseignement_sur_objet_apres(6,objet_en_cours&) CASE i5& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="BOITE_RONDE" objet_en_cours&=@renseignement_sur_objet_apres(7,objet_en_cours&) CASE i6& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="COLONNE" objet_en_cours&=@renseignement_sur_objet_apres(10,objet_en_cours&) CASE i7& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="SEGMENT" objet_en_cours&=@renseignement_sur_objet_apres(0,objet_en_cours&) CASE i8& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="PYRAMIDE" objet_en_cours&=@renseignement_sur_objet_apres(9,objet_en_cours&) CASE i9& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="TRIANGLE" objet_en_cours&=@renseignement_sur_objet_apres(4,objet_en_cours&) CASE i10& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="TRONC_D_CONE" objet_en_cours&=@renseignement_sur_objet_apres(5,objet_en_cours&) CASE i11& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="TOR" objet_en_cours&=@renseignement_sur_objet_apres(12,objet_en_cours&) CASE i12& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="DISQUE" objet_en_cours&=@renseignement_sur_objet_apres(8,objet_en_cours&) CASE iau& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="MONTAGNE" objet_en_cours&=@renseignement_sur_objet_facette_apres(bit_montagne|,objet_en_cours&) CASE ibe& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="FORME_BEZIER" objet_en_cours&=@renseignement_sur_objet_facette_apres(bit_bicubic|,objet_en_cours&) CASE im3d2& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="OBJ_FACETTE" objet_en_cours&=@renseignement_sur_objet_facette_apres(bit_facette|,objet_en_cours&) CASE iu& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="UNION" objet_en_cours&=@renseignement_sur_objet_csg_apres(-1,objet_en_cours&) CASE ii& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="INTERSECTION" objet_en_cours&=@renseignement_sur_objet_csg_apres(-2,objet_en_cours&) CASE id& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="DIFFERENCE" objet_en_cours&=@renseignement_sur_objet_csg_apres(-3,objet_en_cours&) CASE imer& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="MERGE" objet_en_cours&=@renseignement_sur_objet_csg_apres(-4,objet_en_cours&) CASE iblob& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="BLOB" objet_en_cours&=@renseignement_sur_objet_csg_apres(-5,objet_en_cours&) ENDSELECT RETURN objet_en_cours& ENDFUNC > FUNCTION recule_info_objet(ob&,objet_en_cours&) $S&,$S> SELECT ob& CASE i0& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="BOITE" objet_en_cours&=@renseignement_sur_objet_avant(1,objet_en_cours&) CASE i1& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="SPHERE" objet_en_cours&=@renseignement_sur_objet_avant(2,objet_en_cours&) CASE i2& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="PLAN" objet_en_cours&=@renseignement_sur_objet_avant(11,objet_en_cours&) CASE i3& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="PRISME" objet_en_cours&=@renseignement_sur_objet_avant(3,objet_en_cours&) CASE i4& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="HEMISPHERE" objet_en_cours&=@renseignement_sur_objet_avant(6,objet_en_cours&) CASE i5& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="BOIT_RONDE" objet_en_cours&=@renseignement_sur_objet_avant(7,objet_en_cours&) CASE i6& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="COLONNE" objet_en_cours&=@renseignement_sur_objet_avant(10,objet_en_cours&) CASE i7& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="SEGMENT" objet_en_cours&=@renseignement_sur_objet_avant(0,objet_en_cours&) CASE i8& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="PYRAMIDE" objet_en_cours&=@renseignement_sur_objet_avant(9,objet_en_cours&) CASE i9& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="TRIANGLE" objet_en_cours&=@renseignement_sur_objet_avant(4,objet_en_cours&) CASE i10& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="TRONC_D_CONE" objet_en_cours&=@renseignement_sur_objet_avant(5,objet_en_cours&) CASE i11& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="TOR" objet_en_cours&=@renseignement_sur_objet_avant(12,objet_en_cours&) CASE i12& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="DISQUE" objet_en_cours&=@renseignement_sur_objet_avant(8,objet_en_cours&) CASE iau& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="MONTAGNE" objet_en_cours&=@renseignement_sur_objet_facette_avant(bit_montagne|,objet_en_cours&) CASE ibe& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="FORME_BEZIER" objet_en_cours&=@renseignement_sur_objet_facette_avant(bit_bicubic|,objet_en_cours&) CASE im3d2& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="OBJ_FACETTE" objet_en_cours&=@renseignement_sur_objet_facette_avant(bit_facette|,objet_en_cours&) CASE iu& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="UNION" objet_en_cours&=@renseignement_sur_objet_csg_avant(-1,objet_en_cours&) CASE ii& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="INTERSECTION" objet_en_cours&=@renseignement_sur_objet_csg_avant(-2,objet_en_cours&) CASE id& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="DIFFERENCE" objet_en_cours&=@renseignement_sur_objet_csg_avant(-3,objet_en_cours&) CASE imer& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="MERGE" objet_en_cours&=@renseignement_sur_objet_csg_avant(-4,objet_en_cours&) CASE iblob& CHAR{{OB_SPEC(adr_stat_par_objet%,typstaob&)}}="BLOB" objet_en_cours&=@renseignement_sur_objet_csg_avant(-5,objet_en_cours&) ENDSELECT RETURN objet_en_cours& ENDFUNC ' > FUNCTION renseignement_sur_objet_apres(tp&,objet_en_cours&) LOCAL univ%,i&,adr_poi%,adr_fac%,nbp%,nbf% i&=objet_en_cours& DO univ%=@adresse_objet(i&) IF INT{univ%}=tp& CHAR{{OB_SPEC(adr_stat_par_objet%,numstaob&)}}=STR$(SUCC(i&),4) BYTE{ADD(ADD(univ%,offset_nom_objet&),21)}=0 CHAR{{OB_SPEC(adr_stat_par_objet%,nomstaob&)}}=CHAR{ADD(univ%,offset_nom_objet&)} type_d_objet(univ%,nbp%,nbf%,adr_poi%,adr_fac%) CHAR{{OB_SPEC(adr_stat_par_objet%,nbpstaob&)}}=STR$(SUCC(nbp%),4) CHAR{{OB_SPEC(adr_stat_par_objet%,nbfstaob&)}}=STR$(SUCC(nbf%),4) IF i&>PRED(nombre_d_objets&) RETURN PRED(nombre_d_objets&) ELSE RETURN i& ENDIF ENDIF INC i& LOOP WHILE i& FUNCTION renseignement_sur_objet_facette_apres(typ_bit|,objet_en_cours&) LOCAL univ%,i&,adr_poi%,adr_fac%,nbp%,nbf% i&=objet_en_cours& DO univ%=@adresse_objet(i&) IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},typ_bit|) CHAR{{OB_SPEC(adr_stat_par_objet%,numstaob&)}}=STR$(SUCC(i&),4) BYTE{ADD(ADD(univ%,offset_nom_objet&),21)}=0 CHAR{{OB_SPEC(adr_stat_par_objet%,nomstaob&)}}=CHAR{ADD(univ%,offset_nom_objet&)} type_d_objet(univ%,nbp%,nbf%,adr_poi%,adr_fac%) CHAR{{OB_SPEC(adr_stat_par_objet%,nbpstaob&)}}=STR$(SUCC(nbp%),4) CHAR{{OB_SPEC(adr_stat_par_objet%,nbfstaob&)}}=STR$(SUCC(nbf%),4) IF i&>PRED(nombre_d_objets&) RETURN PRED(nombre_d_objets&) ELSE RETURN i& ENDIF ENDIF INC i& LOOP WHILE i& FUNCTION renseignement_sur_objet_csg_apres(typ_cs&,objet_en_cours&) LOCAL univ%,i&,adr_poi%,adr_fac%,nbp%,nbf% i&=objet_en_cours& DO univ%=@adresse_objet(i&) IF INT{ADD(univ%,offset_csg_type&)}=typ_cs& CHAR{{OB_SPEC(adr_stat_par_objet%,numstaob&)}}=STR$(SUCC(i&),4) BYTE{ADD(ADD(univ%,offset_nom_objet&),21)}=0 CHAR{{OB_SPEC(adr_stat_par_objet%,nomstaob&)}}=CHAR{ADD(univ%,offset_nom_objet&)} type_d_objet(univ%,nbp%,nbf%,adr_poi%,adr_fac%) CHAR{{OB_SPEC(adr_stat_par_objet%,nbpstaob&)}}=STR$(SUCC(nbp%),4) CHAR{{OB_SPEC(adr_stat_par_objet%,nbfstaob&)}}=STR$(SUCC(nbf%),4) IF i&>PRED(nombre_d_objets&) RETURN PRED(nombre_d_objets&) ELSE RETURN i& ENDIF ENDIF INC i& LOOP WHILE i& FUNCTION renseignement_sur_objet_avant(tp&,objet_en_cours&) LOCAL univ%,i&,adr_poi%,adr_fac%,nbp%,nbf% i&=PRED(objet_en_cours&) DO univ%=@adresse_objet(i&) IF INT{univ%}=tp& CHAR{{OB_SPEC(adr_stat_par_objet%,numstaob&)}}=STR$(SUCC(i&),4) BYTE{ADD(ADD(univ%,offset_nom_objet&),21)}=0 CHAR{{OB_SPEC(adr_stat_par_objet%,nomstaob&)}}=CHAR{ADD(univ%,offset_nom_objet&)} type_d_objet(univ%,nbp%,nbf%,adr_poi%,adr_fac%) CHAR{{OB_SPEC(adr_stat_par_objet%,nbpstaob&)}}=STR$(SUCC(nbp%),4) CHAR{{OB_SPEC(adr_stat_par_objet%,nbfstaob&)}}=STR$(SUCC(nbf%),4) IF i&<0 RETURN 0 ELSE RETURN i& ENDIF ENDIF DEC i& LOOP WHILE i&>-1 RETURN 0 ENDFUNC > FUNCTION renseignement_sur_objet_facette_avant(typ_bit|,objet_en_cours&) LOCAL univ%,i&,adr_poi%,adr_fac%,nbp%,nbf% i&=objet_en_cours& DO univ%=@adresse_objet(i&) IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},typ_bit|) CHAR{{OB_SPEC(adr_stat_par_objet%,numstaob&)}}=STR$(SUCC(i&),4) BYTE{ADD(ADD(univ%,offset_nom_objet&),21)}=0 CHAR{{OB_SPEC(adr_stat_par_objet%,nomstaob&)}}=CHAR{ADD(univ%,offset_nom_objet&)} type_d_objet(univ%,nbp%,nbf%,adr_poi%,adr_fac%) CHAR{{OB_SPEC(adr_stat_par_objet%,nbpstaob&)}}=STR$(SUCC(nbp%),4) CHAR{{OB_SPEC(adr_stat_par_objet%,nbfstaob&)}}=STR$(SUCC(nbf%),4) IF i&<0 RETURN 0 ELSE RETURN i& ENDIF ENDIF DEC i& LOOP WHILE i&>-1 RETURN 0 ENDFUNC > FUNCTION renseignement_sur_objet_csg_avant(typ_cs&,objet_en_cours&) LOCAL univ%,i&,adr_poi%,adr_fac%,nbp%,nbf% i&=objet_en_cours& DO univ%=@adresse_objet(i&) IF INT{ADD(univ%,offset_csg_type&)}=typ_cs& CHAR{{OB_SPEC(adr_stat_par_objet%,numstaob&)}}=STR$(SUCC(i&),4) BYTE{ADD(ADD(univ%,offset_nom_objet&),21)}=0 CHAR{{OB_SPEC(adr_stat_par_objet%,nomstaob&)}}=CHAR{ADD(univ%,offset_nom_objet&)} type_d_objet(univ%,nbp%,nbf%,adr_poi%,adr_fac%) CHAR{{OB_SPEC(adr_stat_par_objet%,nbpstaob&)}}=STR$(SUCC(nbp%),4) CHAR{{OB_SPEC(adr_stat_par_objet%,nbfstaob&)}}=STR$(SUCC(nbf%),4) IF i&<0 RETURN 0 ELSE RETURN i& ENDIF ENDIF DEC i& LOOP WHILE i&>-1 RETURN 0 ENDFUNC ' ************************ Lancement de P.O.V. ********************************* > PROCEDURE lancer_pov_en_generation ! La, il faut beaucoup de m‚moire LOCAL l%,fer! ' chemin_en_cours(disque%,path%) ' l%=LEN(CHAR{disque%}+CHAR{path%}+"eb_model.ini"+CHR$(0)) CHAR{commande%}=CHR$(l%)+CHAR{disque%}+CHAR{path%}+"eb_model.ini"+CHR$(0) fer!=(INSTR("TTPTOSttptos",RIGHT$(CHAR{{OB_SPEC(adr_parametres%,chettp&)}},3))<>0) CHAR{mem_num%}=CHR$(0) IF multitache! ' 1 : Lancer le programme de la premiŠre chaine ' 0 : C'est un programme TOS donc avec VT52 ' shw_parallel& : Le lancer en multitƒche IF fer! ' Ah!, si TOS2GEM est l…, autant l'utiliser... IF tos2gem! lancer_un_tos_par_tos2gem({OB_SPEC(adr_parametres%,chettp&)},commande%,mem_num%,TRUE) ELSE l%=@shel_write(1,0,shw_parallel&,{OB_SPEC(adr_parametres%,chettp&)},commande%) ENDIF ELSE l%=@shel_write(1,1,shw_parallel&,{OB_SPEC(adr_parametres%,chettp&)},commande%) ENDIF ELSE IF fer! ' PremiŠrement, v‚rifier si TOS2GEM est install‚. Si c'est le cas, ' l'utiliser...Sinon, on lance salement sur le bureau IF tos2gem! lancer_un_tos_par_tos2gem({OB_SPEC(adr_parametres%,chettp&)},commande%,mem_num%,TRUE) ELSE l%=GEMDOS(&H4B,shw_load_go&,L:{OB_SPEC(adr_parametres%,chettp&)},L:commande%,L:mem_num%) ENDIF ELSE l%=GEMDOS(&H4B,shw_load_go&,L:{OB_SPEC(adr_parametres%,chettp&)},L:commande%,L:mem_num%) ENDIF ENDIF chemin_systeme IF l%=-39 ~@afficher_alerte(adr_memoire%) ENDIF membfill(commande%,272,0) RETURN > PROCEDURE fichier_lancement_pov3 LOCAL i&,rend& LOCAL continue!,obspec% ' CHAR{disque%}=LEFT$(CHAR{{OB_SPEC(adr_parametres%,chettp&)}},2) minuscule(disque%) obspec%=OB_SPEC(adr_parametres%,chettp&) CHAR{path%}=RIGHT$(LEFT$(CHAR{{obspec%}},RINSTR(CHAR{{obspec%}},"\")),SUB(LEN(LEFT$(CHAR{{obspec%}},RINSTR(CHAR{{obspec%}},"\"))),2))+CHR$(0) minuscule(path%) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+"eb_model.ini"+CHR$(0) minuscule(mem_che%) OPEN "o",#1,CHAR{mem_che%} ' Continuer une image ou non continue!=BTST(OB_STATE(adr_lanceur%,povcont&),aes_selected&) ' ' ---- Chemin principal d'acc‚s aux INCLUDES … cot‚ du script obspec%=OB_SPEC(adr_parametres%,chepov&) PRINT #1,"Library_Path="+LEFT$(CHAR{{obspec%}},RINSTR(CHAR{{obspec%}},"\"))+LEFT$(CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}},PRED(INSTR(CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}},"."))) ' chemin_include_pov3 ' ---- Chemin et nom du script POV PRINT #1,"Input_File_Name="; obspec%=OB_SPEC(adr_parametres%,chepov&) PRINT #1,LEFT$(CHAR{{obspec%}},RINSTR(CHAR{{obspec%}},"\"))+LEFT$(CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}},PRED(INSTR(CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}},".")))+"\"+TRIM$(CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}}) ' ---- Chemin et nom du fichier image g‚n‚r‚ obspec%=OB_SPEC(adr_parametres%,cheimg&) PRINT #1,"Output_File_Name="+LEFT$(CHAR{{obspec%}},RINSTR(CHAR{{obspec%}},"\"))+TRIM$(CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}) IF BTST(OB_STATE(adr_lanceur%,povgene&),aes_selected&) PRINT #1,"Output_to_File=on" ' ---- Sauvegarde d'un fichier graphique SELECT LEFT$(TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}}),3) CASE "TGA" IF TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}})="TGA 2" ' Image PRINT #1,"; *** TARGA non compr‚ss‚e type 2" PRINT #1,"Output_File_Type=T" ELSE ' Image PRINT #1,"; *** TARGA compr‚ss‚e RLE type 10" PRINT #1,"Output_File_Type=C" ENDIF CASE "PNG" IF TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}})="PNG 8" ' Image PNG 8 bpc PRINT #1,"; *** PNG 8 bits par couleur (rempla‡ant du GIF)" PRINT #1,"Output_File_Type=N" ELSE ' Image PNG n bpc (*.PNG rempla‡ant du GIF) PRINT #1,"; *** PNG n bits par couleur (rempla‡ant du GIF)" PRINT #1,"Output_File_Type=N"+TRIM$(CHAR{{OB_SPEC(adr_lanceur%,bpc&)}}) ENDIF CASE "PPM" ' format propre … UNIX (*.PPM) PRINT #1,"; *** PPM provenance UNIX" PRINT #1,"Output_File_Type=P" ENDSELECT ENDIF IF BTST(OB_STATE(adr_lanceur%,povaffi&),aes_selected&) ' ---- Affichage de l'image d'aprŠs le mode PRINT #1,"Display=on" PRINT #1,"Video_Mode=3" PRINT #1,"Palette="+RIGHT$(CHAR{{OB_SPEC(adr_lanceur%,txtmode&)}},1) ENDIF IF BTST(OB_STATE(adr_lanceur%,povnume&),aes_selected&) ' ---- Affichage des informations de ligne PRINT #1,"Verbose=on" ENDIF IF BTST(OB_STATE(adr_lanceur%,povatte&),aes_selected&) ' ---- Attente clavier aprŠs calcul PRINT #1,"Pause_When_Done=on" ENDIF IF BTST(OB_STATE(adr_lanceur%,povater&),aes_selected&) ' ---- Arret calcul en cours de travail PRINT #1,"Test_Abort=on" ENDIF IF BTST(OB_STATE(adr_lanceur%,povutsl&),aes_selected&) ' ---- Mise en fonction des BOUNDING SLABS ' ---- Gestion automatique des BOUNDED_SLABS PRINT #1,"Bounding=on" PRINT #1,"Bounding_Threshold="+STR$(VAL(CHAR{{OB_SPEC(adr_lanceur%,povslabs&)}})) ENDIF IF BTST(OB_STATE(adr_lanceur%,buffonof&),aes_selected&) ' ---- Buffer pour le fichier de sortie PRINT #1,"Buffer_Output=on" PRINT #1,"Buffer_Size="+STR$(VAL(CHAR{{OB_SPEC(adr_lanceur%,povbuffe&)}})) ELSE ' ---- Buffer pour le fichier de sortie non pr‚sent PRINT #1,"Buffer_Output=off" ENDIF IF BTST(OB_STATE(adr_lanceur%,antionof&),aes_selected&) ' ---- Matrice pour l'AntiAliasing CLR rend& FOR i&=povmat01& TO povmat09& IF BTST(OB_STATE(adr_lanceur%,i&),aes_selected&) rend&=SUCC(SUB(i&,povmat01&)) i&=povmat09& ENDIF NEXT i& ' ---- Valeur de l'AntiAliasing PRINT #1,"Antialias=on" PRINT #1,"Antialias_Threshold="+STR$(ROUND(alias&/255,4)) PRINT #1,"Antialias_Depth="+STR$(rend&) IF BTST(OB_STATE(adr_lanceur%,povlafa&),aes_selected&) ' ---- Anti-aliasing en m‚thode rapide PRINT #1,"Sampling_method=2" ELSE PRINT #1,"Sampling_method=1" ENDIF IF BTST(OB_STATE(adr_lanceur%,jittonof&),aes_selected&) ' ---- Option pour JITTER PRINT #1,"Jitter=on" PRINT #1,"Jitter_Amount="+STR$(ROUND(jittering&/255,4)) ELSE ' ---- Pas d'effet JITTER PRINT #1,"Jitter=off" ENDIF ELSE ' ---- Pas d'effet ALIASING PRINT #1,"Antialias=off" ENDIF ' ---- Qualit‚ du rendu PRINT #1,"Quality="+RIGHT$(TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povquali&,2))}}),1) ' ---- Activation de la Radiosit‚ ou non IF CHAR{{OB_SPEC(adr_lanceur%,SUB(povradio&,2))}}=LEFT$(CHAR{OB_SPEC(adr_divers%,lin8&)},PRED(INSTR(CHAR{OB_SPEC(adr_divers%,lin8&)},"/"))) PRINT #1,"+qr" ENDIF IF BTST(OB_STATE(adr_lanceur%,pov_ul&),aes_selected&) PRINT #1,"Light_Buffer=on" ELSE PRINT #1,"Light_Buffer=off" ENDIF IF BTST(OB_STATE(adr_lanceur%,pov_uv&),aes_selected&) PRINT #1,"Vista_Buffer=on" ELSE PRINT #1,"Vista_Buffer=off" ENDIF IF BTST(OB_STATE(adr_lanceur%,pov_ur&),aes_selected&) PRINT #1,"Remove_Bounds=on" ELSE PRINT #1,"Remove_Bounds=off" ENDIF IF BTST(OB_STATE(adr_lanceur%,pov_su&),aes_selected&) PRINT #1,"Split_Unions=on" ELSE PRINT #1,"Split_Unions=off" ENDIF IF BTST(OB_STATE(adr_lanceur%,pov_ud&),aes_selected&) PRINT #1,"Draw_Vistas=on" ELSE PRINT #1,"Draw_Vistas=off" ENDIF IF BTST(OB_STATE(adr_lanceur%,povmosai&),aes_selected&) ' Pas de d‚part du mode mosaique PRINT #1,"Preview_Start_Size="+TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(mosadebu&,2))}}) ' Pas de fin du mode mosaique PRINT #1,"Preview_End_Size="+TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(mosafin&,2))}}) ENDIF IF BTST(OB_STATE(adr_lanceur%,pov_ga&),aes_selected&) PRINT #1,"All_Console=on" ELSE PRINT #1,"All_Console=off" ENDIF IF BTST(OB_STATE(adr_lanceur%,pov_gd&),aes_selected&) PRINT #1,"Debug_Console=on" ELSE PRINT #1,"Debug_Console=off" ENDIF IF BTST(OB_STATE(adr_lanceur%,pov_gf&),aes_selected&) PRINT #1,"Fatal_Console=on" ELSE PRINT #1,"Fatal_Console=off" ENDIF IF BTST(OB_STATE(adr_lanceur%,pov_gr&),aes_selected&) PRINT #1,"Render_Console=on" ELSE PRINT #1,"Render_Console=off" ENDIF IF BTST(OB_STATE(adr_lanceur%,pov_gs&),aes_selected&) PRINT #1,"Statistic_Console=on" ELSE PRINT #1,"Statistic_Console=off" ENDIF IF BTST(OB_STATE(adr_lanceur%,pov_gw&),aes_selected&) PRINT #1,"Warning_Console=on" ELSE PRINT #1,"Warning_Console=off" ENDIF IF continue! PRINT #1,"Continue_Trace=on" ' ---- Largeur de l'image PRINT #1,"Width="+STR$(VAL(CHAR{{OB_SPEC(adr_lanceur%,povlarge&)}})) ' ---- hauteur de l'image PRINT #1,"Height="+STR$(VAL(CHAR{{OB_SPEC(adr_lanceur%,povhaute&)}})) ELSE ' ---- Largeur de l'image PRINT #1,"Width="+STR$(VAL(CHAR{{OB_SPEC(adr_lanceur%,povlarge&)}})) ' ---- hauteur de l'image PRINT #1,"Height="+STR$(VAL(CHAR{{OB_SPEC(adr_lanceur%,povhaute&)}})) ' ---- Colonne de d‚part des calculs PRINT #1,"Start_Column="+STR$(VAL(CHAR{{OB_SPEC(adr_lanceur%,cpovdebu&)}})) ' ---- Colonne de fin des calcul PRINT #1,"End_Column="+STR$(VAL(CHAR{{OB_SPEC(adr_lanceur%,cpovfin&)}})) ' ---- Ligne de d‚bpart des calculs PRINT #1,"Start_Row="+STR$(VAL(CHAR{{OB_SPEC(adr_lanceur%,rpovdebu&)}})) ' ---- Ligne de fin des calcul PRINT #1,"End_Row="+STR$(VAL(CHAR{{OB_SPEC(adr_lanceur%,rpovfin&)}})) ENDIF CLOSE #1 RETURN > PROCEDURE chemin_include_pov3 LOCAL obspec% ' ---- Chemin principal d'acc‚s aux diff‚rents fichiers de la scŠne obspec%=OB_SPEC(adr_parametres%,chepov&) PRINT #1,"Library_Path="+TRIM$(LEFT$(CHAR{{obspec%}},RINSTR(CHAR{{obspec%}},"\"))+"preview") ' ---- Chemin principal d'acc‚s aux INCLUDES obspec%=OB_SPEC(adr_parametres%,cheinc&) PRINT #1,"Library_Path="+TRIM$(LEFT$(CHAR{{obspec%}},PRED(RINSTR(CHAR{{obspec%}},"\")))) ' ---- Chemins secondaires d'acc‚s aux INCLUDES IF BTST(OB_STATE(adr_chemin_include%,cheinca1&),aes_selected&) obspec%=OB_SPEC(adr_chemin_include%,cheinc1&) PRINT #1,"Library_Path="+TRIM$(LEFT$(CHAR{{obspec%}},PRED(RINSTR(CHAR{{obspec%}},"\")))) ENDIF IF BTST(OB_STATE(adr_chemin_include%,cheinca2&),aes_selected&) obspec%=OB_SPEC(adr_chemin_include%,cheinc2&) PRINT #1,"Library_Path="+TRIM$(LEFT$(CHAR{{obspec%}},PRED(RINSTR(CHAR{{obspec%}},"\")))) ENDIF IF BTST(OB_STATE(adr_chemin_include%,cheinca3&),aes_selected&) obspec%=OB_SPEC(adr_chemin_include%,cheinc3&) PRINT #1,"Library_Path="+TRIM$(LEFT$(CHAR{{obspec%}},PRED(RINSTR(CHAR{{obspec%}},"\")))) ENDIF IF BTST(OB_STATE(adr_chemin_include%,cheinca4&),aes_selected&) obspec%=OB_SPEC(adr_chemin_include%,cheinc4&) PRINT #1,"Library_Path="+TRIM$(LEFT$(CHAR{{obspec%}},PRED(RINSTR(CHAR{{obspec%}},"\")))) ENDIF IF BTST(OB_STATE(adr_chemin_include%,cheinca5&),aes_selected&) obspec%=OB_SPEC(adr_chemin_include%,cheinc5&) PRINT #1,"Library_Path="+TRIM$(LEFT$(CHAR{{obspec%}},PRED(RINSTR(CHAR{{obspec%}},"\")))) ENDIF IF BTST(OB_STATE(adr_chemin_include%,cheinca6&),aes_selected&) obspec%=OB_SPEC(adr_chemin_include%,cheinc6&) PRINT #1,"Library_Path="+TRIM$(LEFT$(CHAR{{obspec%}},PRED(RINSTR(CHAR{{obspec%}},"\")))) ENDIF IF BTST(OB_STATE(adr_chemin_include%,cheinca7&),aes_selected&) obspec%=OB_SPEC(adr_chemin_include%,cheinc7&) PRINT #1,"Library_Path="+TRIM$(LEFT$(CHAR{{obspec%}},PRED(RINSTR(CHAR{{obspec%}},"\")))) ENDIF IF BTST(OB_STATE(adr_chemin_include%,cheinca8&),aes_selected&) obspec%=OB_SPEC(adr_chemin_include%,cheinc8&) PRINT #1,"Library_Path="+TRIM$(LEFT$(CHAR{{obspec%}},PRED(RINSTR(CHAR{{obspec%}},"\")))) ENDIF IF BTST(OB_STATE(adr_chemin_include%,cheinca9&),aes_selected&) obspec%=OB_SPEC(adr_chemin_include%,cheinc9&) PRINT #1,"Library_Path="+TRIM$(LEFT$(CHAR{{obspec%}},PRED(RINSTR(CHAR{{obspec%}},"\")))) ENDIF RETURN ' ****************************************************************************** > PROCEDURE ressource_camera(ind!,foc&) LOCAL i&,angle IF vue_subjective!=TRUE CHAR{{OB_SPEC(adr_camera%,poscamx&)}}=STR$(SINGLE{mem_subj%},10,3) CHAR{{OB_SPEC(adr_camera%,poscamy&)}}=STR$(SINGLE{ADD(mem_subj%,4)},10,3) CHAR{{OB_SPEC(adr_camera%,poscamz&)}}=STR$(SINGLE{ADD(mem_subj%,8)},10,3) CHAR{{OB_SPEC(adr_camera%,posversx&)}}=STR$(SINGLE{ADD(mem_subj%,12)},10,3) CHAR{{OB_SPEC(adr_camera%,posversy&)}}=STR$(SINGLE{ADD(mem_subj%,16)},10,3) CHAR{{OB_SPEC(adr_camera%,posversz&)}}=STR$(SINGLE{ADD(mem_subj%,20)},10,3) ELSE CHAR{{OB_SPEC(adr_camera%,poscamx&)}}=STR$(SINGLE{camera%},10,3) CHAR{{OB_SPEC(adr_camera%,poscamy&)}}=STR$(SINGLE{ADD(camera%,4)},10,3) CHAR{{OB_SPEC(adr_camera%,poscamz&)}}=STR$(SINGLE{ADD(camera%,8)},10,3) CHAR{{OB_SPEC(adr_camera%,posversx&)}}=STR$(SINGLE{ADD(camera%,12)},10,3) CHAR{{OB_SPEC(adr_camera%,posversy&)}}=STR$(SINGLE{ADD(camera%,16)},10,3) CHAR{{OB_SPEC(adr_camera%,posversz&)}}=STR$(SINGLE{ADD(camera%,20)},10,3) ENDIF CHAR{{OB_SPEC(adr_camera%,posangle&)}}=STR$(SINGLE{ADD(camera%,24)},8,3) ob_state(adr_camera%,camfocac&,aes_selected&,BTST(BYTE{ADD(camera%,30)},7)) ob_state(adr_camera%,posfocax&,aes_disable&,NOT BTST(BYTE{ADD(camera%,30)},7)) ob_state(adr_camera%,posfocay&,aes_disable&,NOT BTST(BYTE{ADD(camera%,30)},7)) ob_state(adr_camera%,posfocaz&,aes_disable&,NOT BTST(BYTE{ADD(camera%,30)},7)) ob_state(adr_camera%,possampl&,aes_disable&,NOT BTST(BYTE{ADD(camera%,30)},7)) ob_state(adr_camera%,posapert&,aes_disable&,NOT BTST(BYTE{ADD(camera%,30)},7)) CHAR{{OB_SPEC(adr_camera%,posfocax&)}}=STR$(SINGLE{ADD(camera%,40)},10,3) CHAR{{OB_SPEC(adr_camera%,posfocay&)}}=STR$(SINGLE{ADD(camera%,44)},10,3) CHAR{{OB_SPEC(adr_camera%,posfocaz&)}}=STR$(SINGLE{ADD(camera%,48)},10,3) CHAR{{OB_SPEC(adr_camera%,possampl&)}}=STR$(ROUND(SINGLE{ADD(camera%,32)}),3) CHAR{{OB_SPEC(adr_camera%,posapert&)}}=STR$(ROUND(SINGLE{ADD(camera%,36)}),3) ob_state(adr_camera%,posper01&,aes_selected&,FALSE) ob_state(adr_camera%,posper02&,aes_selected&,FALSE) ob_state(adr_camera%,posper03&,aes_selected&,FALSE) ob_state(adr_camera%,posper04&,aes_selected&,FALSE) ob_state(adr_camera%,posper05&,aes_selected&,FALSE) ob_state(adr_camera%,posper06&,aes_selected&,FALSE) ob_state(adr_camera%,posper07&,aes_selected&,FALSE) ob_state(adr_camera%,postyp1&,aes_selected&,FALSE) ob_state(adr_camera%,postyp2&,aes_selected&,FALSE) ob_state(adr_camera%,postyp3&,aes_selected&,FALSE) ob_state(adr_camera%,postyp4&,aes_selected&,FALSE) ob_state(adr_camera%,postyp1&,aes_disable&,TRUE) ob_state(adr_camera%,postyp2&,aes_disable&,TRUE) ob_state(adr_camera%,postyp3&,aes_disable&,TRUE) ob_state(adr_camera%,postyp4&,aes_disable&,TRUE) IF BTST(BYTE{ADD(camera%,30)},0) ob_state(adr_camera%,posper01&,aes_selected&,TRUE) ELSE IF BTST(BYTE{ADD(camera%,30)},1) ob_state(adr_camera%,posper02&,aes_selected&,TRUE) ELSE IF BTST(BYTE{ADD(camera%,30)},2) ob_state(adr_camera%,posper03&,aes_selected&,TRUE) ELSE IF BTST(BYTE{ADD(camera%,30)},3) ob_state(adr_camera%,posper04&,aes_selected&,TRUE) ELSE IF BTST(BYTE{ADD(camera%,30)},4) ob_state(adr_camera%,posper05&,aes_selected&,TRUE) ELSE IF BTST(BYTE{ADD(camera%,30)},5) ob_state(adr_camera%,posper06&,aes_selected&,TRUE) ELSE IF BTST(BYTE{ADD(camera%,30)},6) ob_state(adr_camera%,posper07&,aes_selected&,TRUE) ob_state(adr_camera%,postyp1&,aes_disable&,FALSE) ob_state(adr_camera%,postyp2&,aes_disable&,FALSE) ob_state(adr_camera%,postyp3&,aes_disable&,FALSE) ob_state(adr_camera%,postyp4&,aes_disable&,FALSE) $S|,$S> SELECT BYTE{ADD(camera%,31)} CASE 1 ob_state(adr_camera%,postyp1&,aes_selected&,TRUE) CASE 2 ob_state(adr_camera%,postyp2&,aes_selected&,TRUE) CASE 3 ob_state(adr_camera%,postyp3&,aes_selected&,TRUE) CASE 4 ob_state(adr_camera%,postyp4&,aes_selected&,TRUE) DEFAULT BYTE{ADD(camera%,31)}=1 ob_state(adr_camera%,postyp1&,aes_selected&,TRUE) ENDSELECT ELSE BYTE{ADD(camera%,30)}=BSET(BYTE{ADD(camera%,30)},0) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},1) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},2) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},3) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},4) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},5) BYTE{ADD(camera%,30)}=BCLR(BYTE{ADD(camera%,30)},6) ob_state(adr_camera%,posper01&,aes_selected&,TRUE) ENDIF IF INT{ADD(camera%,28)}=0 INT{ADD(camera%,28)}=400 ! Focale par d‚faut ENDIF focale&=INT{ADD(camera%,28)} {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) mem_focale&=focale& IF BTST(OB_STATE(adr_camera%,posob6&),aes_selected&) ob_state(adr_camera%,posob6&,aes_selected&,FALSE) IF ind! redraw_elem(adr_camera%,posob6&) ENDIF ENDIF IF BTST(OB_STATE(adr_camera%,posob18&),aes_selected&) ob_state(adr_camera%,posob18&,aes_selected&,FALSE) IF ind! redraw_elem(adr_camera%,posob18&) ENDIF ENDIF IF BTST(OB_STATE(adr_camera%,posob24&),aes_selected&) ob_state(adr_camera%,posob24&,aes_selected&,FALSE) IF ind! redraw_elem(adr_camera%,posob24&) ENDIF ENDIF IF BTST(OB_STATE(adr_camera%,posob28&),aes_selected&) ob_state(adr_camera%,posob28&,aes_selected&,FALSE) IF ind! redraw_elem(adr_camera%,posob28&) ENDIF ENDIF IF BTST(OB_STATE(adr_camera%,posob35&),aes_selected&) ob_state(adr_camera%,posob35&,aes_selected&,FALSE) IF ind! redraw_elem(adr_camera%,posob35&) ENDIF ENDIF IF BTST(OB_STATE(adr_camera%,posob50&),aes_selected&) ob_state(adr_camera%,posob50&,aes_selected&,FALSE) IF ind! redraw_elem(adr_camera%,posob50&) ENDIF ENDIF IF BTST(OB_STATE(adr_camera%,posob135&),aes_selected&) ob_state(adr_camera%,posob135&,aes_selected&,FALSE) IF ind! redraw_elem(adr_camera%,posob135&) ENDIF ENDIF IF BTST(OB_STATE(adr_camera%,posob280&),aes_selected&) ob_state(adr_camera%,posob280&,aes_selected&,FALSE) IF ind! redraw_elem(adr_camera%,posob280&) ENDIF ENDIF IF BTST(OB_STATE(adr_camera%,posob400&),aes_selected&) ob_state(adr_camera%,posob400&,aes_selected&,FALSE) IF ind! redraw_elem(adr_camera%,posob400&) ENDIF ENDIF IF BTST(OB_STATE(adr_camera%,posobxxx&),aes_selected&) ob_state(adr_camera%,posobxxx&,aes_selected&,FALSE) IF ind! redraw_elem(adr_camera%,posobxxx&) ENDIF ENDIF IF foc&=-1 foc&=focale& ENDIF SELECT foc& CASE 48,0 ! 6 mm ob_state(adr_camera%,posob6&,aes_selected&,TRUE) IF ind! redraw_elem(adr_camera%,posob6&) ENDIF CASE 144,1 ! 18 mm ob_state(adr_camera%,posob18&,aes_selected&,TRUE) IF ind! redraw_elem(adr_camera%,posob18&) ENDIF CASE 192,2 ! 24 mm ob_state(adr_camera%,posob24&,aes_selected&,TRUE) IF ind! redraw_elem(adr_camera%,posob24&) ENDIF CASE 224,3 ! 28 mm ob_state(adr_camera%,posob28&,aes_selected&,TRUE) IF ind! redraw_elem(adr_camera%,posob28&) ENDIF CASE 280,4 ! 35 mm ob_state(adr_camera%,posob35&,aes_selected&,TRUE) IF ind! redraw_elem(adr_camera%,posob35&) ENDIF CASE 400,5 ! 50 mm ob_state(adr_camera%,posob50&,aes_selected&,TRUE) IF ind! redraw_elem(adr_camera%,posob50&) ENDIF CASE 1080,6 ! 135 mm ob_state(adr_camera%,posob135&,aes_selected&,TRUE) IF ind! redraw_elem(adr_camera%,posob135&) ENDIF CASE 2240,7 ! 280 mm ob_state(adr_camera%,posob280&,aes_selected&,TRUE) IF ind! redraw_elem(adr_camera%,posob280&) ENDIF CASE 3200,8 ! 400 mm ob_state(adr_camera%,posob400&,aes_selected&,TRUE) IF ind! redraw_elem(adr_camera%,posob400&) ENDIF DEFAULT ! Autre : valeur de l'angle ob_state(adr_camera%,posobxxx&,aes_selected&,TRUE) IF ind! redraw_elem(adr_camera%,posobxxx&) ENDIF ENDSELECT angle=DEG(ATN(0.5/(focale&/400)))*2 CHAR{{OB_SPEC(adr_camera%,posobdeg&)}}=STR$(angle,7,3) ob_state(adr_camera%,camposob&,aes_disable&,TRUE) ob_state(adr_camera%,camvisob&,aes_disable&,TRUE) ob_state(adr_camera%,camfocob&,aes_disable&,TRUE) IF nombre_d_objets&>0 ob_state(adr_camera%,camposob&,aes_disable&,FALSE) ob_state(adr_camera%,camvisob&,aes_disable&,FALSE) ob_state(adr_camera%,camfocob&,aes_disable&,NOT BTST(BYTE{ADD(camera%,30)},7)) ENDIF IF ind! redraw_elem(adr_camera%,camfocac&) redraw_elem(adr_camera%,camposob&) redraw_elem(adr_camera%,camvisob&) redraw_elem(adr_camera%,camfocob&) redraw_elem(adr_camera%,posobdeg&) redraw_elem(adr_camera%,posper01&) redraw_elem(adr_camera%,posper02&) redraw_elem(adr_camera%,posper03&) redraw_elem(adr_camera%,posper04&) redraw_elem(adr_camera%,posper05&) redraw_elem(adr_camera%,posper06&) redraw_elem(adr_camera%,posper07&) redraw_elem(adr_camera%,postyp1&) redraw_elem(adr_camera%,postyp2&) redraw_elem(adr_camera%,postyp3&) redraw_elem(adr_camera%,postyp4&) redraw_elem(adr_camera%,possampl&) redraw_elem(adr_camera%,posapert&) redraw_elem(adr_camera%,posfocax&) redraw_elem(adr_camera%,posfocay&) redraw_elem(adr_camera%,posfocaz&) ENDIF RETURN ' ****************************************************************************** ' ********************** Gestion des objets du modeleur ************************ ' ****************************************************************************** > PROCEDURE passer_a_l_objet_suivant IF nombre_d_objets&>0 IF INT{ADD(hwind%,idx_modification_dbl&)}>-1 IF modif_faite! enregistrer_modification_objet(redimention!) ENDIF ENDIF objet_suivant calque_actif|=@calque_actif(@adresse_objet(objet_actif&)) mise_a_jour_de_l_objet_actif(TRUE) ~@wind_get(0,wf_top&,top&,temp&,temp&,temp&) temp&=@numero_fenetre(top&) IF temp&=24 IF centrage_auto! AND dessin_3d|<>vue_en_3d| redessin_deja_fait!=FALSE ENDIF redraw_force(24,24) ENDIF ENDIF RETURN > PROCEDURE passer_a_l_objet_precedent IF nombre_d_objets&>0 IF INT{ADD(hwind%,idx_modification_dbl&)}>-1 IF modif_faite! enregistrer_modification_objet(redimention!) ENDIF ENDIF objet_precedent calque_actif|=@calque_actif(@adresse_objet(objet_actif&)) mise_a_jour_de_l_objet_actif(TRUE) ~@wind_get(0,wf_top&,top&,temp&,temp&,temp&) temp&=@numero_fenetre(top&) IF temp&=24 IF centrage_auto! AND dessin_3d|<>vue_en_3d| redessin_deja_fait!=FALSE ENDIF redraw_force(24,24) ENDIF ENDIF RETURN > PROCEDURE changer_d_objet_actif(nou&) IF nou&<>objet_actif& IF modif_faite! enregistrer_modification_objet(redimention!) ENDIF objet_actif&=nou& calque_actif|=@calque_actif(@adresse_objet(objet_actif&)) lire_donnees(objet_actif&,px,py,pz,pw,ph,pf,rx,ry,rz,couleur_active&,blob) ecrire_donnees(objet_actif&,px,py,pz,pw,ph,pf,rx,ry,rz,blob) lire_nouvelles_donnees(a_px,a_py,a_pz,a_tx,a_ty,a_tz,a_rx,a_ry,a_rz,a_cou&,a_calq|,a_blob) mise_a_jour_de_l_objet_actif(TRUE) modif_normale!=FALSE modif_faite!=FALSE ENDIF RETURN > PROCEDURE changer_de_type_a_l_objet_actif(nou&) LOCAL numero&,i&,j&,fin_j&,num_ob& LOCAL univ%,univ2%,deps%,depd%,dept% LOCAL adr_p%,memor%,nu%,adr_po% LOCAL px,py,pz,blob LOCAL pw,ph,pf LOCAL rx,ry,rz ' univ%=@adresse_objet(objet_actif&) IF nou&<>INT{univ%} IF INT{univ%}=primitive_triangle& pour_triangle_active(univ%,px,py,pz,pw,ph,pf) SINGLE{ADD(univ%,2)}=px SINGLE{ADD(univ%,6)}=py SINGLE{ADD(univ%,10)}=pz SINGLE{ADD(univ%,14)}=pw SINGLE{ADD(univ%,18)}=ph SINGLE{ADD(univ%,22)}=pf SINGLE{ADD(univ%,26)}=0 SINGLE{ADD(univ%,30)}=0 SINGLE{ADD(univ%,34)}=0 CHAR{{OB_SPEC(adr_modifier%,trisomx1&)}}=STR$(ROUND(SINGLE{ADD(univ%,2)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomy1&)}}=STR$(ROUND(SINGLE{ADD(univ%,6)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomz1&)}}=STR$(ROUND(SINGLE{ADD(univ%,10)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomx2&)}}=STR$(ROUND(SINGLE{ADD(univ%,14)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomy2&)}}=STR$(ROUND(SINGLE{ADD(univ%,18)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomz2&)}}=STR$(ROUND(SINGLE{ADD(univ%,22)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomx3&)}}=STR$(ROUND(SINGLE{ADD(univ%,26)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomy3&)}}=STR$(ROUND(SINGLE{ADD(univ%,30)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomz3&)}}=STR$(ROUND(SINGLE{ADD(univ%,34)},3),10,3) ENDIF IF nou&=primitive_triangle& px=SINGLE{ADD(univ%,2)} py=SINGLE{ADD(univ%,6)} pz=SINGLE{ADD(univ%,10)} pw=SINGLE{ADD(univ%,14)} ph=SINGLE{ADD(univ%,18)} pf=SINGLE{ADD(univ%,22)} SINGLE{ADD(univ%,2)}=px-(pw/2) SINGLE{ADD(univ%,6)}=py-(ph/2) SINGLE{ADD(univ%,10)}=pz-(pf/2) SINGLE{ADD(univ%,14)}=px SINGLE{ADD(univ%,18)}=py+(ph/2) SINGLE{ADD(univ%,22)}=pz+(pf/2) SINGLE{ADD(univ%,26)}=px+(pw/2) SINGLE{ADD(univ%,30)}=py SINGLE{ADD(univ%,34)}=pz CHAR{{OB_SPEC(adr_modifier%,trisomx1&)}}=STR$(ROUND(SINGLE{ADD(univ%,2)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomy1&)}}=STR$(ROUND(SINGLE{ADD(univ%,6)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomz1&)}}=STR$(ROUND(SINGLE{ADD(univ%,10)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomx2&)}}=STR$(ROUND(SINGLE{ADD(univ%,14)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomy2&)}}=STR$(ROUND(SINGLE{ADD(univ%,18)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomz2&)}}=STR$(ROUND(SINGLE{ADD(univ%,22)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomx3&)}}=STR$(ROUND(SINGLE{ADD(univ%,26)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomy3&)}}=STR$(ROUND(SINGLE{ADD(univ%,30)},3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomz3&)}}=STR$(ROUND(SINGLE{ADD(univ%,34)},3),10,3) ENDIF IF nou&<>primitive_tronc_de_cone& BYTE{ADD(univ%,offset_drapeau0&)}=BCLR(BYTE{ADD(univ%,offset_drapeau0&)},bit_ouvert!) ENDIF IF BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_bicubic|) modif_bez!=TRUE afficher_les_points_bicubic(univ%,FALSE) recupere_les_points_bicubic(univ%) generation_de_bicubic ENDIF IF INT{univ%}>primitive_tore& ' L…, c'‚tait un objet FACETTE et on le transforme en PRIMITIVE ' Il faut donc lib‚rer la zone utilis‚e et d‚caler les num‚ro de ' primitive secondaire ' 1) effacer bit d'info -'objet facette' ou 'QUADRIC' ou 'QUADRIC'- BYTE{ADD(univ%,offset_drapeau0&)}=BCLR(BYTE{ADD(univ%,offset_drapeau0&)},bit_facette|) BYTE{ADD(univ%,offset_drapeau1&)}=BCLR(BYTE{ADD(univ%,offset_drapeau1&)},bit_quadric|) BYTE{ADD(univ%,offset_drapeau1&)}=BCLR(BYTE{ADD(univ%,offset_drapeau1&)},bit_quartic|) ' 2) lib‚rer la m‚moire utilis‚e par l'objet numero&=INT{univ%} libere(ADD(objet%,SHL(numero&,2))) ' d‚caler les autres primitives secondaires s'il y en a IF numero&numero& INT{univ2%}=PRED(INT{univ2%}) ENDIF INC i& LOOP WHILE i&numero& CARD{ADD(adr_p%,2)}=PRED(num_ob&) ENDIF ADD adr_p%,4 INC j& LOOP WHILE j&numero& CARD{adr_p%}=PRED(num_ob&) ENDIF BYTE{ADD(memor%,nu%)}=1 ENDIF ENDIF INC i& LOOP WHILE i&-1 ! Objet de C.S.G. num_ob&=objet_actif& objet_actif&=INT{ADD(univ%,offset_relation_csg&)} refaire_une_csg objet_actif&=num_ob& lire_donnees(objet_actif&,px,py,pz,pw,ph,pf,rx,ry,rz,couleur_active&,blob) ecrire_donnees(objet_actif&,px,py,pz,pw,ph,pf,rx,ry,rz,blob) redessin_modification refaire_toutes_les_normales(objet_actif&,objet_actif&,FALSE,FALSE) ELSE refaire_toutes_les_normales(objet_actif&,objet_actif&,FALSE,TRUE) ENDIF CHAR{{OB_SPEC(adr_modifier%,modtyp&)}}=@nom_objet$(nou&,TRUE) mise_a_jour_de_l_objet_actif(TRUE) redimention!=FALSE redessin_deja_fait!=FALSE tri_2d!=FALSE tri_fi!=FALSE tri_3d!=FALSE trace_3d_plein!=FALSE modif_normale!=FALSE modif_faite!=TRUE travail_a_sauver!=TRUE ENDIF RETURN > PROCEDURE mise_a_jour_de_l_objet_actif(ind!) LOCAL u%,fen_ouv! u%=@adresse_objet(objet_actif&) ' ******************************************** Fenˆtre "Modification d'objets" calque_actif|=@calque_actif(u%) lire_donnees(objet_actif&,px,py,pz,pw,ph,pf,rx,ry,rz,couleur_active&,blob) ecrire_donnees(objet_actif&,px,py,pz,pw,ph,pf,rx,ry,rz,blob) lire_nouvelles_donnees(a_px,a_py,a_pz,a_tx,a_ty,a_tz,a_rx,a_ry,a_rz,a_cou&,a_calq|,a_blob) IF INT{ADD(hwind%,idx_modification_dbl&)}>-1 AND ind! redessin_modification ENDIF ' ******************************************** Fenˆtre "Carreaux de B‚zier" IF INT{ADD(hwind%,idx_bicubic_dbl&)}>-1 IF BTST(BYTE{ADD(u%,offset_drapeau0&)},bit_bicubic|) afficher_les_points_bicubic(u%,TRUE) ENDIF ELSE fermeture_fenetre(idx_bicubic_dbl&) ENDIF ' ******************************************** Fenˆtre "Modification d'objets" IF defaut! bmove(defaut_interior%,annul_interior%,taille_interior&) ELSE bmove(@adresse_interior(objet_actif&),annul_interior%,taille_interior&) ENDIF fen_ouv!=(INT{ADD(hwind%,idx_vue_subjective_dbl&)}>-1) ' lire_interior(fen_ouv!) ' lire_media(fen_ouv!) ' lire_scattering(fen_ouv!) ' lire_density(fen_ouv!) ' ****************************************************** Fenˆtre de hi‚rarchie fen_ouv!=(INT{ADD(hwind%,idx_hierarchie_dbl&)}>-1) hierachie_ok!=FALSE IF fen_ouv! ouvrir_hierarchie ENDIF RETURN > PROCEDURE objet_suivant ! Passage au prochain objet valide IF objet_actif& PROCEDURE objet_precedent ! Passage … l'objet valide pr‚c‚dent IF objet_actif&>0 DEC objet_actif& ELSE objet_actif&=PRED(nombre_d_objets&) ENDIF IF BTST(BYTE{ADD(@adresse_objet(objet_actif&),offset_drapeau0&)},bit_masque|) ' Si le nouvel objet est masqu‚, on passe au pr‚c‚dent objet_precedent ENDIF IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(@adresse_objet(objet_actif&)),36)),35)}=0 ' ELSE ' Si le calque contenant l'objet est invisible on passe au pr‚c‚dent objet_precedent ENDIF RETURN ' ****************************************************************************** > PROCEDURE ecrire_donnees(num&,px,py,pz,pw,ph,pf,rx,ry,rz,blob) LOCAL univ%,typ&,adr_poi%,ob_spec%,univ2% LOCAL te_color&,smo! IF objets_a_deplacer&>0 objet_actif&=CARD{deplacement_multiple%} univ%=activation% CHAR{{OB_SPEC(adr_modifier%,modifnom&)}}="S‚lection Multiple " CHAR{{OB_SPEC(adr_modifier%,modnum&)}}=RIGHT$(" "+STR$(SUCC(objet_actif&)),5) ob_flags(adr_modifier%,souediri&,aes_hidetree&,TRUE) ob_state(adr_modifier%,nummod&,aes_disable&,TRUE) ob_state(adr_modifier%,typmod&,aes_disable&,TRUE) ob_state(adr_modifier%,modmoins&,aes_disable&,TRUE) ob_state(adr_modifier%,modplus&,aes_disable&,TRUE) ob_state(adr_modifier%,calqmodi&,aes_disable&,TRUE) ob_state(adr_modifier%,modifnom&,aes_disable&,TRUE) ob_state(adr_modifier%,modcoul&,aes_disable&,TRUE) ob_state(adr_modifier%,modbez&,aes_disable&,TRUE) ob_state(adr_modifier%,modcsg&,aes_disable&,TRUE) ob_state(adr_modifier%,modquart&,aes_disable&,TRUE) ob_state(adr_modifier%,modquadr&,aes_disable&,TRUE) ob_state(adr_modifier%,rapptext&,aes_disable&,TRUE) ob_state(adr_modifier%,rappcone&,aes_disable&,TRUE) ob_state(adr_modifier%,ouvert&,aes_disable&,TRUE) ob_state(adr_modifier%,ensmooth&,aes_disable&,TRUE) ob_state(adr_modifier%,encones&,aes_disable&,TRUE) ob_flags(adr_modifier%,modforbl&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modthrbl&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modtora1&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modtora2&,aes_hidetree&,TRUE) ELSE univ%=@adresse_objet(num&) ob_flags(adr_modifier%,souediri&,aes_hidetree&,FALSE) ob_state(adr_modifier%,nummod&,aes_disable&,FALSE) ob_state(adr_modifier%,typmod&,aes_disable&,FALSE) ob_state(adr_modifier%,modmoins&,aes_disable&,FALSE) ob_state(adr_modifier%,modplus&,aes_disable&,FALSE) ob_state(adr_modifier%,calqmodi&,aes_disable&,FALSE) ob_state(adr_modifier%,modifnom&,aes_disable&,FALSE) ob_state(adr_modifier%,modcoul&,aes_disable&,FALSE) ob_state(adr_modifier%,modbez&,aes_disable&,FALSE) ob_state(adr_modifier%,modcsg&,aes_disable&,FALSE) ob_state(adr_modifier%,modquart&,aes_disable&,FALSE) ob_state(adr_modifier%,modquadr&,aes_disable&,FALSE) ob_state(adr_modifier%,rapptext&,aes_disable&,FALSE) ob_state(adr_modifier%,rappcone&,aes_disable&,FALSE) ob_state(adr_modifier%,ouvert&,aes_disable&,FALSE) ob_state(adr_modifier%,ensmooth&,aes_disable&,FALSE) ob_state(adr_modifier%,encones&,aes_disable&,FALSE) ob_flags(adr_modifier%,modforbl&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modthrbl&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modtora1&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modtora2&,aes_hidetree&,FALSE) smo!=BTST(BYTE{ADD(univ%,offset_drapeau1&)},bit_smooth|) ! Facette ob_state(adr_modifier%,ensmooth&,aes_selected&,smo!) smo!=BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_in_out|) ! In Out ob_state(adr_modifier%,facinout&,aes_selected&,smo!) BYTE{ADD(ADD(univ%,offset_nom_objet&),21)}=0 IF CHAR{ADD(univ%,offset_nom_objet&)}<>"" CHAR{{OB_SPEC(adr_modifier%,modifnom&)}}=CHAR{ADD(univ%,offset_nom_objet&)} ELSE CHAR{{OB_SPEC(adr_modifier%,modifnom&)}}="SANS_NOM" ENDIF IF nombre_d_objets&=1 ob_state(adr_modifier%,modmoins&,aes_disable&,TRUE) ob_state(adr_modifier%,modplus&,aes_disable&,TRUE) ELSE ob_state(adr_modifier%,modmoins&,aes_disable&,FALSE) ob_state(adr_modifier%,modplus&,aes_disable&,FALSE) ENDIF IF couleur_active&<0 couleur_active&=BYTE{ADD(ADD(nom_calque%,MUL(calque_actif|,36)),34)} ENDIF ob_spec%=OB_SPEC(adr_modifier%,modcoul&) te_color&=INT{ADD(ob_spec%,18)} te_color&=te_color& AND -128 te_color&=te_color& OR 112 ! Trame pleine te_color&=te_color& OR couleur_active& ! Couleur de l'objet INT{ADD(ob_spec%,18)}=te_color& CHAR{{OB_SPEC(adr_modifier%,modcoul&)}}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(coul0&,couleur_active&))}} CHAR{{OB_SPEC(adr_modifier%,modnum&)}}=RIGHT$(" "+STR$(SUCC(num&)),5) CHAR{{OB_SPEC(adr_modifier%,modtyp&)}}=@nom_objet$(num&,FALSE) CHAR{{OB_SPEC(adr_modifier%,modicalq&)}}=STR$(SUCC(@calque_actif(univ%)),2) ENDIF IF INT{univ%}=primitive_triangle& CHAR{{OB_SPEC(adr_modifier%,trisomx1&)}}=STR$(ROUND(px,3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomy1&)}}=STR$(ROUND(py,3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomz1&)}}=STR$(ROUND(pz,3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomx2&)}}=STR$(ROUND(pw,3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomy2&)}}=STR$(ROUND(ph,3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomz2&)}}=STR$(ROUND(pf,3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomx3&)}}=STR$(ROUND(rx,3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomy3&)}}=STR$(ROUND(ry,3),10,3) CHAR{{OB_SPEC(adr_modifier%,trisomz3&)}}=STR$(ROUND(rz,3),10,3) ELSE CHAR{{OB_SPEC(adr_modifier%,modpx&)}}=STR$(ROUND(px,3),10,3) CHAR{{OB_SPEC(adr_modifier%,modpy&)}}=STR$(ROUND(py,3),10,3) CHAR{{OB_SPEC(adr_modifier%,modpz&)}}=STR$(ROUND(pz,3),10,3) CHAR{{OB_SPEC(adr_modifier%,modtx&)}}=STR$(ROUND(pw,3),9,3) CHAR{{OB_SPEC(adr_modifier%,modty&)}}=STR$(ROUND(ph,3),9,3) CHAR{{OB_SPEC(adr_modifier%,modtz&)}}=STR$(ROUND(pf,3),9,3) CHAR{{OB_SPEC(adr_modifier%,modrx&)}}=STR$(ROUND(rx,3),8,3) CHAR{{OB_SPEC(adr_modifier%,modry&)}}=STR$(ROUND(ry,3),8,3) CHAR{{OB_SPEC(adr_modifier%,modrz&)}}=STR$(ROUND(rz,3),8,3) ENDIF IF PRED(CARD{ADD(univ%,offset_pere&)})=-1 CHAR{{OB_SPEC(adr_modifier%,SUB(modipere&,2))}}="-1" ELSE CHAR{{OB_SPEC(adr_modifier%,SUB(modipere&,2))}}=STR$(CARD{ADD(univ%,offset_pere&)},3) ENDIF IF objets_a_deplacer&=0 IF INT{ADD(univ%,offset_csg_type&)}<0 ob_state(adr_modifier%,typmod&,aes_disable&,TRUE) IF INT{ADD(univ%,offset_csg_type&)}=-5 CHAR{{OB_SPEC(adr_modifier%,modthrbl&)}}=STR$(ROUND(blob,5),8,5) ENDIF ELSE ob_state(adr_modifier%,typmod&,aes_disable&,FALSE) ENDIF IF INT{ADD(univ%,offset_relation_csg&)}<>-1 univ2%=@adresse_objet(INT{ADD(univ%,offset_relation_csg&)}) IF INT{ADD(univ2%,offset_csg_type&)}=-5 CHAR{{OB_SPEC(adr_modifier%,modforbl&)}}=STR$(ROUND(blob,5),8,5) ENDIF ENDIF ENDIF RETURN > PROCEDURE lire_donnees(num&,VAR px,py,pz,pw,ph,pf,rx,ry,rz,c&,blob) LOCAL univ%,univ2%,cpt% IF objets_a_deplacer&>0 univ%=activation% ELSE univ%=@adresse_objet(num&) ENDIF px=SINGLE{ADD(univ%,2)} py=SINGLE{ADD(univ%,6)} pz=SINGLE{ADD(univ%,10)} pw=SINGLE{ADD(univ%,14)} ph=SINGLE{ADD(univ%,18)} pf=SINGLE{ADD(univ%,22)} rx=SINGLE{ADD(univ%,26)} ry=SINGLE{ADD(univ%,30)} rz=SINGLE{ADD(univ%,34)} IF objets_a_deplacer&=0 c&=INT{ADD(univ%,offset_couleur&)} CHAR{mem_nom%}=CHAR{{OB_SPEC(adr_modifier%,modifnom&)}} IF INT{univ%}<>primitive_triangle& IF pw<0 pw=1 ENDIF IF ph<0 ph=1 ENDIF IF pf<0 pf=1 ENDIF ENDIF ' Dans le cas ou l'on d‚tecte une C.S.G. ou un BLOB IF INT{ADD(univ%,offset_csg_type&)}<0 ob_state(adr_modifier%,typmod&,aes_disable&,TRUE) ' V‚rifions si c'est un BLOB et si oui, r‚cup‚rons le THRESHOLD IF INT{ADD(univ%,offset_csg_type&)}=-5 univ2%=@adresse_liste_csg(CARD{ADD(univ%,offset_force_blob&)}) cpt%=CARD{univ2%} ADD univ2%,2 ADD univ2%,SHL(cpt%,2) ADD univ2%,2 blob=ROUND(SINGLE{univ2%},5) ENDIF ELSE ob_state(adr_modifier%,typmod&,aes_disable&,FALSE) ENDIF ' Dans le cas ou l'objet appartient … une C.S.G. ou un blob IF INT{ADD(univ%,offset_relation_csg&)}<>-1 univ2%=@adresse_objet(INT{ADD(univ%,offset_relation_csg&)}) ' V‚rifions si c'est un BLOB et si oui, r‚cup‚rons la FORCE de l'objet IF INT{ADD(univ2%,offset_csg_type&)}=-5 blob=ROUND(SINGLE{ADD(univ%,offset_force_blob&)},3) ENDIF ENDIF ENDIF RETURN > PROCEDURE lire_nouvelles_donnees(VAR xx,yy,zz,xw,yh,zf,xr,yr,zr,cc&,clq|,bbll) LOCAL i& ' La position IF INT{@adresse_objet(objet_actif&)}=primitive_triangle& xx=VAL(CHAR{{OB_SPEC(adr_modifier%,trisomx1&)}}) yy=VAL(CHAR{{OB_SPEC(adr_modifier%,trisomy1&)}}) zz=VAL(CHAR{{OB_SPEC(adr_modifier%,trisomz1&)}}) xw=VAL(CHAR{{OB_SPEC(adr_modifier%,trisomx2&)}}) yh=VAL(CHAR{{OB_SPEC(adr_modifier%,trisomy2&)}}) zf=VAL(CHAR{{OB_SPEC(adr_modifier%,trisomz2&)}}) xr=VAL(CHAR{{OB_SPEC(adr_modifier%,trisomx3&)}}) yr=VAL(CHAR{{OB_SPEC(adr_modifier%,trisomy3&)}}) zr=VAL(CHAR{{OB_SPEC(adr_modifier%,trisomz3&)}}) ELSE xx=VAL(CHAR{{OB_SPEC(adr_modifier%,modpx&)}}) yy=VAL(CHAR{{OB_SPEC(adr_modifier%,modpy&)}}) zz=VAL(CHAR{{OB_SPEC(adr_modifier%,modpz&)}}) xw=VAL(CHAR{{OB_SPEC(adr_modifier%,modtx&)}}) yh=VAL(CHAR{{OB_SPEC(adr_modifier%,modty&)}}) zf=VAL(CHAR{{OB_SPEC(adr_modifier%,modtz&)}}) xr=VAL(CHAR{{OB_SPEC(adr_modifier%,modrx&)}}) MOD 360 yr=VAL(CHAR{{OB_SPEC(adr_modifier%,modry&)}}) MOD 360 zr=VAL(CHAR{{OB_SPEC(adr_modifier%,modrz&)}}) MOD 360 ENDIF IF objets_a_deplacer&=0 ' La couleur cc&=0 FOR i&=coul0& TO coul15& IF CHAR{{OB_SPEC(adr_popup_divers%,i&)}}=CHAR{{OB_SPEC(adr_modifier%,modcoul&)}} cc&=SUB(i&,coul0&) i&=coul15& ENDIF NEXT i& ' Le num‚ro de calque clq|=PRED(VAL(CHAR{{OB_SPEC(adr_modifier%,modicalq&)}})) IF NOT BTST(OB_FLAGS(adr_modifier%,modforbl&),aes_hidetree&) bbll=VAL(CHAR{{OB_SPEC(adr_modifier%,modforbl&)}}) ELSE IF NOT BTST(OB_FLAGS(adr_modifier%,modthrbl&),aes_hidetree&) bbll=VAL(CHAR{{OB_SPEC(adr_modifier%,modthrbl&)}}) ELSE bbll=0 ENDIF ENDIF RETURN > PROCEDURE enregistrer_modification_objet(ind!) LOCAL px,py,pz,tx,ty,tz,rx,ry,rz LOCAL adr_po%,adr_fac%,un_iv% LOCAL obj&,univ2%,refaire_csg! LOCAL disx,disy,disz,fin_po% ' un_iv%=@adresse_objet(objet_actif&) ' ****************************************************** Les nouvelles valeurs lire_nouvelles_donnees(px,py,pz,tx,ty,tz,rx,ry,rz,couleur_active&,calq|,blob) IF ((tx=0 AND ty=0) OR (tx=0 AND tz=0) OR (ty=0 AND tz=0)) AND INT{un_iv%}<>primitive_segment& AND INT{un_iv%}<>primitive_triangle& ~@afficher_alerte(adr_vide%) ELSE refaire_csg!=FALSE IF BTST(OB_STATE(adr_modifier%,ensmooth&),aes_selected&) BYTE{ADD(un_iv%,offset_drapeau1&)}=BSET(BYTE{ADD(un_iv%,offset_drapeau1&)},bit_smooth|) ELSE BYTE{ADD(un_iv%,offset_drapeau1&)}=BCLR(BYTE{ADD(un_iv%,offset_drapeau1&)},bit_smooth|) ENDIF IF ROUND(a_blob,5)<>ROUND(blob,5) SINGLE{ADD(un_iv%,offset_force_blob&)}=ROUND(blob,5) ENDIF IF a_calq|<>calq| BYTE{ADD(un_iv%,offset_calque&)}=calq| ENDIF IF ROUND(a_px,3)<>ROUND(px,3) OR ROUND(a_py,3)<>ROUND(py,3) OR ROUND(a_pz,3)<>ROUND(pz,3) SINGLE{ADD(un_iv%,2)}=px SINGLE{ADD(un_iv%,6)}=py SINGLE{ADD(un_iv%,10)}=pz refaire_csg!=TRUE ENDIF IF ROUND(a_tx,3)<>ROUND(tx,3) OR ROUND(a_ty,3)<>ROUND(ty,3) OR ROUND(a_tz,3)<>ROUND(tz,3) SINGLE{ADD(un_iv%,14)}=tx SINGLE{ADD(un_iv%,18)}=ty SINGLE{ADD(un_iv%,22)}=tz refaire_csg!=TRUE ENDIF IF ROUND(a_rx,3)<>ROUND(rx,3) OR ROUND(a_ry,3)<>ROUND(ry,3) OR ROUND(a_rz,3)<>ROUND(rz,3) SINGLE{ADD(un_iv%,26)}=rx SINGLE{ADD(un_iv%,30)}=ry SINGLE{ADD(un_iv%,34)}=rz refaire_csg!=TRUE ENDIF IF couleur_active&<>a_cou& INT{ADD(un_iv%,offset_couleur&)}=couleur_active& ENDIF IF CHAR{{OB_SPEC(adr_modifier%,modifnom&)}}<>"" CHAR{ADD(un_iv%,offset_nom_objet&)}=CHAR{{OB_SPEC(adr_modifier%,modifnom&)}} ELSE CHAR{ADD(un_iv%,offset_nom_objet&)}="SANS_NOM" ENDIF IF INT{un_iv%}=primitive_tronc_de_cone& OR INT{un_iv%}=primitive_boite_arrondie& OR INT{un_iv%}=primitive_disque& OR INT{un_iv%}=primitive_tore& OR INT{un_iv%}=primitive_boite& BYTE{ADD(un_iv%,offset_rapport&)}=VAL(CHAR{{OB_SPEC(adr_modifier%,rappcone&)}}) IF INT{un_iv%}=primitive_tore& IF VAL(CHAR{{OB_SPEC(adr_modifier%,modtora2&)}}) PROCEDURE test_enregistre_csg(un_iv%) LOCAL mob& IF INT{ADD(un_iv%,offset_relation_csg&)}<>-1 ' L…, nous avons l'objet d'une C.S.G. mob&=objet_actif& objet_actif&=INT{ADD(un_iv%,offset_relation_csg&)} refaire_une_csg objet_actif&=mob& ENDIF RETURN > PROCEDURE redessin_modification LOCAL redx&,redy&,redw&,redh& redraw_element_fenetre(6,adr_modifier%,nummod&) redraw_element_fenetre(6,adr_modifier%,modtyp&) redraw_element_fenetre(6,adr_modifier%,modmoins&) redraw_element_fenetre(6,adr_modifier%,modplus&) redraw_element_fenetre(6,adr_modifier%,modifnom&) IF INT{@adresse_objet(objet_actif&)}=primitive_triangle& redraw_element_fenetre(6,adr_modifier%,souediri&) ELSE objc_offset(adr_modifier%,souposob&,redx&,redy&) redw&=OB_W(adr_modifier%,souposob&) redh&=OB_H(adr_modifier%,souposob&) objc_draw(adr_modifier%,0,12,redx&,redy&,redw&,redh&,-1) ENDIF redraw_element_fenetre(6,adr_modifier%,ouvert&) redraw_element_fenetre(6,adr_modifier%,modcsg&) redraw_element_fenetre(6,adr_modifier%,typmod&) redraw_element_fenetre(6,adr_modifier%,modbez&) redraw_element_fenetre(6,adr_modifier%,modquart&) redraw_element_fenetre(6,adr_modifier%,modquadr&) redraw_element_fenetre(6,adr_modifier%,rapptext&) redraw_element_fenetre(6,adr_modifier%,rappcone&) redraw_element_fenetre(6,adr_modifier%,modcoul&) redraw_element_fenetre(6,adr_modifier%,calqmodi&) redraw_element_fenetre(6,adr_modifier%,encones&) redraw_element_fenetre(6,adr_modifier%,ensmooth&) redraw_element_fenetre(6,adr_modifier%,sousplus&) objc_offset(adr_modifier%,facinout&,redx&,redy&) DEC redx& DEC redy& redw&=ADD(OB_W(adr_modifier%,facinout&),2) redh&=ADD(OB_H(adr_modifier%,facinout&),2) redraw_element_fenetre(6,adr_modifier%,modipere&) objc_draw(adr_modifier%,0,12,redx&,redy&,redw&,redh&,-1) RETURN ' ****************** Gestion des couleurs ************************************** > PROCEDURE lire_les_sources(ind!) LOCAL acti!,spot!,surf!,obje!,cyli!,atmo!,atte!,shad!,inte! LOCAL cr|,cv|,cb|,rx&,ry&,rw&,rh&,c0 acti!=(BYTE{mem_src%}=1) spot!=BTST(BYTE{ADD(mem_src%,1)},bit_spot|) surf!=BTST(BYTE{ADD(mem_src%,1)},bit_surface|) obje!=BTST(BYTE{ADD(mem_src%,1)},bit_objet_lie|) cyli!=BTST(BYTE{ADD(mem_src%,1)},bit_cylindre|) atmo!=BTST(BYTE{ADD(mem_src%,1)},bit_attenuation|) shad!=BTST(BYTE{ADD(mem_src%,1)},bit_shadowless|) inte!=BTST(BYTE{ADD(mem_src%,1)},bit_atmosphere|) CHAR{{OB_SPEC(adr_lumieres%,nbrsour&)}}=STR$(SUCC(source_active&),4)+STR$(nombre_de_source&,4) CHAR{{OB_SPEC(adr_lumieres%,sourenx&)}}=STR$(SINGLE{ADD(mem_src%,8)},10,3) CHAR{{OB_SPEC(adr_lumieres%,soureny&)}}=STR$(SINGLE{ADD(mem_src%,12)},10,3) CHAR{{OB_SPEC(adr_lumieres%,sourenz&)}}=STR$(SINGLE{ADD(mem_src%,16)},10,3) CHAR{{OB_SPEC(adr_lumieres%,viseenx&)}}=STR$(SINGLE{ADD(mem_src%,20)},10,3) CHAR{{OB_SPEC(adr_lumieres%,viseeny&)}}=STR$(SINGLE{ADD(mem_src%,24)},10,3) CHAR{{OB_SPEC(adr_lumieres%,viseenz&)}}=STR$(SINGLE{ADD(mem_src%,28)},10,3) CHAR{{OB_SPEC(adr_lumieres%,surflarg&)}}=STR$(SINGLE{ADD(mem_src%,32)},10,3) CHAR{{OB_SPEC(adr_lumieres%,surflong&)}}=STR$(SINGLE{ADD(mem_src%,36)},10,3) CHAR{{OB_SPEC(adr_lumieres%,surfrotx&)}}=STR$(SINGLE{ADD(mem_src%,40)},7,2) CHAR{{OB_SPEC(adr_lumieres%,surfroty&)}}=STR$(SINGLE{ADD(mem_src%,44)},7,2) CHAR{{OB_SPEC(adr_lumieres%,radius&)}}=STR$(INT{ADD(mem_src%,48)},4) CHAR{{OB_SPEC(adr_lumieres%,falloff&)}}=STR$(INT{ADD(mem_src%,50)},4) CHAR{{OB_SPEC(adr_lumieres%,surfadap&)}}=STR$(BYTE{ADD(mem_src%,56)},3) CHAR{{OB_SPEC(adr_lumieres%,surdista&)}}=STR$(SINGLE{ADD(mem_src%,58)},10,3) ob_state(adr_lumieres%,posobjlu&,aes_disable&,TRUE) ob_state(adr_lumieres%,posvislu&,aes_disable&,TRUE) IF nombre_d_objets&>0 ob_state(adr_lumieres%,posobjlu&,aes_disable&,FALSE) ob_state(adr_lumieres%,posvislu&,aes_disable&,FALSE) ENDIF position_curseur_tightness(adr_lumieres%,peretigh&,filstigh&,INT{ADD(mem_src%,52)},FALSE) IF CHAR{ADD(mem_src%,62)}="" CHAR{{OB_SPEC(adr_lumieres%,nom_src&)}}="SOURCE_SANS_NOM" ELSE CHAR{{OB_SPEC(adr_lumieres%,nom_src&)}}=CHAR{ADD(mem_src%,62)} ENDIF ob_state(adr_lumieres%,soleil&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,projecte&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,surface&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,objelumi&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,nom_src&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,sourenx&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,soureny&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,sourenz&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,viseenx&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,viseeny&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,viseenz&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,surflarg&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,surflong&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,surfadap&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,surfjitt&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,surcylin&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,suratmos&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,surombre&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,surinter&,aes_disable&,NOT acti!) ob_state(adr_lumieres%,souscoul&,aes_disable&,NOT acti!) CHAR{{OB_SPEC(adr_lumieres%,txtetat&)}}=CHAR{OB_SPEC(adr_divers%,etatinac&)} ob_state(adr_lumieres%,surfjitt&,aes_selected&,FALSE) ob_state(adr_lumieres%,inclsour&,aes_disable&,TRUE) IF BYTE{ADD(mem_src%,7)}=1 ob_state(adr_lumieres%,surfjitt&,aes_selected&,TRUE) ENDIF IF acti! CHAR{{OB_SPEC(adr_lumieres%,txtetat&)}}=CHAR{OB_SPEC(adr_divers%,etatacti&)} ob_flags(adr_lumieres%,surflarg&,aes_editable&,surf!) ob_flags(adr_lumieres%,surflong&,aes_editable&,surf!) ob_flags(adr_lumieres%,surfadap&,aes_editable&,surf!) ob_state(adr_lumieres%,surflarg&,aes_disable&,NOT surf!) ob_state(adr_lumieres%,surflong&,aes_disable&,NOT surf!) ob_state(adr_lumieres%,surfadap&,aes_disable&,NOT surf!) ob_state(adr_lumieres%,surfjitt&,aes_disable&,NOT surf!) ob_state(adr_lumieres%,objelumi&,aes_disable&,FALSE) IF nombre_d_objets&=0 ob_state(adr_lumieres%,objelumi&,aes_disable&,TRUE) ELSE IF obje! IF INT{ADD(mem_src%,54)}>-1 IF nombre_d_objets&>0 ob_state(adr_lumieres%,inclsour&,aes_disable&,FALSE) ENDIF CHAR{{OB_SPEC(adr_lumieres%,sourincl&)}}=STR$(INT{ADD(mem_src%,54)},5) ELSE IF nombre_d_objets&>0 ob_state(adr_lumieres%,inclsour&,aes_disable&,FALSE) ENDIF CHAR{{OB_SPEC(adr_lumieres%,sourincl&)}}="....." ENDIF ENDIF ENDIF ob_state(adr_lumieres%,viseenx&,aes_editable&,spot!) ob_state(adr_lumieres%,viseeny&,aes_editable&,spot!) ob_state(adr_lumieres%,viseenz&,aes_editable&,spot!) ob_state(adr_lumieres%,viseenx&,aes_disable&,NOT spot!) ob_state(adr_lumieres%,viseeny&,aes_disable&,NOT spot!) ob_state(adr_lumieres%,viseenz&,aes_disable&,NOT spot!) ob_state(adr_lumieres%,radius&,aes_disable&,NOT spot!) ob_state(adr_lumieres%,falloff&,aes_disable&,NOT spot!) ob_state(adr_lumieres%,bfilstig&,aes_disable&,NOT spot!) IF nombre_d_objets&>0 ob_state(adr_lumieres%,posvislu&,aes_disable&,NOT spot!) ENDIF ' ob_state(adr_lumieres%,surcylin&,aes_selected&,cyli!) ob_state(adr_lumieres%,suratmos&,aes_selected&,atmo!) ob_state(adr_lumieres%,surfade1&,aes_disable&,NOT atmo!) ob_state(adr_lumieres%,surfade2&,aes_disable&,NOT atmo!) ob_state(adr_lumieres%,surdista&,aes_disable&,NOT atmo!) ob_state(adr_lumieres%,surombre&,aes_selected&,shad!) ob_state(adr_lumieres%,surinter&,aes_selected&,inte!) ENDIF IF ind! redraw_element_fenetre(12,adr_lumieres%,posobjlu&) redraw_element_fenetre(12,adr_lumieres%,posvislu&) redraw_element_fenetre(12,adr_lumieres%,nbrsour&) redraw_element_fenetre(12,adr_lumieres%,txtetat&) redraw_element_fenetre(12,adr_lumieres%,nom_src&) redraw_element_fenetre(12,adr_lumieres%,soleil&) redraw_element_fenetre(12,adr_lumieres%,projecte&) redraw_element_fenetre(12,adr_lumieres%,surface&) redraw_element_fenetre(12,adr_lumieres%,objelumi&) redraw_element_fenetre(12,adr_lumieres%,sourenx&) redraw_element_fenetre(12,adr_lumieres%,soureny&) redraw_element_fenetre(12,adr_lumieres%,sourenz&) redraw_element_fenetre(12,adr_lumieres%,viseenx&) redraw_element_fenetre(12,adr_lumieres%,viseeny&) redraw_element_fenetre(12,adr_lumieres%,viseenz&) redraw_element_fenetre(12,adr_lumieres%,surflarg&) redraw_element_fenetre(12,adr_lumieres%,surflong&) redraw_element_fenetre(12,adr_lumieres%,surfadap&) redraw_element_fenetre(12,adr_lumieres%,surfjitt&) redraw_element_fenetre(12,adr_lumieres%,surfrotx&) redraw_element_fenetre(12,adr_lumieres%,surfroty&) redraw_element_fenetre(12,adr_lumieres%,inclsour&) redraw_element_fenetre(12,adr_lumieres%,radius&) redraw_element_fenetre(12,adr_lumieres%,falloff&) redraw_element_fenetre(12,adr_lumieres%,PRED(peretigh&)) redraw_element_fenetre(12,adr_lumieres%,surcylin&) redraw_element_fenetre(12,adr_lumieres%,suratmos&) redraw_element_fenetre(12,adr_lumieres%,surombre&) redraw_element_fenetre(12,adr_lumieres%,surinter&) redraw_element_fenetre(12,adr_lumieres%,surfade1&) redraw_element_fenetre(12,adr_lumieres%,surfade2&) redraw_element_fenetre(12,adr_lumieres%,surdista&) redraw_element_fenetre(12,adr_lumieres%,souscoul&) IF acti! ' --------------------------------------- Couleur d'une source lumineuse cr|=BYTE{ADD(mem_src%,4)} cv|=BYTE{ADD(mem_src%,5)} cb|=BYTE{ADD(mem_src%,6)} objc_offset(adr_lumieres%,souscoul&,rx&,ry&) rw&=OB_W(adr_lumieres%,souscoul&) rh&=OB_H(adr_lumieres%,souscoul&) affichage_couleur_tc(rx&,ry&,rw&,rh&,cr|,cv|,cb|,rx&,ry&,rw&,rh&) ENDIF ENDIF RETURN > PROCEDURE lire_couleurs(adr_col%,ind!) LOCAL tex_col%,i&,tra& ob_flags(adr_predefinie%,PRED(ascetran&),aes_hidetree&,FALSE) tex_col%=CARD{adr_col%} IF tex_col%<0 OR tex_col%=>total_couleur& CARD{adr_col%}=0 tex_col%=0 ENDIF tra&=BYTE{ADD(adr_col%,5)} CHAR{{OB_SPEC(adr_predefinie%,ficcolor&)}}=@nom_texture$(include_couleur%,tex_col%) IF tex_col%>0 charger_zone_predefinie(tex_col%,ADD(adr_col%,2),1) ob_state(adr_predefinie%,modipred&,aes_disable&,FALSE) ob_state(adr_predefinie%,effapred&,aes_disable&,FALSE) ELSE ob_state(adr_predefinie%,modipred&,aes_disable&,TRUE) ob_state(adr_predefinie%,effapred&,aes_disable&,TRUE) ENDIF BYTE{ADD(adr_col%,5)}=tra& couleurs_definies(adr_col%,CARD{adr_col%},ind!) IF ind! redraw_elem(adr_predefinie%,ficcolor&) redraw_elem(adr_predefinie%,modipred&) redraw_elem(adr_predefinie%,effapred&) ENDIF RETURN ' *********************** Effacement d'objets ********************************* > PROCEDURE effacer_les_objets LOCAL num&,ef% hierachie_ok!=FALSE num&=PRED(nombre_d_objets&) DO ef%=ADD(effacement%,SHL(num&,1)) IF INT{ef%}=1 enleve_objet(num&) INT{ef%}=0 ENDIF DEC num& LOOP UNTIL num&<0 CLR debut_liste_csg&,debut_liste_eff& tri_3d!=FALSE trace_3d_plein!=FALSE tri_2d!=FALSE tri_fi!=FALSE redimention!=FALSE redessin_deja_fait!=FALSE IF objets_a_deplacer&>0 libere(*deplacement_multiple%) CLR objets_a_deplacer& calcul_selection_multiple!=FALSE ENDIF RETURN > PROCEDURE enleve_objet(num&) LOCAL univ%,nbo%,i&,i%,j%,j&,cpt&,deja!,adr_sr%,fin_s% LOCAL adr_poi%,ty&,numob&,copie_de_csg! LOCAL adr_fac%,obj&,univ2%,une_csg! LOCAL adr_effac% ! Adresse de l'objet … ‚ffacer LOCAL adr_derni% ! Adresse du dernier objet de la liste LOCAL adr_suiva% ! Adresse de l'objet suivant LOCAL taille_a_deplacer%,nouv_tail% LOCAL adr_p%,adr_f%,fin_i% LOCAL uni2%,tail_p%,tail_f%,nbp%,nbf% copie_de_csg!=FALSE ' adr_derni%=@adresse_objet(PRED(nombre_d_objets&)) adr_effac%=@adresse_objet(num&) ' ' ----- Type de l'objet et nombre de points pour l'effacement des edges ty&=INT{adr_effac%} ' une_csg!=FALSE IF INT{ADD(adr_effac%,offset_csg_type&)}<0 ' ************************************************************************ ' ** Effacement d'une C.S.G. ATTENTION, on n'efface pas les objets ** ' ** contenu dedans. Seulement l'objet C.S.G. ** ' ************************************************************************ ' Mais, avant tout, rechercher si cette CSG est plusieur fois en m‚moire. une_csg!=TRUE CLR j& i%=univers% fin_i%=@adresse_objet(nombre_d_objets&) DO IF j&<>num& IF INT{i%}=ty& copie_de_csg!=TRUE ENDIF ENDIF EXIT IF copie_de_csg! ADD i%,taille_objet& INC j& LOOP WHILE i%-1 ' ************************************************************************ ' ** Effacement d'un objet appartenant … une C.S.G. ** ' ** Sachant que l'on ne peut acc‚der aux objets que par la C.S.G cr‚‚ ** ' ** Il ne peut en aucun cas ˆtre question d'une copie de C.S.G. ** ' ************************************************************************ membfill(effacement%,SHL(limite_des_objets&,1),0) ' ' ------------------------------ Objet C.S.G. contenant l'objet … effacer uni2%=@adresse_objet(INT{ADD(adr_effac%,offset_relation_csg&)}) ' ' ------------------------------ Adresse de la liste des objets la composant adr_poi%=@adresse_liste_csg(CARD{ADD(uni2%,offset_force_blob&)}) ' ------------------------------ Nombre de composants de la C.S.G compteur_csg&=CARD{adr_poi%} ADD adr_poi%,2 CLR i& DO numob&=CARD{ADD(adr_poi%,2)} IF numob&<>num& CARD{ADD(effacement%,SHL(i&,1))}=numob& INC i& ENDIF ADD adr_poi%,4 LOOP WHILE i&12 AND (NOT copie_de_csg!) libere(@adresse_point(ty&)) DEC primitive& ENDIF ENDIF ELSE IF nombre_d_objets&=1 ! Tiens, y a plus rien dans la scŠne ~@nouvelle_scene(TRUE) ELSE ' vider_un_objet(num&) libere(ADD(edge%,SHL(num&,2))) ' ----------------------------------------------------------- Les normales i&=SUCC(num&) DO {ADD(edge%,SHL(PRED(i&),2))}={ADD(edge%,SHL(i&,2))} {ADD(edge%,SHL(i&,2))}=0 INC i& LOOP WHILE i&12 ' L…, ce n'est pas une primitive...donc : CSG, Objet facette...etc... IF une_csg! AND (NOT copie_de_csg!) ' C'est une CSG, qui n'est pas d‚j… utilis‚, on l'efface ' et on d‚cale toutes les suivantes libere(@adresse_point(ty&)) i&=SUCC(ty&) DO {ADD(objet%,SHL&(PRED(i&),2))}=@adresse_point(i&) @decalage_dans_csg(i&,num&,TRUE) INC i& LOOP WHILE i&0 ' ----------- Enfin, v‚rifions si il n'y a pas d'objet inclus dans une lampe ' ----------- Et si c'est le cas, d‚calons le num‚ro d'objet si besoin est. fin_s%=@adresse_source(nombre_de_source&) adr_sr%=source% DO IF INT{ADD(adr_sr%,54)}=SUCC(num&) INT{ADD(adr_sr%,54)}=-1 ELSE IF INT{ADD(adr_sr%,54)}>SUCC(num&) INT{ADD(adr_sr%,54)}=PRED(INT{ADD(adr_sr%,54)}) ENDIF ADD adr_sr%,taille_source& LOOP WHILE adr_sr% PROCEDURE decalage_dans_csg(ty&,num&,inn!) LOCAL i_%,fin_i_%,nbo_%,memor%,nu% LOCAL adr_poi_%,cpt& LOCAL num_ob& ' Bon, et bien, il faut parcourir toute les C.S.G. pour d‚caler ' les num‚ros d'indice de relation CSG lorsque qu'ils sont plus grand ' ou ‚gale au num‚ro effac‚ memor%=@prendre(nombre_de_csg%,TRUE,3) i_%=univers% fin_i_%=@adresse_objet(nombre_d_objets&) DO IF inn! IF INT{i_%}>ty& INT{i_%}=PRED(INT{i_%}) ENDIF ENDIF IF INT{ADD(i_%,offset_relation_csg&)}<>-1 ! Si dans une CSG num_ob&=INT{ADD(i_%,offset_relation_csg&)} ! CSG propri‚taire IF num_ob&>num& INT{ADD(i_%,offset_relation_csg&)}=PRED(num_ob&) ENDIF ENDIF IF INT{ADD(i_%,offset_csg_type&)}<0 ! C'est une CSG nu%=CARD{ADD(i_%,offset_force_blob&)} ' IF BYTE{ADD(memor%,nu%)}=0 adr_poi_%=@adresse_liste_csg(nu%) nbo_%=CARD{adr_poi_%} CLR cpt& ADD adr_poi_%,2 DO num_ob&=CARD{ADD(adr_poi_%,2)} IF num_ob&>num& CARD{ADD(adr_poi_%,2)}=PRED(num_ob&) ENDIF ADD adr_poi_%,4 INC cpt& LOOP WHILE cpt&num& CARD{adr_poi_%}=PRED(num_ob&) ENDIF BYTE{ADD(memor%,nu%)}=1 ENDIF ENDIF ADD i_%,taille_objet& LOOP WHILE i_% PROCEDURE vider_un_objet(nu&) LOCAL adr_int% ' IF defaut! membfill(texture_defaut%,taille_texture&,0) BYTE{ADD(texture_defaut%,2)}=24 membfill(pigment_defaut%,taille_pigment&,0) BYTE{ADD(pigment_defaut%,2)}=24 membfill(normal_defaut%,taille_normal&,0) BYTE{ADD(normal_defaut%,2)}=24 membfill(finish_defaut%,taille_finish&,0) membfill(interior_defaut%,taille_interior&,0) BYTE{ADD(interior_defaut%,48)}=BSET(BYTE{ADD(interior_defaut%,48)},5) BYTE{ADD(interior_defaut%,66)}=24 ELSE membfill(@adresse_texture(nu&),taille_texture&,0) BYTE{ADD(@adresse_texture(nu&),2)}=24 membfill(@adresse_pigment(nu&),taille_pigment&,0) BYTE{ADD(@adresse_pigment(nu&),2)}=24 membfill(@adresse_normal(nu&),taille_normal&,0) BYTE{ADD(@adresse_normal(nu&),2)}=24 membfill(@adresse_finish(nu&),taille_finish&,0) membfill(@adresse_interior(nu&),taille_interior&,0) BYTE{ADD(@adresse_interior(nu&),48)}=BSET(BYTE{ADD(@adresse_interior(nu&),48)},5) BYTE{ADD(@adresse_interior(nu&),66)}=24 ENDIF RETURN ' ****************************************************************************** > PROCEDURE demarquer_les_menus ' ---- D‚valider toutes les ic“nes 2D ob_state(adr_outils%,iface&,aes_selected&,FALSE) ob_state(adr_outils%,idroite&,aes_selected&,FALSE) ob_state(adr_outils%,ihaut&,aes_selected&,FALSE) ob_state(adr_outils%,idos&,aes_selected&,FALSE) ob_state(adr_outils%,igauche&,aes_selected&,FALSE) ob_state(adr_outils%,ibas&,aes_selected&,FALSE) ' ---- et les entr‚es menus correspondantes menu_icheck(adr_menu%,mface&,0) menu_icheck(adr_menu%,mdos&,0) menu_icheck(adr_menu%,mdroite&,0) menu_icheck(adr_menu%,mgauche&,0) menu_icheck(adr_menu%,mdessus&,0) menu_icheck(adr_menu%,mdessous&,0) ' ---- D‚valider toutes les ic“nes 3D ob_state(adr_outils%,ifil&,aes_selected&,FALSE) ob_state(adr_outils%,ifaces&,aes_selected&,FALSE) ob_state(adr_outils%,iplein&,aes_selected&,FALSE) ' ---- et les entr‚es menus correspondantes menu_icheck(adr_menu%,m3dfil&,0) menu_icheck(adr_menu%,m3dcache&,0) menu_icheck(adr_menu%,m3dlumi&,0) menu_icheck(adr_menu%,mgouraud&,0) menu_icheck(adr_menu%,mphong&,0) menu_icheck(adr_menu%,msubject&,0) ' ---- et pour finir, les ic“nes de la fenˆtre de vue. ob_state(adr_fenetre%,fenvue23&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_x&,aes_disable&,FALSE) ob_state(adr_fenetre%,fenlib_y&,aes_disable&,FALSE) ob_state(adr_fenetre%,fenlib_z&,aes_disable&,FALSE) ob_state(adr_fenetre%,fenlib_x&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_y&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_z&,aes_selected&,FALSE) RETURN > PROCEDURE marquer_les_menus IF trois_vue! ob_state(adr_outils%,iface&,aes_disable&,TRUE) ob_state(adr_outils%,idos&,aes_disable&,TRUE) ob_state(adr_outils%,igauche&,aes_disable&,TRUE) ob_state(adr_outils%,idroite&,aes_disable&,TRUE) ob_state(adr_outils%,ihaut&,aes_disable&,TRUE) ob_state(adr_outils%,ibas&,aes_disable&,TRUE) ob_state(adr_outils%,ifil&,aes_disable&,TRUE) ob_state(adr_outils%,ifaces&,aes_disable&,TRUE) ob_state(adr_popup_divers%,faces01&,aes_disable&,TRUE) ' menu_ienable(adr_menu%,mface&,0) menu_ienable(adr_menu%,mdos&,0) menu_ienable(adr_menu%,mdroite&,0) menu_ienable(adr_menu%,mgauche&,0) menu_ienable(adr_menu%,mdessus&,0) menu_ienable(adr_menu%,mdessous&,0) menu_ienable(adr_menu%,m3dfil&,0) menu_ienable(adr_menu%,m3dcache&,0) menu_ienable(adr_menu%,m3dlumi&,0) menu_ienable(adr_menu%,msubject&,0) ' ob_state(adr_fenetre%,fenvue23&,aes_selected&,TRUE) ob_state(adr_fenetre%,fenlib_x&,aes_selected&,liberte_x!) ob_state(adr_fenetre%,fenlib_y&,aes_selected&,liberte_y!) ob_state(adr_fenetre%,fenlib_z&,aes_selected&,liberte_z!) ELSE ob_state(adr_outils%,iface&,aes_disable&,FALSE) ob_state(adr_outils%,idos&,aes_disable&,FALSE) ob_state(adr_outils%,igauche&,aes_disable&,FALSE) ob_state(adr_outils%,idroite&,aes_disable&,FALSE) ob_state(adr_outils%,ihaut&,aes_disable&,FALSE) ob_state(adr_outils%,ibas&,aes_disable&,FALSE) ob_state(adr_outils%,ifil&,aes_disable&,FALSE) ob_state(adr_outils%,ifaces&,aes_disable&,FALSE) ob_state(adr_popup_divers%,faces01&,aes_disable&,FALSE) ' menu_ienable(adr_menu%,mface&,1) menu_ienable(adr_menu%,mdos&,1) menu_ienable(adr_menu%,mdroite&,1) menu_ienable(adr_menu%,mgauche&,1) menu_ienable(adr_menu%,mdessus&,1) menu_ienable(adr_menu%,mdessous&,1) menu_ienable(adr_menu%,m3dfil&,1) menu_ienable(adr_menu%,m3dcache&,1) menu_ienable(adr_menu%,m3dlumi&,1) menu_ienable(adr_menu%,msubject&,1) ' ob_state(adr_fenetre%,fenvue23&,aes_selected&,FALSE) ' $S|,$S> SELECT dessin_3d| CASE vue_de_face| menu_icheck(adr_menu%,mface&,1) ob_state(adr_outils%,iface&,aes_selected&,TRUE) ob_state(adr_outils%,ifil&,aes_selected&,FALSE) ob_state(adr_outils%,ifaces&,aes_selected&,FALSE) ob_state(adr_outils%,iplein&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_x&,aes_selected&,liberte_x!) ob_state(adr_fenetre%,fenlib_y&,aes_selected&,liberte_y!) ob_state(adr_fenetre%,fenlib_z&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_z&,aes_disable&,TRUE) CASE vue_de_dos| menu_icheck(adr_menu%,mdos&,1) ob_state(adr_outils%,idos&,aes_selected&,TRUE) ob_state(adr_outils%,ifil&,aes_selected&,FALSE) ob_state(adr_outils%,ifaces&,aes_selected&,FALSE) ob_state(adr_outils%,iplein&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_x&,aes_selected&,liberte_x!) ob_state(adr_fenetre%,fenlib_y&,aes_selected&,liberte_y!) ob_state(adr_fenetre%,fenlib_z&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_z&,aes_disable&,TRUE) CASE vue_de_gauche| menu_icheck(adr_menu%,mgauche&,1) ob_state(adr_outils%,igauche&,aes_selected&,TRUE) ob_state(adr_outils%,ifil&,aes_selected&,FALSE) ob_state(adr_outils%,ifaces&,aes_selected&,FALSE) ob_state(adr_outils%,iplein&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_x&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_y&,aes_selected&,liberte_y!) ob_state(adr_fenetre%,fenlib_z&,aes_selected&,liberte_z!) ob_state(adr_fenetre%,fenlib_x&,aes_disable&,TRUE) CASE vue_de_droite| menu_icheck(adr_menu%,mdroite&,1) ob_state(adr_outils%,idroite&,aes_selected&,TRUE) ob_state(adr_outils%,ifil&,aes_selected&,FALSE) ob_state(adr_outils%,ifaces&,aes_selected&,FALSE) ob_state(adr_outils%,iplein&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_x&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_y&,aes_selected&,liberte_y!) ob_state(adr_fenetre%,fenlib_z&,aes_selected&,liberte_z!) ob_state(adr_fenetre%,fenlib_x&,aes_disable&,TRUE) CASE vue_de_dessus| menu_icheck(adr_menu%,mdessus&,1) ob_state(adr_outils%,ihaut&,aes_selected&,TRUE) ob_state(adr_outils%,ifil&,aes_selected&,FALSE) ob_state(adr_outils%,ifaces&,aes_selected&,FALSE) ob_state(adr_outils%,iplein&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_x&,aes_selected&,liberte_x!) ob_state(adr_fenetre%,fenlib_y&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_z&,aes_selected&,liberte_z!) ob_state(adr_fenetre%,fenlib_y&,aes_disable&,TRUE) CASE vue_de_dessous| menu_icheck(adr_menu%,mdessous&,1) ob_state(adr_outils%,ibas&,aes_selected&,TRUE) ob_state(adr_outils%,ifil&,aes_selected&,FALSE) ob_state(adr_outils%,ifaces&,aes_selected&,FALSE) ob_state(adr_outils%,iplein&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_x&,aes_selected&,liberte_x!) ob_state(adr_fenetre%,fenlib_y&,aes_selected&,FALSE) ob_state(adr_fenetre%,fenlib_z&,aes_selected&,liberte_z!) ob_state(adr_fenetre%,fenlib_y&,aes_disable&,TRUE) CASE vue_en_3d| IF trait! AND face_pleine! menu_icheck(adr_menu%,m3dfil&,0) menu_icheck(adr_menu%,m3dcache&,0) menu_icheck(adr_menu%,m3dlumi&,1) ob_state(adr_outils%,ifil&,aes_selected&,FALSE) ob_state(adr_outils%,ifaces&,aes_selected&,FALSE) ob_state(adr_outils%,iplein&,aes_selected&,TRUE) ELSE IF trait! AND (NOT face_pleine!) menu_icheck(adr_menu%,m3dfil&,0) menu_icheck(adr_menu%,m3dcache&,1) menu_icheck(adr_menu%,m3dlumi&,0) ob_state(adr_outils%,ifil&,aes_selected&,FALSE) ob_state(adr_outils%,ifaces&,aes_selected&,TRUE) ob_state(adr_outils%,iplein&,aes_selected&,FALSE) ELSE IF (NOT trait!) AND (NOT face_pleine!) IF vue_subjective! menu_icheck(adr_menu%,m3dfil&,0) menu_icheck(adr_menu%,msubject&,1) ob_state(adr_outils%,ifil&,aes_selected&,FALSE) ELSE menu_icheck(adr_menu%,m3dfil&,1) menu_icheck(adr_menu%,msubject&,0) ob_state(adr_outils%,ifil&,aes_selected&,TRUE) ENDIF menu_icheck(adr_menu%,m3dcache&,0) menu_icheck(adr_menu%,m3dlumi&,0) ob_state(adr_outils%,iplein&,aes_selected&,FALSE) ob_state(adr_outils%,ifaces&,aes_selected&,FALSE) ENDIF ENDSELECT IF gouraud! menu_icheck(adr_menu%,mgouraud&,1) ELSE IF phong! menu_icheck(adr_menu%,mphong&,1) ENDIF IF nombre_d_objets&>0 scene_remplie ELSE scene_vide ENDIF ENDIF 2d_3d RETURN > PROCEDURE 2d_3d IF trois_vue! ' Tout laisser activable en 3 vues ob_state(adr_outils%,izmoins&,aes_disable&,FALSE) ob_state(adr_outils%,izplus&,aes_disable&,FALSE) ob_state(adr_outils%,izoom&,aes_disable&,FALSE) ob_state(adr_outils%,izsouris&,aes_disable&,FALSE) ob_state(adr_outils%,iztotal&,aes_disable&,FALSE) ob_state(adr_outils%,izcentre&,aes_disable&,FALSE) ' ob_state(adr_fenetre%,fenvue19&,aes_disable&,TRUE) ob_state(adr_fenetre%,fenvue20&,aes_disable&,TRUE) ob_state(adr_fenetre%,fenvue21&,aes_disable&,TRUE) ob_state(adr_fenetre%,fenvue22&,aes_disable&,TRUE) ELSE ' D‚sactiver le zoom si l'affichage est en 3D ob_state(adr_outils%,izmoins&,aes_disable&,dessin_3d|=vue_en_3d|) ob_state(adr_outils%,izplus&,aes_disable&,dessin_3d|=vue_en_3d|) ob_state(adr_outils%,izoom&,aes_disable&,dessin_3d|=vue_en_3d|) ob_state(adr_outils%,izsouris&,aes_disable&,dessin_3d|=vue_en_3d|) ob_state(adr_outils%,iztotal&,aes_disable&,dessin_3d|=vue_en_3d|) ob_state(adr_outils%,izcentre&,aes_disable&,dessin_3d|=vue_en_3d|) ' ob_state(adr_fenetre%,fenvue19&,aes_disable&,FALSE) ob_state(adr_fenetre%,fenvue20&,aes_disable&,FALSE) ob_state(adr_fenetre%,fenvue21&,aes_disable&,FALSE) ob_state(adr_fenetre%,fenvue22&,aes_disable&,FALSE) ' et d‚sactiver les ic“nes de contraintes d'axes IF dessin_3d|=vue_en_3d| ob_state(adr_fenetre%,fenlib_x&,aes_disable&,TRUE) ob_state(adr_fenetre%,fenlib_y&,aes_disable&,TRUE) ob_state(adr_fenetre%,fenlib_z&,aes_disable&,TRUE) ' ob_state(adr_fenetre%,fenvue19&,aes_disable&,TRUE) ob_state(adr_fenetre%,fenvue20&,aes_disable&,TRUE) ob_state(adr_fenetre%,fenvue21&,aes_disable&,TRUE) ob_state(adr_fenetre%,fenvue22&,aes_disable&,TRUE) ENDIF ENDIF RETURN > PROCEDURE scene_vide modifier_etat_des_icones(0) RETURN > PROCEDURE scene_remplie modifier_etat_des_icones(1) RETURN > PROCEDURE modifier_etat_des_icones(ind|) menu_ienable(adr_menu%,mnouvell&,ind|) menu_ienable(adr_menu%,msauvers&,ind|) menu_ienable(adr_menu%,msauvnom&,ind|) IF modules_d_importation&=0 menu_ienable(adr_menu%,m3d2&,0) ENDIF IF modules_outils&=0 ob_state(adr_outils%,iliste&,aes_disable&,TRUE) menu_ienable(adr_menu%,mimprime&,0) ELSE ob_state(adr_outils%,iliste&,aes_disable&,0) menu_ienable(adr_menu%,mimprime&,1) ENDIF menu_ienable(adr_menu%,mmodifie&,ind|) menu_ienable(adr_menu%,munion&,ind|) menu_ienable(adr_menu%,meffacer&,ind|) menu_ienable(adr_menu%,mcopier&,ind|) menu_ienable(adr_menu%,mmodtai&,ind|) menu_ienable(adr_menu%,mcaler&,ind|) menu_ienable(adr_menu%,mblobs&,ind|) menu_ienable(adr_menu%,manim&,ind|) menu_ienable(adr_menu%,mselmult&,ind|) menu_ienable(adr_menu%,mseltout&,ind|) ob_state(adr_outils%,isauver&,aes_disable&,ind|=0) IF modules_de_sauvegarde&=0 ob_state(adr_outils%,ispov&,aes_disable&,TRUE) menu_ienable(adr_menu%,msauverp&,0) ELSE ob_state(adr_outils%,ispov&,aes_disable&,ind|=0) menu_ienable(adr_menu%,msauverp&,ind|) ENDIF ob_state(adr_outils%,ireel&,aes_disable&,ind|=0) ob_state(adr_outils%,icsg&,aes_disable&,ind|=0) ob_state(adr_outils%,itaille&,aes_disable&,ind|=0) ob_state(adr_outils%,imodif&,aes_disable&,ind|=0) ob_state(adr_popup_divers%,fnc01&,aes_disable&,ind|=0) ob_state(adr_popup_divers%,SUCC(fnc01&),aes_disable&,ind|=0) ob_state(adr_popup_divers%,ADD(fnc01&,2),aes_disable&,ind|=0) IF (trois_vue!) ob_state(adr_outils%,ifil&,aes_disable&,TRUE) ob_state(adr_outils%,ifaces&,aes_disable&,TRUE) ELSE ob_state(adr_outils%,ifil&,aes_disable&,FALSE) ob_state(adr_outils%,ifaces&,aes_disable&,FALSE) ENDIF ob_state(adr_outils%,izsouris&,aes_disable&,ind|=0) ob_state(adr_outils%,iztotal&,aes_disable&,ind|=0) ob_state(adr_outils%,izcentre&,aes_disable&,ind|=0) ob_state(adr_fenetre%,fenhiera&,aes_disable&,ind|=0) RETURN ' ********************** Gestion des popups ************************************ > FUNCTION popup_general(lx&,ly&,adr_arb%,deb&,fin&,ad_f%) LOCAL ex&,ey&,ew&,eh&,pr_f& LOCAL x1&,y1&,x2&,y2&,gw&,gh& LOCAL px&,py&,pw&,ph&,x_f&,y_f&,apoi&,i&,sortie!,obj_& LOCAL temp% ' sortie!=FALSE form_center(adr_arb%,px&,py&,pw&,ph&) lx&=SHL(SHR(lx&,4),4) px&=lx& py&=ly& pw&=OB_W(adr_arb%,0) ph&=OB_H(adr_arb%,0) OB_X(adr_arb%,0)=lx& OB_Y(adr_arb%,0)=ly& form_dial(0,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' pr_f&=@wind_create(0,px&,py&,pw&,ph&) IF pr_f&>-1 wind_open(pr_f&,px&,py&,pw&,ph&) ENDIF ' IF deb&=sens1& objc_draw(adr_arb%,0,12,px&,py&,pw&,ph&,SUB(deb&,7)) ELSE objc_draw(adr_arb%,0,12,px&,py&,pw&,ph&,PRED(deb&)) ENDIF x_f&=PRED(ADD(px&,pw&)) IF x_f&>xmax& pw&=SUB(pw&,SUB(x_f&,xmax&)) ENDIF y_f&=PRED(ADD(py&,ph&)) IF y_f&>ymax& ph&=SUB(ph&,SUB(y_f&,ymax&)) ENDIF set_remplissage(2,8,noir&,-1) gw&=OB_W(adr_arb%,deb&) gh&=OB_H(adr_arb%,deb&) temp%=@prendre(MUL(MUL(SHR(gw&,3),gh&),plan_systeme&),FALSE,3) ' videsouris ' apoi&=-1 DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) obj_&=@objc_find(adr_arb%,0,7,global_mx&,global_my&) IF obj_&=>deb& AND obj_&<=fin& FOR i&=deb& TO fin& IF obj_&=i& AND (NOT BTST(OB_STATE(adr_arb%,obj_&),aes_disable&)) AND (NOT BTST(OB_FLAGS(adr_arb%,obj_&),aes_flags11|)) IF apoi&<>obj_& IF apoi&<>-1 objc_offset(adr_arb%,apoi&,ex&,ey&) ew&=OB_W(adr_arb%,apoi&) eh&=OB_H(adr_arb%,apoi&) graf_mouse(m_off&,0) clip_raster(temp%,gw&,gh&,plan_systeme&,0,0,0,0,0,0,ex&,ey&,ex&,ey&,ew&,eh&,3) graf_mouse(m_on&,0) ENDIF objc_offset(adr_arb%,obj_&,ex&,ey&) ew&=OB_W(adr_arb%,obj_&) eh&=OB_H(adr_arb%,obj_&) graf_mouse(m_off&,0) clip_raster(0,0,0,0,temp%,gw&,gh&,plan_systeme&,ex&,ey&,0,0,ex&,ey&,ew&,eh&,3) graf_mouse(m_on&,0) x1&=ex& y1&=ey& x2&=PRED(ADD(ex&,ew&)) y2&=PRED(ADD(ey&,eh&)) graf_mouse(m_off&,0) set_clipping_rectangle(1,px&,py&,PRED(ADD(px&,pw&)),PRED(ADD(py&,ph&)),0,0) set_type_de_ligne(noir&,1,1,0,0,-1) set_writing_mode(mode_remplace|) line(x1&,y1&,x2&,y1&) line(x1&,y1&,x1&,y2&) set_type_de_ligne(blanc&,1,1,0,0,-1) line(x2&,SUCC(y1&),x2&,y2&) line(x2&,y2&,SUCC(x1&),y2&) set_writing_mode(mode_xor|) pbox(SUCC(x1&),SUCC(y1&),PRED(x2&),PRED(y2&)) set_clipping_rectangle(0,px&,py&,PRED(ADD(px&,pw&)),PRED(ADD(py&,ph&)),0,0) graf_mouse(m_on&,0) apoi&=obj_& i&=fin& ENDIF ENDIF NEXT i& ENDIF IF global_mk&=1 AND obj_&=>deb& AND obj_&<=fin& FOR i&=deb& TO fin& IF obj_&=i& AND (NOT BTST(OB_STATE(adr_arb%,obj_&),aes_disable&)) sortie!=TRUE obj_&=SUB(i&,deb&) i&=fin& ENDIF NEXT i& videsouris ELSE IF global_mk&=1 AND (obj_&fin&) videsouris obj_&=255 sortie!=TRUE ELSE IF global_mk&=2 OR click&=2 videsouris obj_&=255 sortie!=TRUE ENDIF EXIT IF sortie! LOOP set_writing_mode(mode_remplace|) libere(*temp%) form_dial(3,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' videsouris ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' IF (ad_f%<>adr_hierarchie%) OR (obj_&=255) IF ad_f% objc_draw(ad_f%,0,12,px&,py&,ADD(pw&,4),ADD(ph&,4),-1) ELSE mettre_a_jour_les_redraws(px&,py&,ADD(pw&,4),ADD(ph&,4),FALSE) ENDIF ENDIF ' RETURN obj_& ENDFUNC > FUNCTION popup_de_choix(lx&,ly&,ad_f%) LOCAL px&,py&,pw&,ph&,apoi&,i&,sortie!,ex& LOCAL mvtx&,mvty&,pr_f& ' sortie!=FALSE form_center(adr_popup_autre0%,px&,py&,pw&,ph&) lx&=SHL(SHR(lx&,4),4) px&=lx& py&=ly& pw&=OB_W(adr_popup_autre0%,0) ph&=OB_H(adr_popup_autre0%,0) OB_X(adr_popup_autre0%,0)=lx& OB_Y(adr_popup_autre0%,0)=ly& form_dial(0,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' pr_f&=@wind_create(0,px&,py&,pw&,ph&) IF pr_f&>-1 wind_open(pr_f&,px&,py&,pw&,ph&) ENDIF ' ecrire_les_objets_popups(FALSE) i&=OB_H(adr_popup_autre0%,popcho01&) position_curseur_popup(adr_popup_autre0%,popchope&,popchoca&,debut_popup_choix&,nombre_d_objets&,FALSE) objc_draw(adr_popup_autre0%,0,12,px&,py&,pw&,ph&,-1) ' videsouris ' apoi&=-1 DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) ex&=@objc_find(adr_popup_autre0%,0,7,global_mx&,global_my&) IF ex&=>popcho01& AND ex&<=popcho10& FOR i&=popcho01& TO popcho10& IF ex&=i& AND (NOT BTST(OB_STATE(adr_popup_autre0%,ex&),aes_disable&)) AND (NOT BTST(OB_FLAGS(adr_popup_autre0%,ex&),aes_flags11|)) IF apoi&<>ex& IF apoi&<>-1 objc_change(adr_popup_autre0%,apoi&) ENDIF objc_change(adr_popup_autre0%,ex&) apoi&=ex& i&=popcho10& ENDIF ENDIF NEXT i& ELSE IF apoi&<>-1 objc_change(adr_popup_autre0%,apoi&) apoi&=-1 ENDIF ENDIF IF global_mk&=1 IF ex&=popchope& objc_offset(adr_popup_autre0%,popchoca&,mvtx&,mvty&) ADD debut_popup_choix&,10*(global_my&mvty&) debut_popup_choix&=-debut_popup_choix&*(debut_popup_choix&=>0 AND debut_popup_choix&<=SUB(nombre_d_objets&,10))+0*(debut_popup_choix&<0)-SUB(nombre_d_objets&,10)*(debut_popup_choix&>SUB(nombre_d_objets&,10)) position_curseur_popup(adr_popup_autre0%,popchope&,popchoca&,debut_popup_choix&,nombre_d_objets&,TRUE) ecrire_les_objets_popups(TRUE) ELSE IF ex&=bpopchoc& IF NOT (BTST(OB_STATE(adr_popup_autre0%,ex&),aes_disable&)) objc_change(adr_popup_autre0%,ex&) deplace_curseur_popup(adr_popup_autre0%,popchope&,popchoca&,0) objc_change(adr_popup_autre0%,ex&) videsouris ENDIF ELSE IF ex&=popchoha& IF NOT (BTST(OB_STATE(adr_popup_autre0%,ex&),aes_disable&)) IF debut_popup_choix&>0 objc_change(adr_popup_autre0%,ex&) DEC debut_popup_choix& scroll_bas_popup_general(TRUE,adr_popup_autre0%,debut_popup_choix&,0,nombre_d_objets&,10,souscurs&,popcho01&,popcho10&) position_curseur_popup(adr_popup_autre0%,popchope&,popchoca&,debut_popup_choix&,nombre_d_objets&,TRUE) ecrire_les_objets_popups(FALSE) objc_change(adr_popup_autre0%,ex&) ENDIF ENDIF ELSE IF ex&=popchoze& IF NOT (BTST(OB_STATE(adr_popup_autre0%,ex&),aes_disable&)) IF debut_popup_choix&>0 objc_change(adr_popup_autre0%,ex&) CLR debut_popup_choix& position_curseur_popup(adr_popup_autre0%,popchope&,popchoca&,debut_popup_choix&,nombre_d_objets&,TRUE) ecrire_les_objets_popups(TRUE) videsouris objc_change(adr_popup_autre0%,ex&) ENDIF ENDIF ELSE IF ex&=popchoba& IF NOT (BTST(OB_STATE(adr_popup_autre0%,ex&),aes_disable&)) IF debut_popup_choix&popcho01& AND ex&<=popcho10& FOR i&=popcho01& TO popcho10& IF ex&=i& AND (NOT BTST(OB_STATE(adr_popup_autre0%,ex&),aes_disable&)) sortie!=TRUE ex&=ADD(debut_popup_choix&,SUB(i&,popcho01&)) IF nombre_d_objets&<=10 CLR debut_popup_choix& ELSE IF ADD(ex&,10)-1 objc_change(adr_popup_autre0%,apoi&) ENDIF form_dial(3,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' videsouris ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' IF ad_f% objc_draw(ad_f%,0,12,px&,py&,ADD(pw&,4),ADD(ph&,4),-1) ELSE mettre_a_jour_les_redraws(px&,py&,ADD(pw&,4),ADD(ph&,4),FALSE) ENDIF ' RETURN ex& ENDFUNC > FUNCTION popup_choix_plusieurs(lx&,ly&) LOCAL px&,py&,pw&,ph&,apoi&,i&,sortie!,ex& LOCAL mvtx&,mvty&,pr_f& ' sortie!=FALSE form_center(adr_popup_autre0%,px&,py&,pw&,ph&) lx&=SHL(SHR(lx&,4),4) px&=lx& py&=ly& pw&=OB_W(adr_popup_autre0%,0) ph&=OB_H(adr_popup_autre0%,0) OB_X(adr_popup_autre0%,0)=lx& OB_Y(adr_popup_autre0%,0)=ly& form_dial(0,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' pr_f&=@wind_create(0,px&,py&,pw&,ph&) IF pr_f&>-1 wind_open(pr_f&,px&,py&,pw&,ph&) ENDIF ' ecrire_choix_plusieurs_objets(FALSE) i&=OB_H(adr_popup_autre0%,popcho01&) position_curseur_popup(adr_popup_autre0%,popchope&,popchoca&,debut_popup_plusieurs&,CARD{plusieurs%},FALSE) objc_draw(adr_popup_autre0%,0,12,px&,py&,pw&,ph&,-1) ' videsouris ' apoi&=-1 DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) ex&=@objc_find(adr_popup_autre0%,0,7,global_mx&,global_my&) IF ex&=>popcho01& AND ex&<=popcho10& FOR i&=popcho01& TO popcho10& IF ex&=i& AND (NOT BTST(OB_STATE(adr_popup_autre0%,ex&),aes_disable&)) AND (NOT BTST(OB_FLAGS(adr_popup_autre0%,ex&),aes_flags11|)) IF apoi&<>ex& IF apoi&<>-1 objc_change(adr_popup_autre0%,apoi&) ENDIF objc_change(adr_popup_autre0%,ex&) apoi&=ex& i&=popcho10& ENDIF ENDIF NEXT i& ELSE IF apoi&<>-1 objc_change(adr_popup_autre0%,apoi&) apoi&=-1 ENDIF ENDIF IF global_mk&=1 IF ex&=popchope& objc_offset(adr_popup_autre0%,popchoca&,mvtx&,mvty&) ADD debut_popup_plusieurs&,10*(global_my&mvty&) debut_popup_plusieurs&=-debut_popup_plusieurs&*(debut_popup_plusieurs&=>0 AND debut_popup_plusieurs&<=SUB(CARD{plusieurs%},10))+0*(debut_popup_plusieurs&<0)-SUB(CARD{plusieurs%},10)*(debut_popup_plusieurs&>SUB(CARD{plusieurs%},10)) position_curseur_popup(adr_popup_autre0%,popchope&,popchoca&,debut_popup_plusieurs&,CARD{plusieurs%},TRUE) ecrire_choix_plusieurs_objets(TRUE) ELSE IF ex&=bpopchoc& IF NOT (BTST(OB_STATE(adr_popup_autre0%,ex&),aes_disable&)) objc_change(adr_popup_autre0%,ex&) deplace_curseur_popup_plusieur(adr_popup_autre0%,popchope&,popchoca&) objc_change(adr_popup_autre0%,ex&) videsouris ENDIF ELSE IF ex&=popchoha& IF NOT (BTST(OB_STATE(adr_popup_autre0%,ex&),aes_disable&)) IF debut_popup_plusieurs&>0 objc_change(adr_popup_autre0%,ex&) DEC debut_popup_plusieurs& scroll_bas_popup_general(TRUE,adr_popup_autre0%,debut_popup_plusieurs&,0,CARD{plusieurs%},10,souscurs&,popcho01&,popcho10&) position_curseur_popup(adr_popup_autre0%,popchope&,popchoca&,debut_popup_plusieurs&,CARD{plusieurs%},TRUE) ecrire_choix_plusieurs_objets(FALSE) objc_change(adr_popup_autre0%,ex&) ENDIF ENDIF ELSE IF ex&=popchoze& IF NOT (BTST(OB_STATE(adr_popup_autre0%,ex&),aes_disable&)) IF debut_popup_plusieurs&>0 objc_change(adr_popup_autre0%,ex&) CLR debut_popup_plusieurs& position_curseur_popup(adr_popup_autre0%,popchope&,popchoca&,debut_popup_plusieurs&,CARD{plusieurs%},TRUE) ecrire_choix_plusieurs_objets(TRUE) videsouris objc_change(adr_popup_autre0%,ex&) ENDIF ENDIF ELSE IF ex&=popchoba& IF NOT (BTST(OB_STATE(adr_popup_autre0%,ex&),aes_disable&)) IF debut_popup_plusieurs&popcho01& AND ex&<=popcho10& FOR i&=popcho01& TO popcho10& IF ex&=i& AND (NOT BTST(OB_STATE(adr_popup_autre0%,ex&),aes_disable&)) sortie!=TRUE ex&=ADD(debut_popup_plusieurs&,SUB(i&,popcho01&)) IF CARD{plusieurs%}<=10 CLR debut_popup_plusieurs& ELSE IF ADD(ex&,10)-1 objc_change(adr_popup_autre0%,apoi&) ENDIF form_dial(3,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' videsouris ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' mettre_a_jour_les_redraws(global_xb&,global_yb&,global_wb&,global_hb&,FALSE) ' RETURN ex& ENDFUNC > FUNCTION popup_de_lumiere(lx&,ly&,ad_f%) LOCAL px&,py&,pw&,ph&,apoi&,i&,sortie!,ex& LOCAL mvtx&,mvty&,pr_f& ' sortie!=FALSE form_center(adr_popup_autre1%,px&,py&,pw&,ph&) lx&=SHL(SHR(lx&,4),4) px&=lx& py&=ly& pw&=OB_W(adr_popup_autre1%,0) ph&=OB_H(adr_popup_autre1%,0) OB_X(adr_popup_autre1%,0)=lx& OB_Y(adr_popup_autre1%,0)=ly& form_dial(0,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' pr_f&=@wind_create(0,px&,py&,pw&,ph&) IF pr_f& wind_open(pr_f&,px&,py&,pw&,ph&) ENDIF ' ecrire_les_sources_popups(FALSE) i&=OB_H(adr_popup_autre1%,popsour0&) position_curseur_popup(adr_popup_autre1%,sourpere&,sourfils&,debut_popup_lum&,nombre_de_source&,FALSE) objc_draw(adr_popup_autre1%,0,12,px&,py&,pw&,ph&,-1) ' videsouris ' apoi&=-1 DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) ex&=@objc_find(adr_popup_autre1%,0,7,global_mx&,global_my&) IF ex&=>popsour0& AND ex&<=popsour1& FOR i&=popsour0& TO popsour1& IF ex&=i& AND (NOT BTST(OB_STATE(adr_popup_autre1%,ex&),aes_disable&)) AND (NOT BTST(OB_FLAGS(adr_popup_autre1%,ex&),aes_flags11|)) IF apoi&<>ex& IF apoi&<>-1 objc_change(adr_popup_autre1%,apoi&) ENDIF objc_change(adr_popup_autre1%,ex&) apoi&=ex& i&=popsour1& ENDIF ENDIF NEXT i& ELSE IF apoi&<>-1 objc_change(adr_popup_autre1%,apoi&) apoi&=-1 ENDIF ENDIF IF global_mk&=1 IF ex&=sourpere& objc_offset(adr_popup_autre1%,sourfils&,mvtx&,mvty&) ADD debut_popup_lum&,10*(global_my&mvty&) debut_popup_lum&=-debut_popup_lum&*(debut_popup_lum&=>0 AND debut_popup_lum&<=SUB(nombre_de_source&,10))+0*(debut_popup_lum&<0)-SUB(nombre_de_source&,10)*(debut_popup_lum&>SUB(nombre_de_source&,10)) position_curseur_popup(adr_popup_autre1%,sourpere&,sourfils&,debut_popup_lum&,nombre_de_source&,TRUE) ecrire_les_sources_popups(TRUE) ELSE IF ex&=sourbfil& IF NOT (BTST(OB_STATE(adr_popup_autre1%,ex&),aes_disable&)) objc_change(adr_popup_autre1%,ex&) deplace_curseur_popup(adr_popup_autre1%,sourpere&,sourfils&,0) objc_change(adr_popup_autre1%,ex&) videsouris ENDIF ELSE IF ex&=sourhaut& IF NOT (BTST(OB_STATE(adr_popup_autre1%,ex&),aes_disable&)) IF debut_popup_lum&>0 objc_change(adr_popup_autre1%,ex&) DEC debut_popup_lum& scroll_bas_popup_general(TRUE,adr_popup_autre1%,debut_popup_lum&,0,nombre_de_source&,10,soursope&,popsour0&,popsour1&) position_curseur_popup(adr_popup_autre1%,sourpere&,sourfils&,debut_popup_lum&,nombre_de_source&,TRUE) ecrire_les_sources_popups(FALSE) objc_change(adr_popup_autre1%,ex&) ENDIF ENDIF ELSE IF ex&=sourzero& IF NOT (BTST(OB_STATE(adr_popup_autre1%,ex&),aes_disable&)) IF debut_popup_lum&>0 objc_change(adr_popup_autre1%,ex&) CLR debut_popup_lum& position_curseur_popup(adr_popup_autre1%,sourpere&,sourfils&,debut_popup_lum&,nombre_de_source&,TRUE) ecrire_les_sources_popups(TRUE) videsouris objc_change(adr_popup_autre1%,ex&) ENDIF ENDIF ELSE IF ex&=sourbas& IF NOT (BTST(OB_STATE(adr_popup_autre1%,ex&),aes_disable&)) IF debut_popup_lum&popsour0& AND ex&<=popsour1& FOR i&=popsour0& TO popsour1& IF ex&=i& AND (NOT BTST(OB_STATE(adr_popup_autre1%,ex&),aes_disable&)) sortie!=TRUE ex&=ADD(debut_popup_lum&,SUB(i&,popsour0&)) IF nombre_de_source&<=10 CLR debut_popup_lum& ELSE IF ADD(ex&,10)-1 objc_change(adr_popup_autre1%,apoi&) ENDIF form_dial(3,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' videsouris ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' IF ad_f% objc_draw(ad_f%,0,12,px&,py&,ADD(pw&,4),ADD(ph&,4),-1) ELSE mettre_a_jour_les_redraws(px&,py&,ADD(pw&,4),ADD(ph&,4),FALSE) ENDIF ' RETURN ex& ENDFUNC > FUNCTION popup_de_valeur(lx&,ly&,minimum&,maximum&,ad_f%) LOCAL px&,py&,pw&,ph&,apoi&,i&,sortie!,ex& LOCAL position&,pr_f& LOCAL mvtx&,mvty& ' sortie!=FALSE form_center(adr_popup_autre2%,px&,py&,pw&,ph&) lx&=SHL(SHR(lx&,4),4) px&=lx& py&=ly& pw&=OB_W(adr_popup_autre2%,0) ph&=OB_H(adr_popup_autre2%,0) OB_X(adr_popup_autre2%,0)=lx& OB_Y(adr_popup_autre2%,0)=ly& form_dial(0,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' pr_f&=@wind_create(0,px&,py&,pw&,ph&) IF pr_f&>-1 wind_open(pr_f&,px&,py&,pw&,ph&) ENDIF ' ecrire_les_valeur_popups(ind!,minimum&,maximum&) i&=OB_H(adr_popup_autre2%,popchoha&) IF minimum&<0 position&=ADD(debut_popup_valeur&,ROUND((maximum&-minimum&)/2)) ELSE position&=debut_popup_valeur& ENDIF position_curseur_popup_valeur(adr_popup_autre2%,valepere&,valefils&,position&,SUB(maximum&,minimum&),FALSE) objc_draw(adr_popup_autre2%,0,12,px&,py&,pw&,ph&,-1) ' videsouris ' apoi&=-1 DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) ex&=@objc_find(adr_popup_autre2%,0,7,global_mx&,global_my&) IF ex&=>valeur01& AND ex&<=valeur02& FOR i&=valeur01& TO valeur02& IF ex&=i& AND (NOT BTST(OB_STATE(adr_popup_autre2%,ex&),aes_disable&)) AND (NOT BTST(OB_FLAGS(adr_popup_autre2%,ex&),aes_flags11|)) IF apoi&<>ex& IF apoi&<>-1 objc_change(adr_popup_autre2%,apoi&) ENDIF objc_change(adr_popup_autre2%,ex&) apoi&=ex& i&=valeur02& ENDIF ENDIF NEXT i& ELSE IF apoi&<>-1 objc_change(adr_popup_autre2%,apoi&) apoi&=-1 ENDIF ENDIF IF global_mk&=1 IF ex&=valepere& objc_offset(adr_popup_autre2%,valefils&,mvtx&,mvty&) ADD debut_popup_valeur&,7*(global_my&mvty&) val&=-val&*(val&=>minimum& AND val&<=maximum&)+minimum&*(val&maximum&) IF minimum&<0 position&=ADD(debut_popup_valeur&,ROUND((maximum&-minimum&)/2)) ELSE position&=debut_popup_valeur& ENDIF position_curseur_popup_valeur(adr_popup_autre2%,valepere&,valefils&,position&,SUB(maximum&,minimum&),TRUE) ecrire_les_valeur_popups(TRUE,minimum&,maximum&) ELSE IF ex&=bvalefil& IF NOT (BTST(OB_STATE(adr_popup_autre2%,ex&),aes_disable&)) objc_change(adr_popup_autre2%,ex&) deplace_curseur_popup_valeur(adr_popup_autre2%,valepere&,valefils&,minimum&,maximum&) objc_change(adr_popup_autre2%,ex&) videsouris ENDIF ELSE IF ex&=valehaut& IF NOT (BTST(OB_STATE(adr_popup_autre2%,ex&),aes_disable&)) IF debut_popup_valeur&>minimum& objc_change(adr_popup_autre2%,ex&) DEC debut_popup_valeur& scroll_bas_popup_general(TRUE,adr_popup_autre2%,debut_popup_valeur&,minimum&,maximum&,8,valesous&,valeur01&,valeur02&) IF minimum&<0 position&=ADD(debut_popup_valeur&,ROUND((maximum&-minimum&)/2)) ELSE position&=debut_popup_valeur& ENDIF position_curseur_popup_valeur(adr_popup_autre2%,valepere&,valefils&,position&,SUB(maximum&,minimum&),FALSE) ecrire_les_valeur_popups(FALSE,minimum&,maximum&) objc_change(adr_popup_autre2%,ex&) ENDIF ENDIF ELSE IF ex&=valebas& IF NOT (BTST(OB_STATE(adr_popup_autre2%,ex&),aes_disable&)) IF debut_popup_valeur&valeur01& AND ex&<=valeur02& FOR i&=valeur01& TO valeur02& IF ex&=i& AND (NOT BTST(OB_STATE(adr_popup_autre2%,ex&),aes_disable&)) sortie!=TRUE ex&=ADD(debut_popup_valeur&,SUB(i&,valeur01&)) IF maximum&<=7 CLR debut_popup_valeur& ELSE IF ADD(ex&,7)-1 objc_change(adr_popup_autre2%,apoi&) ENDIF form_dial(3,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' videsouris ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' IF ad_f% objc_draw(ad_f%,0,12,px&,py&,ADD(pw&,4),ADD(ph&,4),-1) ELSE mettre_a_jour_les_redraws(px&,py&,ADD(pw&,4),ADD(ph&,4),FALSE) ENDIF ' RETURN ex& ENDFUNC > FUNCTION popup_parametre(lx&,ly&) LOCAL px&,py&,pw&,ph&,sortie!,ex& LOCAL pr_f& ' sortie!=FALSE form_center(adr_popup_parametres%,px&,py&,pw&,ph&) lx&=SHL(SHR(lx&,4),4) px&=lx& py&=ly& pw&=OB_W(adr_popup_parametres%,0) ph&=OB_H(adr_popup_parametres%,0) OB_X(adr_popup_parametres%,0)=lx& OB_Y(adr_popup_parametres%,0)=ly& form_dial(0,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' pr_f&=@wind_create(0,px&,py&,pw&,ph&) IF pr_f&>-1 wind_open(pr_f&,px&,py&,pw&,ph&) ENDIF objc_draw(adr_popup_parametres%,0,12,px&,py&,pw&,ph&,-1) ' videsouris ' DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) IF global_mk&=1 ex&=@objc_find(adr_popup_parametres%,0,7,global_mx&,global_my&) $S&,$S> SELECT ex& CASE ch100& IF BTST(OB_STATE(adr_popup_parametres%,ch255&),aes_selected&) ob_state(adr_popup_parametres%,ch100&,aes_selected&,TRUE) ob_state(adr_popup_parametres%,ch255&,aes_selected&,FALSE) mode_jauge!=FALSE redraw_elem(adr_popup_parametres%,ch100&) redraw_elem(adr_popup_parametres%,ch255&) ENDIF CASE ch255& IF BTST(OB_STATE(adr_popup_parametres%,ch100&),aes_selected&) ob_state(adr_popup_parametres%,ch100&,aes_selected&,FALSE) ob_state(adr_popup_parametres%,ch255&,aes_selected&,TRUE) mode_jauge!=TRUE redraw_elem(adr_popup_parametres%,ch100&) redraw_elem(adr_popup_parametres%,ch255&) ENDIF CASE primsimp& videsouris ob_state(adr_popup_parametres%,primsimp&,aes_selected&,NOT BTST(OB_STATE(adr_popup_parametres%,primsimp&),aes_selected&)) redraw_elem(adr_popup_parametres%,primsimp&) CASE pvise& videsouris point_vise_lie!=NOT point_vise_lie! ob_state(adr_popup_parametres%,pvise&,aes_selected&,point_vise_lie!) redraw_elem(adr_popup_parametres%,pvise&) CASE fondgris& IF NOT BTST(OB_STATE(adr_popup_parametres%,fondgris&),aes_disable&) videsouris fond_gris!=NOT fond_gris! ob_state(adr_popup_parametres%,fondgris&,aes_selected&,fond_gris!) redraw_elem(adr_popup_parametres%,fondgris&) ENDIF CASE bounding& videsouris texture_avant!=NOT texture_avant! ob_state(adr_popup_parametres%,bounding&,aes_selected&,texture_avant!) redraw_elem(adr_popup_parametres%,bounding&) CASE ecravirt& videsouris fond_img!=NOT fond_img! ob_state(adr_popup_parametres%,ecravirt&,aes_selected&,fond_img!) objc_draw(adr_popup_parametres%,0,12,px&,py&,pw&,ph&,-1) CASE palsyste& videsouris palette_ebmodel!=NOT palette_ebmodel! ob_state(adr_popup_parametres%,palsyste&,aes_selected&,palette_ebmodel!) redraw_elem(adr_popup_parametres%,palsyste&) CASE actiauto& videsouris filaire_cache!=NOT filaire_cache! ob_state(adr_popup_parametres%,actiauto&,aes_selected&,filaire_cache!) redraw_elem(adr_popup_parametres%,actiauto&) CASE rapide& videsouris dessin_rapide!=NOT dessin_rapide! ob_state(adr_popup_parametres%,rapide&,aes_selected&,dessin_rapide!) redraw_elem(adr_popup_parametres%,rapide&) tri_3d!=FALSE trace_3d_plein!=FALSE tri_2d!=FALSE tri_fi!=FALSE redimention!=FALSE redessin_deja_fait!=FALSE IF nombre_d_objets&>0 refaire_toutes_les_normales(0,PRED(nombre_d_objets&),TRUE,TRUE) ENDIF CASE backup& videsouris backup!=NOT backup! ob_state(adr_popup_parametres%,backup&,aes_selected&,backup!) redraw_elem(adr_popup_parametres%,backup&) CASE smooth& videsouris smooth!=NOT smooth! ob_state(adr_popup_parametres%,smooth&,aes_selected&,smooth!) redraw_elem(adr_popup_parametres%,smooth&) CASE creaauto& videsouris camera_visible!=NOT camera_visible! ob_state(adr_popup_parametres%,creaauto&,aes_selected&,camera_visible!) redraw_elem(adr_popup_parametres%,creaauto&) CASE carrvisi& videsouris carreaux_visible!=NOT carreaux_visible! ob_state(adr_popup_parametres%,carrvisi&,aes_selected&,carreaux_visible!) redraw_elem(adr_popup_parametres%,carrvisi&) CASE ctrlvisi& videsouris controle_visible!=NOT controle_visible! ob_state(adr_popup_parametres%,ctrlvisi&,aes_selected&,controle_visible!) redraw_elem(adr_popup_parametres%,ctrlvisi&) CASE okpoppar& objc_change(adr_popup_parametres%,ex&) videsouris objc_change(adr_popup_parametres%,ex&) sortie!=TRUE ENDSELECT ENDIF EXIT IF sortie! LOOP form_dial(3,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' videsouris ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' mettre_a_jour_les_redraws(px&,py&,ADD(pw&,4),ADD(ph&,4),FALSE) ' RETURN TRUE ENDFUNC > FUNCTION popup_chemin_include(lx&,ly&) LOCAL px&,py&,pw&,ph&,sortie!,ex& LOCAL pr_f& ' sortie!=FALSE form_center(adr_chemin_include%,px&,py&,pw&,ph&) lx&=SHL(SHR(lx&,4),4) px&=lx& py&=ly& pw&=OB_W(adr_chemin_include%,0) ph&=OB_H(adr_chemin_include%,0) OB_X(adr_chemin_include%,0)=lx& OB_Y(adr_chemin_include%,0)=ly& form_dial(0,px&,py&,pw&,ph&,px&,py&,pw&,ph&) ' pr_f&=@wind_create(0,px&,py&,pw&,ph&) IF pr_f&>-1 wind_open(pr_f&,px&,py&,pw&,ph&) ENDIF objc_draw(adr_chemin_include%,0,12,px&,py&,pw&,ph&,-1) ' videsouris ' DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) IF global_mk&=1 ex&=@objc_find(adr_chemin_include%,0,7,global_mx&,global_my&) $S&,$S> SELECT ex& CASE cheinca1&,cheinca2&,cheinca3&,cheinca4&,cheinca5&,cheinca6&,cheinca7&,cheinca8&,cheinca9& videsouris ob_state(adr_chemin_include%,ex&,aes_selected&,NOT BTST(OB_STATE(adr_chemin_include%,ex&),aes_seleted&)) redraw_elem(adr_chemin_include%,ex&) CASE cheinc1&,cheinc2&,cheinc3&,cheinc4&,cheinc5&,cheinc6&,cheinc7&,cheinc8&,cheinc9& objc_change(adr_chemin_include%,ex&) videsouris CHAR{masque%}="*"+CHR$(0) definition_fichier(adr_chemin_include%,ex&,nom_mouvement%,FALSE,TRUE,OB_SPEC(adr_divers%,lin9&)) CHAR{{OB_SPEC(adr_chemin_include%,ex&)}}=CHAR{disque%}+CHAR{path%}+"*.*" objc_change(adr_chemin_include%,ex&) $S&,$S> SELECT ex& CASE cheinc1& ob_state(adr_chemin_include%,cheinca1&,aes_selected&,TRUE) redraw_elem(adr_chemin_include%,cheinca1&) CASE cheinc2& ob_state(adr_chemin_include%,cheinca2&,aes_selected&,TRUE) redraw_elem(adr_chemin_include%,cheinca2&) CASE cheinc3& ob_state(adr_chemin_include%,cheinca3&,aes_selected&,TRUE) redraw_elem(adr_chemin_include%,cheinca3&) CASE cheinc4& ob_state(adr_chemin_include%,cheinca4&,aes_selected&,TRUE) redraw_elem(adr_chemin_include%,cheinca4&) CASE cheinc5& ob_state(adr_chemin_include%,cheinca5&,aes_selected&,TRUE) redraw_elem(adr_chemin_include%,cheinca5&) CASE cheinc6& ob_state(adr_chemin_include%,cheinca6&,aes_selected&,TRUE) redraw_elem(adr_chemin_include%,cheinca6&) CASE cheinc7& ob_state(adr_chemin_include%,cheinca7&,aes_selected&,TRUE) redraw_elem(adr_chemin_include%,cheinca7&) CASE cheinc8& ob_state(adr_chemin_include%,cheinca8&,aes_selected&,TRUE) redraw_elem(adr_chemin_include%,cheinca8&) CASE cheinc9& ob_state(adr_chemin_include%,cheinca9&,aes_selected&,TRUE) redraw_elem(adr_chemin_include%,cheinca9&) ENDSELECT objc_draw(adr_chemin_include%,0,12,px&,py&,pw&,ph&,-1) CASE annchein& objc_change(adr_chemin_include%,ex&) videsouris sortie!=TRUE objc_change(adr_chemin_include%,ex&) CASE valichin& objc_change(adr_chemin_include%,ex&) videsouris sortie!=TRUE objc_change(adr_chemin_include%,ex&) ENDSELECT ENDIF EXIT IF sortie! LOOP form_dial(3,px&,py&,pw&,ph&,px&,py&,pw&,ph&) ' videsouris ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' mettre_a_jour_les_redraws(px&,py&,ADD(pw&,2),ph&,FALSE) ' RETURN TRUE ENDFUNC > FUNCTION popup_de_couleur(lx&,ly&,ad_f%) LOCAL px&,py&,pw&,ph&,apoi&,i&,sortie!,ex& LOCAL mvtx&,mvty&,deb& LOCAL deb_loc&,tot_loc&,adr_l%,pr_f& ' sortie!=FALSE form_center(adr_popup_autre3%,px&,py&,pw&,ph&) lx&=SHL(SHR(lx&,4),4) px&=lx& py&=ly& pw&=OB_W(adr_popup_autre3%,0) ph&=OB_H(adr_popup_autre3%,0) OB_X(adr_popup_autre3%,0)=lx& OB_Y(adr_popup_autre3%,0)=ly& form_dial(0,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' pr_f&=@wind_create(0,px&,py&,pw&,ph&) IF pr_f&>-1 wind_open(pr_f&,px&,py&,pw&,ph&) ENDIF ' CLR deb_loc&,tot_loc&,adr_l% ' La liste des couleurs ' ABSOLUTE deb_loc&,*debut_couleur& ABSOLUTE tot_loc&,*total_couleur& ABSOLUTE adr_l%,*include_couleur% ' ecrire_les_include(FALSE,deb_loc&,tot_loc&,adr_l%) position_curseur_popup(adr_popup_autre3%,poptexpe&,poptexca&,deb_loc&,tot_loc&,FALSE) i&=OB_H(adr_popup_autre3%,poptex01&) objc_draw(adr_popup_autre3%,0,12,px&,py&,pw&,ph&,-1) ' videsouris ' apoi&=-1 DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) ex&=@objc_find(adr_popup_autre3%,0,7,global_mx&,global_my&) IF ex&=>poptex01& AND ex&<=poptex10& FOR i&=poptex01& TO poptex10& IF ex&=i& AND (NOT BTST(OB_STATE(adr_popup_autre3%,ex&),aes_disable&)) AND (NOT BTST(OB_FLAGS(adr_popup_autre3%,ex&),aes_flags11|)) IF apoi&<>ex& IF apoi&<>-1 objc_change(adr_popup_autre3%,apoi&) ENDIF objc_change(adr_popup_autre3%,ex&) apoi&=ex& i&=popcho10& ENDIF ENDIF NEXT i& ELSE IF apoi&<>-1 objc_change(adr_popup_autre3%,apoi&) apoi&=-1 ENDIF ENDIF IF global_mk&=1 IF ex&=poptexpe& IF NOT BTST(OB_STATE(adr_popup_autre3%,ex&),aes_disable&) objc_offset(adr_popup_autre3%,poptexca&,mvtx&,mvty&) ADD deb_loc&,10*(global_my&mvty&) deb_loc&=-deb_loc&*(deb_loc&=>0 AND deb_loc&<=SUB(tot_loc&,10))+0*(deb_loc&<0)-SUB(tot_loc&,10)*(deb_loc&>SUB(tot_loc&,10)) position_curseur_popup(adr_popup_autre3%,poptexpe&,poptexca&,deb_loc&,tot_loc&,TRUE) ecrire_les_include(TRUE,deb_loc&,tot_loc&,adr_l%) ENDIF ELSE IF ex&=bpoptexc& IF NOT BTST(OB_STATE(adr_popup_autre3%,ex&),aes_disable&) objc_change(adr_popup_autre3%,ex&) deplace_curseur_popup(adr_popup_autre3%,poptexpe&,poptexca&,1) objc_change(adr_popup_autre3%,ex&) videsouris ENDIF ELSE IF ex&=poptexha& IF NOT BTST(OB_STATE(adr_popup_autre3%,ex&),aes_disable&) IF deb_loc&>0 objc_change(adr_popup_autre3%,ex&) DEC deb_loc& scroll_bas_popup_general(TRUE,adr_popup_autre3%,deb_loc&,0,tot_loc&,10,soutexcr&,poptex01&,poptex10&) position_curseur_popup(adr_popup_autre3%,poptexpe&,poptexca&,deb_loc&,tot_loc&,TRUE) ecrire_les_include(TRUE,deb_loc&,tot_loc&,adr_l%) objc_change(adr_popup_autre3%,ex&) ENDIF ENDIF ELSE IF ex&=poptexze& IF NOT BTST(OB_STATE(adr_popup_autre3%,ex&),aes_disable&) IF deb_loc&>0 objc_change(adr_popup_autre3%,ex&) CLR deb_loc& position_curseur_popup(adr_popup_autre3%,poptexpe&,poptexca&,deb_loc&,tot_loc&,TRUE) ecrire_les_include(TRUE,deb_loc&,tot_loc&,adr_l%) videsouris objc_change(adr_popup_autre3%,ex&) ENDIF ENDIF ELSE IF ex&=poptexba& IF NOT BTST(OB_STATE(adr_popup_autre3%,ex&),aes_disable&) IF deb_loc&poptex01& AND ex&<=poptex10& IF NOT BTST(OB_STATE(adr_popup_autre3%,ex&),aes_disable&) FOR i&=poptex01& TO poptex10& IF ex&=i& AND (NOT BTST(OB_STATE(adr_popup_autre3%,ex&),aes_disable&)) sortie!=TRUE ex&=ADD(deb_loc&,SUB(i&,poptex01&)) IF tot_loc&<=10 CLR deb_loc& ELSE IF ADD(ex&,10)-1 objc_change(adr_popup_autre3%,apoi&) ENDIF form_dial(3,px&,py&,ADD(pw&,4),ADD(ph&,4),px&,py&,ADD(pw&,4),ADD(ph&,4)) ' videsouris ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' IF ad_f% objc_draw(ad_f%,0,12,px&,py&,ADD(pw&,4),ADD(ph&,4),-1) ELSE mettre_a_jour_les_redraws(px&,py&,ADD(pw&,4),ADD(ph&,4),FALSE) ENDIF ' RETURN ex& ENDFUNC ' ------------------------------------------------------------------------------ > PROCEDURE mise_en_place_popup(per&) ' Rendre invisible tous les popups pr‚sent ob_flags(adr_popup_divers%,chxprimi&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxfnct&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxcoul&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxcalqu&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxrendu&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxoutfi&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxtrace&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxhalde&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxhalty&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxmosai&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxbicub&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxstep&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxflatn&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxmarq&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxface&,aes_hidetree&,TRUE) ob_flags(adr_popup_divers%,chxancsc&,aes_hidetree&,TRUE) ' ' Rendre visible le pŠre d‚sir‚ ob_flags(adr_popup_divers%,per&,aes_hidetree&,FALSE) ' Le positionn‚ en haut … gauche OB_X(adr_popup_divers%,per&)=1 OB_Y(adr_popup_divers%,per&)=1 ' Redimensionner le dialogue … la taille du pŠre (+1 pour la pseudo 3D) OB_W(adr_popup_divers%,0)=SUCC(OB_W(adr_popup_divers%,per&)) OB_H(adr_popup_divers%,0)=SUCC(OB_H(adr_popup_divers%,per&)) RETURN > PROCEDURE positionner_popup(nu&,obj&,arb%,pop%,VAR rx&,ry&) LOCAL fx&,fy&,fw&,fh& IF nu&=-1 objc_offset(arb%,obj&,rx&,ry&) ADD rx&,16 objc_offset(arb%,0,fx&,fy&) fw&=OB_W(arb%,0) fh&=OB_H(arb%,0) ELSE IF nu&=-2 fx&=global_xb& fy&=global_yb& fw&=global_wb& fh&=global_hb& ELSE IF nu&=-3 objc_offset(arb%,obj&,rx&,ry&) ry&=ADD(ry&,OB_H(arb%,obj&)) objc_offset(arb%,0,fx&,fy&) rx&=fx& fw&=OB_W(arb%,0) fh&=OB_H(arb%,0) ELSE IF nu&=-4 rx&=SUB(global_mx&,SHR(OB_W(pop%,0),1)) ry&=SUB(global_my&,SHR(OB_H(pop%,0),1)) objc_offset(arb%,objet&,fx&,fy&) fw&=OB_W(arb%,objet&) fh&=OB_H(arb%,objet&) ELSE objc_offset(arb%,obj&,rx&,ry&) ADD rx&,16 ~@wind_get(INT{ADD(hwind%,nu&)},wf_workxywh&,fx&,fy&,fw&,fh&) ENDIF IF PRED(ADD(rx&,OB_W(pop%,0)))>PRED(ADD(fx&,fw&)) rx&=SUB(PRED(ADD(fx&,fw&)),OB_W(pop%,0)) ENDIF IF PRED(ADD(ry&,OB_H(pop%,0)))>PRED(ADD(fy&,fh&)) ry&=SUB(PRED(ADD(fy&,fh&)),OB_H(pop%,0)) ENDIF IF rx& PROCEDURE ecrire_les_include(ind!,deb_l&,tot_l&,ad_rl%) LOCAL i&,def_text& LOCAL limit& avant_les_scrolls(ind!,adr_popup_autre3%,deb_l&,0,tot_l&,10,soutexcr&,poptex01&,poptex10&,limit&) def_text&=deb_l& FOR i&=poptex01& TO poptex10& IF def_text& PROCEDURE ecrire_les_modules(ind!,adr_liste%,debut_liste&,limite_liste&) LOCAL tex_debs&,limit&,fin_n&,num& avant_les_scrolls(ind!,adr_modules%,debut_liste&,0,limite_liste&,10,drivsouc&,driv0&,driv2&,limit&) tex_debs&=driv0& fin_n&=ADD(debut_liste&,SUCC(limit&)) num&=debut_liste& DO ob_state(adr_modules%,tex_debs&,aes_disable&,FALSE) CHAR{{OB_SPEC(adr_modules%,tex_debs&)}}=CHAR{ADD(adr_liste%,MUL(num&,10))} INC tex_debs& INC num& LOOP WHILE num& PROCEDURE ecrire_les_objets_effacer(ind!) LOCAL tex_debs&,choix&,num& LOCAL limit&,fin_n& avant_les_scrolls(ind!,adr_fonctions%,debut_liste_eff&,0,nombre_d_objets&,17,sousfnct&,lte01&,lte02&,limit&) tex_debs&=lte01& fin_n&=ADD(debut_liste_eff&,limit&) num&=debut_liste_eff& DO ob_state(adr_fonctions%,tex_debs&,aes_disable&,FALSE) BYTE{ADD(ADD(@adresse_objet(num&),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(num&),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_fonctions%,tex_debs&)}}=STR$(SUCC(num&),3)+LEFT$(CHAR{ADD(@adresse_objet(num&),offset_nom_objet&)},22) ELSE choix&=INT{@adresse_objet(num&)} CHAR{{OB_SPEC(adr_fonctions%,tex_debs&)}}=STR$(SUCC(num&),3)+@nom_objet$(choix&,TRUE) ENDIF ob_state(adr_fonctions%,tex_debs&,aes_selected&,FALSE) IF INT{ADD(effacement%,SHL(num&,1))}=1 ob_state(adr_fonctions%,tex_debs&,aes_selected&,TRUE) ENDIF IF INT{ADD(effacement%,SHL(num&,1))}=2 ob_state(adr_fonctions%,tex_debs&,aes_disable&,TRUE) ELSE ob_state(adr_fonctions%,tex_debs&,aes_disable&,FALSE) ENDIF INC tex_debs& INC num& LOOP WHILE num&<=fin_n& IF limit&<16 num&=SUCC(limit&) DO ob_state(adr_fonctions%,tex_debs&,aes_selected&,FALSE) ob_state(adr_fonctions%,tex_debs&,aes_disable&,TRUE) CHAR{{OB_SPEC(adr_fonctions%,tex_debs&)}}=STRING$(25,".") INC tex_debs& INC num& LOOP WHILE num&<17 ENDIF IF ind! redraw_elem(adr_fonctions%,souslist&) ENDIF RETURN > PROCEDURE ecrire_les_objets_fonction(ind!) LOCAL tex_debs&,choix&,fin_n&,num& LOCAL limit&,position_dans_csg& avant_les_scrolls(ind!,adr_fonctions%,debut_liste_csg&,0,nombre_d_objets&,17,sousfnct&,fnct01&,fnct02&,limit&) tex_debs&=fnct01& fin_n&=ADD(debut_liste_csg&,limit&) num&=debut_liste_csg& DO ob_state(adr_fonctions%,tex_debs&,aes_disable&,FALSE) position_dans_csg&=@dans_csg(num&) membfill(mfdb%,4,0) IF position_dans_csg&>-1 CHAR{mfdb%}=STR$(position_dans_csg&,3) ob_state(adr_fonctions%,tex_debs&,aes_selected&,TRUE) ELSE CHAR{mfdb%}=" " ob_state(adr_fonctions%,tex_debs&,aes_selected&,FALSE) ENDIF BYTE{ADD(ADD(@adresse_objet(num&),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(num&),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_fonctions%,tex_debs&)}}=CHAR{mfdb%}+STR$(SUCC(num&),3)+LEFT$(CHAR{ADD(@adresse_objet(num&),offset_nom_objet&)},22) ELSE choix&=INT{@adresse_objet(num&)} CHAR{{OB_SPEC(adr_fonctions%,tex_debs&)}}=CHAR{mfdb%}+STR$(SUCC(num&),3)+@nom_objet$(choix&,TRUE) ENDIF INC tex_debs& INC num& LOOP WHILE num&<=fin_n& IF limit&<16 num&=SUCC(limit&) DO ob_state(adr_fonctions%,tex_debs&,aes_selected&,FALSE) ob_state(adr_fonctions%,tex_debs&,aes_disable&,TRUE) CHAR{{OB_SPEC(adr_fonctions%,tex_debs&)}}=STRING$(28,".") INC tex_debs& INC num& LOOP WHILE num&<17 ENDIF IF ind! redraw_elem(adr_fonctions%,soustout&) ENDIF RETURN > PROCEDURE ecrire_les_objets_popups(ind!) LOCAL tex_debs&,limit&,choix&,fin_n&,num& avant_les_scrolls(ind!,adr_popup_autre0%,debut_popup_choix&,0,nombre_d_objets&,10,souscurs&,popcho01&,popcho10&,limit&) tex_debs&=popcho01& fin_n&=ADD(debut_popup_choix&,limit&) num&=debut_popup_choix& DO ob_state(adr_popup_autre0%,tex_debs&,aes_disable&,FALSE) BYTE{ADD(ADD(@adresse_objet(num&),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(num&),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_popup_autre0%,tex_debs&)}}=STR$(SUCC(num&),3)+LEFT$(CHAR{ADD(@adresse_objet(num&),offset_nom_objet&)},22) ELSE choix&=INT{@adresse_objet(num&)} CHAR{{OB_SPEC(adr_popup_autre0%,tex_debs&)}}=STR$(SUCC(num&),3)+@nom_objet$(choix&,TRUE) ENDIF IF BTST(BYTE{ADD(@adresse_objet(num&),offset_drapeau0&)},bit_masque|) AND INT{ADD(@adresse_objet(num&),offset_relation_csg&)}=-1 ' Si l'objet est masqu‚ et pas dans une CSG, on le grise dans la liste ob_state(adr_popup_autre0%,tex_debs&,aes_disable&,TRUE) ELSE IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(@adresse_objet(num&)),36)),35)}=0 ' Si le calque de l'objet est invisible on le grise dans la liste ob_state(adr_popup_autre0%,tex_debs&,aes_disable&,TRUE) ENDIF INC tex_debs& INC num& LOOP WHILE num&<=fin_n& IF limit&<9 num&=SUCC(limit&) DO ob_state(adr_popup_autre0%,tex_debs&,aes_disable&,TRUE) CHAR{{OB_SPEC(adr_popup_autre0%,tex_debs&)}}=STRING$(25,".") INC tex_debs& INC num& LOOP WHILE num&<10 ENDIF IF ind! redraw_elem(adr_popup_autre0%,souspopc&) ENDIF RETURN > PROCEDURE ecrire_les_sources_popups(ind!) LOCAL tex_debs&,limit&,choix&,fin_n& LOCAL adr_sr%,num& avant_les_scrolls(ind!,adr_popup_autre1%,debut_popup_lum&,0,nombre_de_source&,10,soursope&,popsour0&,popsour1&,limit&) tex_debs&=popsour0& fin_n&=ADD(debut_popup_lum&,limit&) num&=debut_popup_lum& adr_sr%=@adresse_source(num&) DO ob_state(adr_popup_autre1%,tex_debs&,aes_disable&,FALSE) IF BYTE{adr_sr%}=1 CHAR{{OB_SPEC(adr_popup_autre1%,tex_debs&)}}=STR$(SUCC(num&),4)+CHAR{OB_SPEC(adr_divers%,acti&)} ELSE CHAR{{OB_SPEC(adr_popup_autre1%,tex_debs&)}}=STR$(SUCC(num&),4)+CHAR{OB_SPEC(adr_divers%,inacti&)} ENDIF ADD adr_sr%,taille_source& INC tex_debs& INC num& LOOP WHILE num&<=fin_n& IF limit&<9 num&=SUCC(limit&) DO ob_state(adr_popup_autre1%,tex_debs&,aes_disable&,TRUE) CHAR{{OB_SPEC(adr_popup_autre1%,tex_debs&)}}=STR$(SUCC(num&),3)+STRING$(8,".") INC tex_debs& INC num& LOOP WHILE num&<10 ENDIF IF ind! redraw_elem(adr_popup_autre1%,soursous&) ENDIF RETURN > PROCEDURE ecrire_les_valeur_popups(ind!,minimum&,maximum&) LOCAL tex_debs&,fin_n&,num& ob_state(adr_popup_autre2%,valehaut&,aes_disable&,NOT (debut_popup_valeur&>minimum&)) ob_state(adr_popup_autre2%,valebas&,aes_disable&,NOT (ADD(debut_popup_valeur&,7) PROCEDURE ecrire_choix_plusieurs_objets(ind!) LOCAL tex_debs&,limit&,choix&,fin_n&,num&,cp& avant_les_scrolls(ind!,adr_popup_autre0%,debut_popup_plusieurs&,0,CARD{plusieurs%},10,souscurs&,popcho01&,popcho10&,limit&) tex_debs&=popcho01& fin_n&=ADD(debut_popup_plusieurs&,limit&) num&=debut_popup_plusieurs& DO cp&=CARD{ADD(ADD(plusieurs%,2),SHL(num&,1))} ob_state(adr_popup_autre0%,tex_debs&,aes_disable&,FALSE) BYTE{ADD(ADD(@adresse_objet(cp&),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(cp&),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_popup_autre0%,tex_debs&)}}=STR$(SUCC(cp&),3)+LEFT$(CHAR{ADD(@adresse_objet(cp&),offset_nom_objet&)},22) ELSE choix&=INT{@adresse_objet(cp&)} CHAR{{OB_SPEC(adr_popup_autre0%,tex_debs&)}}=STR$(SUCC(cp&),3)+@nom_objet$(choix&,TRUE) ENDIF IF BTST(BYTE{ADD(@adresse_objet(cp&),offset_drapeau0&)},bit_masque|) AND INT{ADD(@adresse_objet(cp&),offset_relation_csg&)}=-1 ' Si l'objet est masqu‚ et pas dans une CSG, on le grise dans la liste ob_state(adr_popup_autre0%,tex_debs&,aes_disable&,TRUE) ELSE IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(@adresse_objet(cp&)),36)),35)}=0 ' Si le calque de l'objet est invisible on le grise dans la liste ob_state(adr_popup_autre0%,tex_debs&,aes_disable&,TRUE) ENDIF INC tex_debs& INC num& LOOP WHILE num&<=fin_n& IF limit&<9 num&=SUCC(limit&) DO ob_state(adr_popup_autre0%,tex_debs&,aes_disable&,TRUE) CHAR{{OB_SPEC(adr_popup_autre0%,tex_debs&)}}=STRING$(25,".") INC tex_debs& INC num& LOOP WHILE num&<10 ENDIF IF ind! redraw_elem(adr_popup_autre0%,souspopc&) ENDIF RETURN > PROCEDURE avant_les_scrolls(ind!,adr_arb%,cpt&,min&,max&,nbo&,sou&,v1&,v2&,VAR limit&) IF adr_arb%=adr_popup_autre0% IF max&>nbo& ob_state(adr_arb%,popchoze&,aes_disable&,NOT (cpt&>min&)) ob_state(adr_arb%,popchoha&,aes_disable&,NOT (cpt&>min&)) ob_state(adr_arb%,popchoba&,aes_disable&,NOT (ADD(cpt&,nbo&)nbo& ob_state(adr_arb%,sourzero&,aes_disable&,NOT (cpt&>min&)) ob_state(adr_arb%,sourhaut&,aes_disable&,NOT (cpt&>min&)) ob_state(adr_arb%,sourbas&,aes_disable&,NOT (ADD(cpt&,nbo&)min&)) ob_state(adr_arb%,valebas&,aes_disable&,NOT (ADD(cpt&,nbo&)nbo& ob_state(adr_arb%,poptexze&,aes_disable&,NOT (cpt&>min&)) ob_state(adr_arb%,poptexha&,aes_disable&,NOT (cpt&>min&)) ob_state(adr_arb%,poptexba&,aes_disable&,NOT (ADD(cpt&,nbo&)nbo& ob_state(adr_arb%,drivzero&,aes_disable&,NOT (cpt&>min&)) ob_state(adr_arb%,drivhaut&,aes_disable&,NOT (cpt&>min&)) ob_state(adr_arb%,drivbas&,aes_disable&,NOT (ADD(cpt&,nbo&)nbo& ob_state(adr_arb%,minprede&,aes_disable&,NOT (cpt&>0)) ob_state(adr_arb%,coulhaut&,aes_disable&,NOT (cpt&>0)) ob_state(adr_arb%,coulbas&,aes_disable&,NOT (ADD(cpt&,nbo&)nbo& ob_state(adr_arb%,fnctzero&,aes_disable&,NOT (cpt&>min&)) ob_state(adr_arb%,fncthau&,aes_disable&,NOT (cpt&>min&)) ob_state(adr_arb%,fnctbas&,aes_disable&,NOT (ADD(cpt&,nbo&)nbo& ob_state(adr_arb%,selchoze&,aes_disable&,NOT (cpt&>min&)) ob_state(adr_arb%,selchoha&,aes_disable&,NOT (cpt&>min&)) ob_state(adr_arb%,selchoba&,aes_disable&,NOT (ADD(cpt&,nbo&) PROCEDURE scroll_haut_popup_general(ind!,adr_arb%,cpt&,min&,max&,nbo&,sou&,v1&,v2&) LOCAL tex_debs&,limi_&,choix&,position_dans_csg&,j&,c&,n_n& LOCAL s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,ex&,ey&,ew&,eh&,x11&,y11&,x21&,y21& LOCAL dx&,dy&,dw&,dh& objc_offset(adr_arb%,v1&,dx&,dy&) objc_offset(adr_arb%,SUCC(v1&),ex&,ey&) ew&=OB_W(adr_arb%,SUCC(v1&)) eh&=PRED(MUL(OB_H(adr_arb%,v1&),PRED(nbo&))) avant_les_scrolls(ind!,adr_arb%,cpt&,min&,max&,nbo&,sou&,v1&,v2&,limi_&) ' ************************* D‚finition du raster source s%=0 ! C'est l'‚cran, le GEM s'occupe de tout ' ************************* D‚finition du raster destination d%=0 ! C'est l'‚cran, le GEM s'occupe de tout ' ************************* Definition de la partie … d‚placer x11&=ex& ! Position X source y11&=ey& ! Position Y source x21&=dx& ! Position X destination y21&=dy& ! Position Y destination clip_raster(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) IF adr_arb%=adr_popup_autre0% IF CARD{plusieurs%}=0 n_n&=ADD(cpt&,limi_&) ELSE n_n&=CARD{ADD(ADD(plusieurs%,2),SHL(ADD(cpt&,limi_&),1))} ENDIF ob_state(adr_arb%,v2&,aes_disable&,FALSE) BYTE{ADD(ADD(@adresse_objet(n_n&),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(n_n&),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_arb%,v2&)}}=STR$(SUCC(n_n&),3)+CHAR{ADD(@adresse_objet(n_n&),offset_nom_objet&)} ELSE choix&=INT{@adresse_objet(n_n&)} CHAR{{OB_SPEC(adr_arb%,v2&)}}=STR$(SUCC(n_n&),3)+@nom_objet$(choix&,TRUE) ENDIF IF BTST(BYTE{ADD(@adresse_objet(n_n&),offset_drapeau0&)},bit_masque|) AND INT{ADD(@adresse_objet(n_n&),offset_relation_csg&)}=-1 ' Si l'objet est masqu‚ et pas dans une CSG, on le grise dans la liste ob_state(adr_arb%,v2&,aes_disable&,TRUE) ELSE IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(@adresse_objet(n_n&)),36)),35)}=0 ' Si le calque de l'objet est invisible on le grise dans la liste ob_state(adr_arb%,v2&,aes_disable&,TRUE) ENDIF ELSE IF adr_arb%=adr_popup_autre1% ob_state(adr_arb%,v2&,aes_disable&,FALSE) adr_sr%=@adresse_source(ADD(cpt&,limi_&)) IF BYTE{adr_sr%}=1 CHAR{{OB_SPEC(adr_arb%,v2&)}}=STR$(SUCC(ADD(cpt&,limi_&)),4)+CHAR{OB_SPEC(adr_divers%,acti&)} ELSE CHAR{{OB_SPEC(adr_arb%,v2&)}}=STR$(SUCC(ADD(cpt&,limi_&)),4)+CHAR{OB_SPEC(adr_divers%,inacti&)} ENDIF ELSE IF adr_arb%=adr_popup_autre2% ob_state(adr_arb%,v2&,aes_disable&,FALSE) CHAR{{OB_SPEC(adr_arb%,v2&)}}=STR$(ADD(cpt&,nbo&),4) ELSE IF adr_arb%=adr_popup_autre3% IF max&=total_texture& AND cpt&=debut_texture& CHAR{{OB_SPEC(adr_arb%,v2&)}}=@nom_texture$(include_texture%,ADD(debut_texture&,PRED(nbo&))) ELSE IF max&=total_couleur& AND cpt&=debut_couleur& CHAR{{OB_SPEC(adr_arb%,v2&)}}=@nom_texture$(include_couleur%,ADD(debut_couleur&,PRED(nbo&))) ELSE IF max&=total_pigment& AND cpt&=debut_pigment& CHAR{{OB_SPEC(adr_arb%,v2&)}}=@nom_texture$(include_pigment%,ADD(debut_pigment&,PRED(nbo&))) ELSE IF max&=total_normal& AND cpt&=debut_normal& CHAR{{OB_SPEC(adr_arb%,v2&)}}=@nom_texture$(include_normal%,ADD(debut_normal&,PRED(nbo&))) ELSE IF max&=total_finish& AND cpt&=debut_finish& CHAR{{OB_SPEC(adr_arb%,v2&)}}=@nom_texture$(include_finish%,ADD(debut_finish&,PRED(nbo&))) ENDIF ELSE IF adr_arb%=adr_fonctions% IF v1&=lte01& ob_state(adr_arb%,v2&,aes_disable&,FALSE) BYTE{ADD(ADD(@adresse_objet(ADD(cpt&,limi_&)),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(ADD(cpt&,limi_&)),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_arb%,v2&)}}=STR$(SUCC(ADD(cpt&,limi_&)),3)+CHAR{ADD(@adresse_objet(ADD(cpt&,limi_&)),offset_nom_objet&)} ELSE choix&=INT{@adresse_objet(ADD(cpt&,limi_&))} CHAR{{OB_SPEC(adr_arb%,v2&)}}=STR$(SUCC(ADD(cpt&,limi_&)),3)+@nom_objet$(choix&,TRUE) ENDIF ob_state(adr_arb%,v2&,aes_selected&,FALSE) IF INT{ADD(effacement%,SHL(ADD(cpt&,limi_&),1))}=1 ob_state(adr_arb%,v2&,aes_selected&,TRUE) ENDIF IF INT{ADD(effacement%,SHL(ADD(cpt&,limi_&),1))}=2 ob_state(adr_arb%,v2&,aes_disable&,TRUE) ELSE ob_state(adr_arb%,v2&,aes_disable&,FALSE) ENDIF ELSE IF v1&=fnct01& ob_state(adr_arb%,v2&,aes_disable&,FALSE) position_dans_csg&=@dans_csg(ADD(cpt&,limi_&)) membfill(mfdb%,4,0) IF position_dans_csg&>-1 CHAR{mfdb%}=STR$(position_dans_csg&,3) ob_state(adr_arb%,v2&,aes_selected&,TRUE) ELSE CHAR{mfdb%}=" " ob_state(adr_arb%,v2&,aes_selected&,FALSE) ENDIF BYTE{ADD(ADD(@adresse_objet(ADD(cpt&,limi_&)),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(ADD(cpt&,limi_&)),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_arb%,v2&)}}=CHAR{mfdb%}+STR$(SUCC(ADD(cpt&,limi_&)),3)+CHAR{ADD(@adresse_objet(ADD(cpt&,limi_&)),offset_nom_objet&)} ELSE choix&=INT{@adresse_objet(ADD(cpt&,limi_&))} CHAR{{OB_SPEC(adr_arb%,v2&)}}=CHAR{mfdb%}+STR$(SUCC(ADD(cpt&,limi_&)),3)+@nom_objet$(choix&,TRUE) ENDIF ENDIF ELSE IF adr_arb%=adr_selec_mult% ob_state(adr_arb%,v2&,aes_disable&,FALSE) BYTE{ADD(ADD(@adresse_objet(ADD(cpt&,limi_&)),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(ADD(cpt&,limi_&)),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_arb%,v2&)}}=STR$(ADD(cpt&,limi_&),5)+CHAR{ADD(@adresse_objet(ADD(cpt&,limi_&)),offset_nom_objet&)} ELSE choix&=INT{@adresse_objet(ADD(cpt&,limi_&))} CHAR{{OB_SPEC(adr_arb%,v2&)}}=STR$(ADD(cpt&,limi_&),5)+@nom_objet$(choix&,TRUE) ENDIF ob_state(adr_arb%,v2&,aes_selected&,FALSE) IF INT{ADD(effacement%,SHL(ADD(cpt&,limi_&),1))}=1 ob_state(adr_arb%,v2&,aes_selected&,TRUE) ENDIF IF BTST(BYTE{ADD(@adresse_objet(ADD(cpt&,limi_&)),offset_drapeau0&)},bit_masque|) ' Si l'objet est masqu‚ ou dans une CSG, on le grise dans la liste ob_state(adr_arb%,v2&,aes_disable&,TRUE) ELSE IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(@adresse_objet(ADD(cpt&,limi_&))),36)),35)}=0 ' Si le calque de l'objet est invisible on le grise dans la liste ob_state(adr_arb%,v2&,aes_disable&,TRUE) ENDIF ENDIF IF ind! redraw_elem(adr_arb%,v2&) ENDIF RETURN > PROCEDURE scroll_bas_popup_general(ind!,adr_arb%,cpt&,min&,max&,nbo&,sou&,v1&,v2&) LOCAL tex_debs&,limi_&,choix&,position_dans_csg&,adr_sr% LOCAL s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,ex&,ey&,ew&,eh&,x11&,y11&,x21&,y21& LOCAL dx&,dy&,dw&,dh& objc_offset(adr_arb%,SUCC(v1&),dx&,dy&) objc_offset(adr_arb%,v1&,ex&,ey&) ew&=OB_W(adr_arb%,v1&) eh&=PRED(MUL(OB_H(adr_arb%,v1&),PRED(nbo&))) avant_les_scrolls(ind!,adr_arb%,cpt&,min&,max&,nbo&,sou&,v1&,v2&,limi_&) ' ************************* D‚finition du raster source s%=0 ! C'est l'‚cran, le GEM s'occupe de tout ' ************************* D‚finition du raster destination d%=0 ! C'est l'‚cran, le GEM s'occupe de tout ' ************************* Definition de la partie … d‚placer x11&=ex& ! Position X source y11&=ey& ! Position Y source x21&=dx& ! Position X destination y21&=dy& ! Position Y destination clip_raster(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) IF adr_arb%=adr_popup_autre0% IF CARD{plusieurs%}=0 n_n&=cpt& ELSE n_n&=CARD{ADD(ADD(plusieurs%,2),SHL(cpt&,1))} ENDIF ob_state(adr_arb%,v1&,aes_disable&,FALSE) BYTE{ADD(ADD(@adresse_objet(n_n&),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(n_n&),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_arb%,v1&)}}=STR$(SUCC(n_n&),3)+CHAR{ADD(@adresse_objet(n_n&),offset_nom_objet&)} ELSE choix&=INT{@adresse_objet(n_n&)} CHAR{{OB_SPEC(adr_arb%,v1&)}}=STR$(SUCC(n_n&),3)+@nom_objet$(choix&,TRUE) ENDIF IF BTST(BYTE{ADD(@adresse_objet(n_n&),offset_drapeau0&)},bit_masque|) AND INT{ADD(@adresse_objet(n_n&),offset_relation_csg&)}=-1 ' Si l'objet est masqu‚ et pas dans une CSG, on le grise dans la liste ob_state(adr_arb%,v1&,aes_disable&,TRUE) ELSE IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(@adresse_objet(n_n&)),36)),35)}=0 ' Si le calque de l'objet est invisible on le grise dans la liste ob_state(adr_arb%,v1&,aes_disable&,TRUE) ENDIF ELSE IF adr_arb%=adr_popup_autre1% ob_state(adr_arb%,v1&,aes_disable&,FALSE) adr_sr%=@adresse_source(cpt&) IF BYTE{adr_sr%}=1 CHAR{{OB_SPEC(adr_arb%,v1&)}}=STR$(SUCC(cpt&),4)+CHAR{OB_SPEC(adr_divers%,acti&)} ELSE CHAR{{OB_SPEC(adr_arb%,v1&)}}=STR$(SUCC(cpt&),4)+CHAR{OB_SPEC(adr_divers%,inacti&)} ENDIF ELSE IF adr_arb%=adr_popup_autre2% ob_state(adr_arb%,v1&,aes_disable&,FALSE) CHAR{{OB_SPEC(adr_arb%,v1&)}}=STR$(cpt&,4) ELSE IF adr_arb%=adr_popup_autre3% IF max&=total_texture& AND cpt&=debut_texture& CHAR{{OB_SPEC(adr_arb%,v1&)}}=@nom_texture$(include_texture%,debut_texture&) ELSE IF max&=total_couleur& AND cpt&=debut_couleur& CHAR{{OB_SPEC(adr_arb%,v1&)}}=@nom_texture$(include_couleur%,debut_couleur&) ELSE IF max&=total_pigment& AND cpt&=debut_pigment& CHAR{{OB_SPEC(adr_arb%,v1&)}}=@nom_texture$(include_pigment%,debut_pigment&) ELSE IF max&=total_normal& AND cpt&=debut_normal& CHAR{{OB_SPEC(adr_arb%,v1&)}}=@nom_texture$(include_normal%,debut_normal&) ELSE IF max&=total_finish& AND cpt&=debut_finish& CHAR{{OB_SPEC(adr_arb%,v1&)}}=@nom_texture$(include_finish%,debut_finish&) ENDIF ELSE IF adr_arb%=adr_fonctions% IF v1&=lte01& ob_state(adr_arb%,v1&,aes_disable&,FALSE) BYTE{ADD(ADD(@adresse_objet(cpt&),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(cpt&),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_arb%,v1&)}}=STR$(SUCC(cpt&),3)+CHAR{ADD(@adresse_objet(cpt&),offset_nom_objet&)} ELSE choix&=INT{@adresse_objet(cpt&)} CHAR{{OB_SPEC(adr_arb%,v1&)}}=STR$(SUCC(cpt&),3)+@nom_objet$(choix&,TRUE) ENDIF ob_state(adr_arb%,v1&,aes_selected&,FALSE) IF INT{ADD(effacement%,SHL(cpt&,1))}=1 ob_state(adr_arb%,v1&,aes_selected&,TRUE) ENDIF IF INT{ADD(effacement%,SHL(cpt&,1))}=2 ob_state(adr_arb%,v1&,aes_disable&,TRUE) ELSE ob_state(adr_arb%,v1&,aes_disable&,FALSE) ENDIF ELSE IF v1&=fnct01& ob_state(adr_arb%,v1&,aes_disable&,FALSE) position_dans_csg&=@dans_csg(cpt&) membfill(mfdb%,4,0) IF position_dans_csg&>-1 CHAR{mfdb%}=STR$(position_dans_csg&,3) ob_state(adr_arb%,v2&,aes_selected&,TRUE) ELSE CHAR{mfdb%}=" " ob_state(adr_arb%,v2&,aes_selected&,FALSE) ENDIF BYTE{ADD(ADD(@adresse_objet(cpt&),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(cpt&),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_arb%,v2&)}}=CHAR{mfdb%}+STR$(SUCC(cpt&),3)+CHAR{ADD(@adresse_objet(cpt&),offset_nom_objet&)} ELSE choix&=INT{@adresse_objet(cpt&)} CHAR{{OB_SPEC(adr_arb%,v2&)}}=CHAR{mfdb%}+STR$(SUCC(cpt&),3)+@nom_objet$(choix&,TRUE) ENDIF ENDIF ELSE IF adr_arb%=adr_selec_mult% ob_state(adr_arb%,v1&,aes_disable&,FALSE) BYTE{ADD(ADD(@adresse_objet(cpt&),offset_nom_objet&),21)}=0 IF TRIM$(CHAR{ADD(@adresse_objet(cpt&),offset_nom_objet&)})<>"" CHAR{{OB_SPEC(adr_arb%,v1&)}}=STR$(cpt&,5)+CHAR{ADD(@adresse_objet(cpt&),offset_nom_objet&)} ELSE choix&=INT{@adresse_objet(cpt&)} CHAR{{OB_SPEC(adr_arb%,v1&)}}=STR$(cpt&,5)+@nom_objet$(choix&,TRUE) ENDIF ob_state(adr_arb%,v1&,aes_selected&,FALSE) IF INT{ADD(effacement%,SHL(cpt&,1))}=1 ob_state(adr_arb%,v1&,aes_selected&,TRUE) ENDIF IF BTST(BYTE{ADD(@adresse_objet(cpt&),offset_drapeau0&)},bit_masque|) ' Si l'objet est masqu‚ ou dans une CSG, on le grise dans la liste ob_state(adr_arb%,v1&,aes_disable&,TRUE) ELSE IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(@adresse_objet(cpt&)),36)),35)}=0 ' Si le calque de l'objet est invisible on le grise dans la liste ob_state(adr_arb%,v1&,aes_disable&,TRUE) ENDIF ENDIF IF ind! redraw_elem(adr_arb%,v1&) ENDIF RETURN > PROCEDURE liste_des_objets_trouves LOCAL univ%,fin_univ%,i&,pl% LOCAL xm&,ym&,nb_trouves& LOCAL ox,oy,oz LOCAL ow,oh,oz LOCAL minx,miny LOCAL maxx,maxy CLR nb_trouve&,i& membfill(plusieurs%,ADD(SHL(limite_des_objets&,2),2),0) pl%=ADD(plusieurs%,2) univ%=univers% fin_univ%=@adresse_objet(nombre_d_objets&) DO ' Si l'objet n'est pas masqu‚, on test sur lequel on a cliqu‚ IF NOT BTST(BYTE{ADD(univ%,offset_drapeau0&)},bit_masque|) IF INT{univ%}=primitive_triangle& pour_triangle_active(univ%,ox,oy,oz,ow,oh,op) ELSE ox=SINGLE{ADD(univ%,2)} oy=SINGLE{ADD(univ%,6)} oz=SINGLE{ADD(univ%,10)} ow=SINGLE{ADD(univ%,14)}/2 oh=SINGLE{ADD(univ%,18)}/2 op=SINGLE{ADD(univ%,22)}/2 ENDIF cherche_dans_vue_2d(ox,oy,oz,ow,oh,op,xm&,ym&,minx,miny,maxx,maxy) IF xm&=>minx AND xm&<=maxx AND ym&=>miny AND ym&<=maxy objet_actif&=i& IF objets_a_deplacer&>0 CLR j& DO IF objet_actif&=CARD{ADD(deplacement_multiple%,SHL(j&,1))} INC nb_trouve& CARD{pl%}=j& ADD pl%,2 ENDIF INC j& LOOP WHILE j&-1 ' L'objet est dans une C.S.G., et son calque est visible IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(univ%),36)),35)}=1 INC nb_trouve& CARD{pl%}=i& ADD pl%,2 ENDIF ELSE ' L…, tout va bien et son calque est actif IF BYTE{ADD(ADD(nom_calque%,MUL(@calque_actif(univ%),36)),35)}=1 INC nb_trouve& CARD{pl%}=i& ADD pl%,2 ENDIF ENDIF ENDIF ENDIF INC i& ADD univ%,taille_objet& LOOP WHILE univ% PROCEDURE position_curseur_vue_vertical(pos&) LOCAL pasy,larasc%,hauasc% ' hauasc%=OB_H(adr_fenetre%,fenvue08&) SUB hauasc%,OB_H(adr_fenetre%,fenvue10&) ! Le curseur SUB hauasc%,OB_H(adr_fenetre%,fenvue19&) ! FlŠche haute SUB hauasc%,OB_H(adr_fenetre%,fenvue20&) ! FlŠche basse ' pasy=hauasc%/1000 OB_Y(adr_fenetre%,fenvue10&)=(pos&*pasy)+OB_H(adr_fenetre%,fenvue19&) redraw_elem(adr_fenetre%,fenvue08&) ' RETURN > PROCEDURE deplace_curseur_vue_vertical LOCAL depx&,depy&,depw&,deph&,depart&,arrivee&,pos_slide&,slide& LOCAL hauasc% ' pos_slide&=500 ' objc_offset(adr_fenetre%,fenvue08&,depx&,depart&) ADD depart&,OB_H(adr_fenetre%,fenvue19&) deph&=SUB(OB_H(adr_fenetre%,fenvue08&),OB_H(adr_fenetre%,fenvue10&)) SUB deph&,ADD(OB_H(adr_fenetre%,fenvue19&),OB_H(adr_fenetre%,fenvue21&)) arrivee&=ADD(ADD(depart&,deph&),2) la_fenetre(fenvue10&,depx&,depy&,depw&,deph&) graf_mouse(main_a_plat&,0) ' hauasc%=OB_H(adr_fenetre%,fenvue08&) SUB hauasc%,OB_H(adr_fenetre%,fenvue10&) ! Le curseur SUB hauasc%,OB_H(adr_fenetre%,fenvue19&) ! FlŠche haute SUB hauasc%,OB_H(adr_fenetre%,fenvue20&) ! FlŠche basse ' DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_my&,DIV(deph&,2) IF global_my&arrivee& global_my&=arrivee& ENDIF IF global_my&<>global_amy& pos_slide&=ROUND((SUB(global_my&,depart&)/hauasc%)*1000) pos_slide&=-pos_slide&*(pos_slide&>-1 AND pos_slide&<1001)+0*(pos_slide&<0)-1000*(pos_slide&>1000) position_curseur_vue_vertical(pos_slide&) global_amy&=global_my& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) ' slide&=SUB(pos_slide&,500) deplacement_effectif_y(slide&) IF grille_vue! deplacement_en_x&=MUL(DIV(deplacement_en_x&,pas_grille&),pas_grille&) deplacement_en_y&=MUL(DIV(deplacement_en_y&,pas_grille&),pas_grille&) deplacement_en_z&=MUL(DIV(deplacement_en_z&,pas_grille&),pas_grille&) ENDIF redessin_deja_fait!=FALSE tri_2d!=FALSE position_curseur_vue_vertical(500) redraw_force(24,24) ' RETURN > PROCEDURE position_curseur_vue_horizontal(pos&) LOCAL pasx,larasc% ' larasc%=OB_W(adr_fenetre%,fenvue13&) SUB larasc%,OB_W(adr_fenetre%,fenvue15&) ! Le curseur SUB larasc%,OB_W(adr_fenetre%,fenvue21&) ! FlŠche gauche SUB larasc%,OB_W(adr_fenetre%,fenvue22&) ! FlŠche droite ' pasx=larasc%/1000 OB_X(adr_fenetre%,fenvue15&)=(pos&*pasx)+OB_W(adr_fenetre%,fenvue21&) redraw_elem(adr_fenetre%,fenvue13&) ' RETURN > PROCEDURE deplace_curseur_vue_horizontal LOCAL depx&,depy&,depw&,deph&,depart&,arrivee&,pos_slide&,slide& LOCAL larasc% ' pos_slide&=500 ' objc_offset(adr_fenetre%,fenvue13&,depart&,depy&) ADD depart&,OB_W(adr_fenetre%,fenvue21&) depw&=SUB(OB_W(adr_fenetre%,fenvue13&),OB_W(adr_fenetre%,fenvue15&)) SUB depw&,ADD(OB_W(adr_fenetre%,fenvue21&),OB_W(adr_fenetre%,fenvue22&)) arrivee&=ADD(ADD(depart&,depw&),2) la_fenetre(fenvue15&,depx&,depy&,depw&,deph&) graf_mouse(main_a_plat&,0) ' larasc%=OB_W(adr_fenetre%,fenvue13&) SUB larasc%,OB_W(adr_fenetre%,fenvue15&) ! Le curseur SUB larasc%,OB_W(adr_fenetre%,fenvue21&) ! FlŠche gauche SUB larasc%,OB_W(adr_fenetre%,fenvue22&) ! FlŠche droite ' DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_mx&,DIV(depw&,2) IF global_mx&arrivee& global_mx&=arrivee& ENDIF IF global_mx&<>global_amx& pos_slide&=ROUND((SUB(global_mx&,depart&)/larasc%)*1000) pos_slide&=-pos_slide&*(pos_slide&>-1 AND pos_slide&<1001)+0*(pos_slide&<0)-1000*(pos_slide&>1000) position_curseur_vue_horizontal(pos_slide&) global_amx&=global_mx& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) ' slide&=SUB(pos_slide&,500) deplacement_effectif_x(slide&) IF grille_vue! deplacement_en_x&=MUL(DIV(deplacement_en_x&,pas_grille&),pas_grille&) deplacement_en_y&=MUL(DIV(deplacement_en_y&,pas_grille&),pas_grille&) deplacement_en_z&=MUL(DIV(deplacement_en_z&,pas_grille&),pas_grille&) ENDIF redessin_deja_fait!=FALSE tri_2d!=FALSE position_curseur_vue_horizontal(500) redraw_force(24,24) ' RETURN ' > PROCEDURE position_curseur_vertical(arbre%,pere&,fils&,valeur&,in!) LOCAL depx&,depy&,depw&,deph& LOCAL pasy,adr1%,adr2% ' pasy=SUB(OB_H(arbre%,pere&),OB_H(arbre%,PRED(fils&)))/255 OB_Y(arbre%,PRED(fils&))=SUB(SUB(OB_H(arbre%,pere&),OB_H(arbre%,PRED(fils&))),valeur&*pasy) CHAR{{OB_SPEC(arbre%,fils&)}}=STR$(ROUND(valeur&/255*100),3) ' IF in! IF arbre%=adr_predefinie% IF (pere&=ascelumi&) OR (pere&=ascetran&) OR (pere&=asceroug&) OR (pere&=ascevert&) OR (pere&=ascebleu&) objc_offset(arbre%,pere&,depx&,depy&) depw&=OB_W(arbre%,pere&) deph&=OB_H(arbre%,pere&) objc_draw(adr_predefinie%,pere&,0,depx&,depy&,depw&,deph&,-1) $S&,$S> SELECT pere& CASE ascelumi& des_zolis_degrade_vers_ecran(0,depx&,depy&,depw&,deph&) CASE ascetran& des_zolis_degrade_vers_ecran(1,depx&,depy&,depw&,deph&) CASE asceroug& des_zolis_degrade_vers_ecran(2,depx&,depy&,depw&,deph&) CASE ascevert& des_zolis_degrade_vers_ecran(3,depx&,depy&,depw&,deph&) CASE ascebleu& des_zolis_degrade_vers_ecran(4,depx&,depy&,depw&,deph&) ENDSELECT objc_draw(adr_predefinie%,PRED(fils&),12,depx&,depy&,depw&,deph&,-1) ELSE redraw_elem(arbre%,pere&) ENDIF ELSE redraw_elem(arbre%,pere&) ENDIF ENDIF RETURN > PROCEDURE deplace_curseur_vertical(arbre%,pere&,fils&,adr_col%) LOCAL depx&,depy&,depw&,deph&,depart&,arrivee&,valeur& LOCAL teinte&,saturation&,luminosite&,ro&,ve&,bl& objc_offset(arbre%,pere&,depx&,depart&) deph&=SUB(OB_H(arbre%,pere&),OB_H(arbre%,PRED(fils&))) arrivee&=ADD(ADD(depart&,deph&),2) objc_offset(arbre%,PRED(fils&),depx&,depy&) depw&=OB_W(arbre%,PRED(fils&)) deph&=OB_H(arbre%,PRED(fils&)) graf_mouse(main_a_plat&,0) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_my&,DIV(deph&,2) IF global_my&arrivee& global_my&=arrivee& ENDIF IF global_my&<>global_amy& valeur&=ROUND((ABS(SUB(global_my&,arrivee&))/(SUB(OB_H(arbre%,pere&),OB_H(arbre%,PRED(fils&)))))*255) valeur&=-valeur&*(valeur&>-1 AND valeur&<256)+0*(valeur&<0)-255*(valeur&>255) $S&,$S> SELECT fils& CASE carrlumi& rvb_tsl(BYTE{ADD(adr_col%,2)},BYTE{ADD(adr_col%,3)},BYTE{ADD(adr_col%,4)},teinte&,saturation&,luminosite&) luminosite&=valeur& position_curseur_vertical(arbre%,pere&,fils&,valeur&,TRUE) redessin_partiel_tls(adr_col%,teinte&,luminosite&,saturation&) redessin_partiel_rvb(adr_col%) CASE carrroug& BYTE{ADD(adr_col%,2)}=valeur& position_curseur_vertical(arbre%,pere&,fils&,valeur&,TRUE) redessin_partiel_rvb(adr_col%) CASE carrvert& BYTE{ADD(adr_col%,3)}=valeur& position_curseur_vertical(arbre%,pere&,fils&,valeur&,TRUE) redessin_partiel_rvb(adr_col%) CASE carrbleu& BYTE{ADD(adr_col%,4)}=valeur& position_curseur_vertical(arbre%,pere&,fils&,valeur&,TRUE) redessin_partiel_rvb(adr_col%) CASE carrtran& BYTE{ADD(adr_col%,5)}=valeur& position_curseur_vertical(arbre%,pere&,fils&,valeur&,TRUE) ENDSELECT global_amy&=global_my& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) RETURN > PROCEDURE position_curseur_horizontal(arbre%,pere&,fils&,valeur,ind!) LOCAL pasx IF total_bibliotheque&=0 tail%=OB_W(arbre%,pere&) ELSE tail%=DIV(OB_W(arbre%,pere&),total_bibliotheque&) ENDIF IF tail%<6 tail%=6 ENDIF OB_W(arbre%,fils&)=tail% OB_W(arbre%,SUCC(fils&))=PRED(tail%) OB_W(arbre%,ADD(fils&,2))=tail% pasx=SUB(OB_W(arbre%,pere&),OB_W(arbre%,fils&))/255 OB_X(arbre%,fils&)=valeur*pasx IF ind! redraw_elem(arbre%,pere&) ENDIF RETURN > PROCEDURE deplace_curseur_horizontal(arbre%,pere&,fils&) LOCAL depx&,depy&,depw&,deph&,depart&,arrivee&,valeur LOCAL valeur% ' la_fenetre(fenvue07&,global_xf&,global_yf&,global_wf&,global_hf&) calcul_la_zone_clippe(global_xf&,global_yf&,global_wf&,global_hf&,mix&,miy&) ' objc_offset(arbre%,pere&,depart&,depy&) depw&=SUB(OB_W(arbre%,pere&),OB_W(arbre%,fils&)) arrivee&=ADD(ADD(depart&,depw&),2) objc_offset(arbre%,fils&,depx&,depy&) depw&=OB_W(arbre%,fils&) deph&=OB_H(arbre%,fils&) graf_mouse(main_a_plat&,0) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_mx&,DIV(depw&,2) IF global_mx&arrivee& global_mx&=arrivee& ENDIF IF global_mx&<>global_amx& valeur&=ROUND((SUB(global_mx&,depart&)/(SUB(OB_W(arbre%,pere&),OB_W(arbre%,fils&))))*255) valeur&=-valeur&*(valeur&>-1 AND valeur&<256)+0*(valeur&<0)-255*(valeur&>255) position_curseur_horizontal(arbre%,pere&,fils&,valeur&,TRUE) global_amx&=global_mx& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) RETURN ' > PROCEDURE position_curseur_popup(arbre%,pere&,fils&,valeur&,lime&,ind!) LOCAL pasy,tail% ' IF lime&<11 OB_H(arbre%,fils&)=OB_H(arbre%,pere&) OB_H(arbre%,SUCC(fils&))=PRED(OB_H(arbre%,pere&)) OB_H(arbre%,ADD(fils&,2))=OB_H(arbre%,pere&) OB_Y(arbre%,fils&)=0 ELSE tail%=MUL(DIV(OB_H(arbre%,pere&),lime&),11) IF tail%<6 tail%=6 ENDIF OB_H(arbre%,fils&)=tail% OB_H(arbre%,SUCC(fils&))=PRED(tail%) OB_H(arbre%,ADD(fils&,2))=tail% pasy=SUB(OB_H(arbre%,pere&),tail%)/SUB(lime&,10) OB_Y(arbre%,fils&)=valeur&*pasy ENDIF IF ind! redraw_elem(arbre%,pere&) ENDIF RETURN > PROCEDURE deplace_curseur_popup(arbre%,pere&,fils&,in|) LOCAL depx&,depy&,depw&,deph&,depart&,arrivee& LOCAL adr_lis%,deb_l&,tot_l& objc_offset(arbre%,pere&,depx&,depart&) deph&=SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&)) arrivee&=ADD(ADD(depart&,deph&),2) objc_offset(arbre%,fils&,depx&,depy&) depw&=OB_W(arbre%,fils&) deph&=OB_H(arbre%,fils&) graf_mouse(main_a_plat&,0) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_my&,DIV(deph&,2) IF global_my&arrivee& global_my&=arrivee& ENDIF IF global_my&<>global_amy& IF arbre%=adr_modules% $S|,$S> SELECT in| CASE 0 ABSOLUTE deb_l&,*debut_liste_module& tot_l&=modules_de_sauvegarde& adr_lis%=les_modules% CASE 1 ABSOLUTE deb_l&,*debut_liste_import& tot_l&=modules_d_importation& adr_lis%=les_imports% CASE 2 ABSOLUTE deb_l&,*debut_liste_outils& tot_l&=modules_outils& adr_lis%=les_outils% ENDSELECT deb_l&=ROUND((ABS(SUB(global_my&,depart&))/(SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&))))*PRED(tot_l&)) IF deb_l&>SUB(tot_l&,10) deb_l&=SUB(tot_l&,10) ENDIF position_curseur_popup(arbre%,pere&,fils&,deb_l&,tot_l&,TRUE) ecrire_les_modules(TRUE,adr_lis%,deb_l&,tot_l&) ELSE IF arbre%=adr_popup_autre0% debut_popup_choix&=ROUND((ABS(SUB(global_my&,depart&))/(SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&))))*PRED(nombre_d_objets&)) IF debut_popup_choix&>SUB(nombre_d_objets&,10) debut_popup_choix&=SUB(nombre_d_objets&,10) ENDIF position_curseur_popup(arbre%,pere&,fils&,debut_popup_choix&,nombre_d_objets&,TRUE) ecrire_les_objets_popups(TRUE) ELSE IF arbre%=adr_popup_autre1% debut_popup_lum&=ROUND((ABS(SUB(global_my&,depart&))/(SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&))))*PRED(nombre_de_source&)) IF debut_popup_lum&>SUB(nombre_de_source&,10) debut_popup_lum&=SUB(nombre_de_source&,10) ENDIF position_curseur_popup(arbre%,pere&,fils&,debut_popup_lum&,nombre_de_source&,TRUE) ecrire_les_sources_popups(TRUE) ' ELSE IF arbre%=adr_popup_autre2% ELSE IF arbre%=adr_popup_autre3% CLR deb_l&,tot_l&,adr_lis% ' La liste des couleurs ABSOLUTE deb_l&,*debut_couleur& tot_l&=total_couleur& adr_lis%=include_couleur% deb_l&=ROUND((ABS(SUB(global_my&,depart&))/(SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&))))*PRED(tot_l&)) IF deb_l&>SUB(tot_l&,10) deb_l&=SUB(tot_l&,10) ENDIF position_curseur_popup(arbre%,pere&,fils&,deb_l&,tot_l&,TRUE) ecrire_les_include(TRUE,deb_l&,tot_l&,adr_lis%) ELSE IF arbre%=adr_selec_mult% debut_popup_choix&=ROUND((ABS(SUB(global_my&,depart&))/(SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&))))*PRED(nombre_d_objets&)) IF debut_popup_choix&>SUB(nombre_d_objets&,10) debut_popup_choix&=SUB(nombre_d_objets&,10) ENDIF position_curseur_popup(arbre%,pere&,fils&,debut_popup_choix&,nombre_d_objets&,TRUE) ecrire_la_selection_multiple(TRUE) ENDIF global_amy&=global_my& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) RETURN ' > PROCEDURE deplace_curseur_popup_plusieur(arbre%,pere&,fils&) LOCAL depx&,depy&,depw&,deph&,depart&,arrivee& LOCAL adr_lis%,deb_l&,tot_l& objc_offset(arbre%,pere&,depx&,depart&) deph&=SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&)) arrivee&=ADD(ADD(depart&,deph&),2) objc_offset(arbre%,fils&,depx&,depy&) depw&=OB_W(arbre%,fils&) deph&=OB_H(arbre%,fils&) graf_mouse(main_a_plat&,0) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_my&,DIV(deph&,2) IF global_my&arrivee& global_my&=arrivee& ENDIF IF global_my&<>global_amy& debut_popup_plusieurs&=ROUND((ABS(SUB(global_my&,depart&))/(SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&))))*PRED(CARD{plusieurs%})) IF debut_popup_plusieurs&>SUB(CARD{plusieurs%},10) debut_popup_plusieurs&=SUB(CARD{plusieurs%},10) ENDIF position_curseur_popup(arbre%,pere&,fils&,debut_popup_plusieurs&,CARD{plusieurs%},TRUE) ecrire_choix_plusieurs_objets(TRUE) global_amy&=global_my& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) RETURN ' > PROCEDURE position_curseur_popup_valeur(arbre%,pere&,fils&,valeur&,limi&,ind!) LOCAL pasy IF limi&<=8 OB_H(arbre%,fils&)=OB_H(arbre%,pere&) OB_H(arbre%,SUCC(fils&))=PRED(OB_H(arbre%,pere&)) OB_H(arbre%,ADD(fils&,2))=OB_H(arbre%,pere&) OB_Y(arbre%,fils&)=0 ELSE tail%=MUL(DIV(OB_H(arbre%,pere&),limi&),9) IF tail%<6 tail%=6 ENDIF OB_H(arbre%,fils&)=tail% OB_H(arbre%,SUCC(fils&))=PRED(tail%) OB_H(arbre%,ADD(fils&,2))=tail% pasy=SUB(OB_H(arbre%,pere&),tail%)/SUB(limi&,8) OB_Y(arbre%,fils&)=valeur&*pasy ENDIF IF ind! redraw_elem(arbre%,pere&) ENDIF RETURN > PROCEDURE deplace_curseur_popup_valeur(arbre%,pere&,fils&,minimum&,maximum&) LOCAL depx&,depy&,depw&,deph&,depart&,arrivee& objc_offset(arbre%,pere&,depx&,depart&) deph&=SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&)) arrivee&=ADD(ADD(depart&,deph&),2) objc_offset(arbre%,fils&,depx&,depy&) depw&=OB_W(arbre%,fils&) deph&=OB_H(arbre%,fils&) graf_mouse(main_a_plat&,0) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_my&,DIV(deph&,2) IF global_my&arrivee& global_my&=arrivee& ENDIF IF global_my&<>global_amy& valeur&=ROUND((ABS(SUB(global_my&,depart&))/(SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&))))*PRED(SUB(maximum&,minimum&))) IF valeur&>SUB(SUB(maximum&,minimum&),7) valeur&=SUB(SUB(maximum&,minimum&),7) ENDIF IF minimum&<0 debut_popup_valeur&=SUB(valeur&,ROUND((maximum&-minimum&)/2)) ELSE debut_popup_valeur&=valeur& ENDIF position_curseur_popup_valeur(arbre%,pere&,fils&,valeur&,SUB(maximum&,minimum&),TRUE) ecrire_les_valeur_popups(TRUE,minimum&,maximum&) global_amy&=global_my& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) RETURN ' > PROCEDURE position_curseur_effacer(arbre%,pere&,fils&,valeur%,ind!) LOCAL pasy,tail% IF nombre_d_objets&<=17 OB_H(arbre%,fils&)=OB_H(arbre%,pere&) OB_H(arbre%,SUCC(fils&))=PRED(OB_H(arbre%,pere&)) OB_H(arbre%,ADD(fils&,2))=OB_H(arbre%,pere&) OB_Y(arbre%,fils&)=0 ELSE tail%=MUL(DIV(OB_H(arbre%,pere&),nombre_d_objets&),18) IF tail%<6 tail%=6 ENDIF OB_H(arbre%,fils&)=tail% OB_H(arbre%,SUCC(fils&))=PRED(tail%) OB_H(arbre%,ADD(fils&,2))=tail% pasy=SUB(OB_H(arbre%,pere&),tail%)/SUB(nombre_d_objets&,17) OB_Y(arbre%,fils&)=valeur%*pasy ENDIF IF ind! redraw_elem(arbre%,pere&) ENDIF RETURN > PROCEDURE deplace_curseur_effacer(arbre%,pere&,fils&) LOCAL depx&,depy&,depw&,deph&,depart&,arrivee&,valeur& objc_offset(arbre%,pere&,depx&,depart&) deph&=SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&)) arrivee&=PRED(ADD(depart&,deph&)) objc_offset(arbre%,fils&,depx&,depy&) depw&=OB_W(arbre%,fils&) deph&=OB_H(arbre%,fils&) graf_mouse(main_a_plat&,0) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_my&,DIV(deph&,2) IF global_my&arrivee& global_my&=arrivee& ENDIF IF global_my&<>global_amy& valeur&=ROUND((ABS(SUB(global_my&,depart&))/(SUB(OB_H(arbre%,pere&),OB_H(arbre%,fils&))))*PRED(nombre_d_objets&)) IF valeur&>SUB(nombre_d_objets&,17) valeur&=SUB(nombre_d_objets&,17) ENDIF IF flags_effacement!=TRUE OR flags_masquage!=TRUE debut_liste_eff&=valeur& ecrire_les_objets_effacer(TRUE) position_curseur_effacer(arbre%,pere&,fils&,valeur&,TRUE) ELSE debut_liste_csg&=valeur& ecrire_les_objets_fonction(TRUE) position_curseur_effacer(arbre%,pere&,fils&,valeur&,TRUE) ENDIF global_amy&=global_my& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) RETURN ' > PROCEDURE position_curseur_aliasing(arbre%,pere&,fils&,valeur&,ind!) LOCAL pasx pasx=SUB(OB_W(arbre%,pere&),OB_W(arbre%,PRED(fils&)))/255 OB_X(arbre%,PRED(fils&))=valeur&*pasx CHAR{{OB_SPEC(arbre%,fils&)}}=STR$(valeur&/255,5,3) IF ind! redraw_elem(arbre%,PRED(pere&)) ENDIF RETURN > PROCEDURE deplace_curseur_aliasing(arbre%,pere&,fils&) LOCAL depx&,depy&,depw&,deph&,depart&,arrivee&,valeur& objc_offset(arbre%,pere&,depart&,depy&) depw&=SUB(OB_W(arbre%,pere&),OB_W(arbre%,PRED(fils&))) arrivee&=ADD(ADD(depart&,depw&),2) objc_offset(arbre%,PRED(fils&),depx&,depy&) depw&=OB_W(arbre%,PRED(fils&)) deph&=OB_H(arbre%,PRED(fils&)) graf_mouse(main_a_plat&,0) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_mx&,DIV(depw&,2) IF global_mx&arrivee& global_mx&=arrivee& ENDIF IF global_mx&<>global_amx& valeur&=ROUND((SUB(global_mx&,depart&)/(SUB(OB_W(arbre%,pere&),OB_W(arbre%,PRED(fils&)))))*255) valeur&=-valeur&*(valeur&>-1 AND valeur&<256)+0*(valeur&<0)-255*(valeur&>255) IF pere&=povpere& alias&=valeur& ELSE IF pere&=jittpere& jittering&=valeur& ENDIF position_curseur_aliasing(arbre%,pere&,fils&,valeur&,TRUE) global_amx&=global_mx& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) RETURN ' > PROCEDURE position_curseur_tightness(arbre%,pere&,fils&,valeur&,ind!) LOCAL pasx pasx=SUB(OB_W(arbre%,pere&),OB_W(arbre%,PRED(fils&)))/99 OB_X(arbre%,PRED(fils&))=valeur&*pasx CHAR{{OB_SPEC(arbre%,fils&)}}=STR$(valeur&,3) IF ind! redraw_elem(arbre%,PRED(pere&)) ENDIF RETURN > PROCEDURE deplace_curseur_tightness(arbre%,pere&,fils&) LOCAL depx&,depy&,depw&,deph&,depart&,arrivee&,valeur& objc_offset(arbre%,pere&,depart&,depy&) depw&=SUB(OB_W(arbre%,pere&),OB_W(arbre%,PRED(fils&))) arrivee&=ADD(ADD(depart&,depw&),2) objc_offset(arbre%,PRED(fils&),depx&,depy&) depw&=OB_W(arbre%,PRED(fils&)) deph&=OB_H(arbre%,PRED(fils&)) graf_mouse(main_a_plat&,0) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_mx&,DIV(depw&,2) IF global_mx&arrivee& global_mx&=arrivee& ENDIF IF global_mx&<>global_amx& valeur&=ROUND((SUB(global_mx&,depart&)/(SUB(OB_W(arbre%,pere&),OB_W(arbre%,PRED(fils&)))))*99) valeur&=-valeur&*(valeur&>0 AND valeur&<101)-1*(valeur&<1)-100*(valeur&>100) position_curseur_tightness(arbre%,pere&,fils&,valeur&,TRUE) global_amx&=global_mx& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) RETURN ' > PROCEDURE position_curseur_vertical_hierarchie LOCAL tail%,pasx,pasy ' IF hauteur_hierarchie%<=OB_H(adr_hierarchie%,hie_sous&) OB_H(adr_hierarchie%,hiefilv0&)=OB_H(adr_hierarchie%,hieascv1&) OB_H(adr_hierarchie%,hiefilv1&)=PRED(OB_H(adr_hierarchie%,hiefilv0&)) OB_H(adr_hierarchie%,hiefilv2&)=OB_H(adr_hierarchie%,hieascv1&) OB_Y(adr_hierarchie%,hiefilv0&)=0 ob_state(adr_hierarchie%,hiefilv2&,aes_disable&,TRUE) ob_state(adr_hierarchie%,hiehauto&,aes_disable&,TRUE) ob_state(adr_hierarchie%,hiehaut&,aes_disable&,TRUE) ob_state(adr_hierarchie%,hiebas&,aes_disable&,TRUE) ob_state(adr_hierarchie%,hiebasto&,aes_disable&,TRUE) ELSE pasy=OB_H(adr_hierarchie%,hieascv1&)/hauteur_hierarchie% tail%=pasy*OB_H(adr_hierarchie%,hie_sous&) IF tail%<6 tail%=6 ENDIF OB_H(adr_hierarchie%,hiefilv0&)=tail% OB_H(adr_hierarchie%,hiefilv1&)=PRED(tail%) OB_H(adr_hierarchie%,hiefilv2&)=tail% OB_Y(adr_hierarchie%,hiefilv0&)=posy_hierarchie%*pasy ob_state(adr_hierarchie%,hiefilv2&,aes_disable&,FALSE) ob_state(adr_hierarchie%,hiehauto&,aes_disable&,FALSE) ob_state(adr_hierarchie%,hiehaut&,aes_disable&,FALSE) ob_state(adr_hierarchie%,hiebas&,aes_disable&,FALSE) ob_state(adr_hierarchie%,hiebasto&,aes_disable&,FALSE) ENDIF RETURN > PROCEDURE deplace_curseur_vertical_hierarchie(pere&,fils&) LOCAL depx&,depy&,depw&,deph&,depart&,arrivee&,valeur& ' objc_offset(adr_hierarchie%,pere&,depx&,depart&) deph&=SUB(OB_H(adr_hierarchie%,pere&),OB_H(adr_hierarchie%,fils&)) arrivee&=PRED(ADD(depart&,deph&)) objc_offset(adr_hierarchie%,fils&,depx&,depy&) depw&=OB_W(adr_hierarchie%,fils&) deph&=OB_H(adr_hierarchie%,fils&) graf_mkstate(global_mx&,global_amy&,global_mk&,kbd&) SUB global_amy&,DIV(deph&,2) global_amy&=-depart&*(global_amy&arrivee&)-global_amy&*(global_amy&>=depart& AND global_amy&<=arrivee&) graf_mouse(main_a_plat&,0) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_my&,DIV(deph&,2) global_my&=-depart&*(global_my&arrivee&)-global_my&*(global_my&>=depart& AND global_my&<=arrivee&) IF global_my&<>global_amy& posy_hierarchie%=ROUND((ABS(SUB(global_my&,depart&))/(SUB(OB_H(adr_hierarchie%,pere&),OB_H(adr_hierarchie%,fils&))))*hauteur_hierarchie%) IF posy_hierarchie%>SUB(hauteur_hierarchie%,OB_H(adr_hierarchie%,hie_sous&)) posy_hierarchie%=SUB(hauteur_hierarchie%,OB_H(adr_hierarchie%,hie_sous&)) ENDIF position_curseur_vertical_hierarchie etat_bouton_hierarchie_vertical(TRUE) redraw_elem(adr_hierarchie%,PRED(pere&)) redraw_elem(adr_hierarchie%,hie_sous&) redessin_hierarchie(FALSE) global_amy&=global_my& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) RETURN > PROCEDURE position_curseur_horizontal_hierarchie LOCAL tail%,pasx,pasy ' IF largeur_hierarchie%<=OB_W(adr_hierarchie%,hie_sous&) OB_W(adr_hierarchie%,hiefilh0&)=OB_W(adr_hierarchie%,hieasch1&) OB_W(adr_hierarchie%,hiefilh1&)=PRED(OB_W(adr_hierarchie%,hiefilh0&)) OB_W(adr_hierarchie%,hiefilh2&)=OB_W(adr_hierarchie%,hieasch1&) OB_X(adr_hierarchie%,hiefilh0&)=0 ob_state(adr_hierarchie%,hiefilh2&,aes_disable&,TRUE) ob_state(adr_hierarchie%,hiegauto&,aes_disable&,TRUE) ob_state(adr_hierarchie%,hiegauch&,aes_disable&,TRUE) ob_state(adr_hierarchie%,hiedroit&,aes_disable&,TRUE) ob_state(adr_hierarchie%,hiedroto&,aes_disable&,TRUE) ELSE pasx=OB_W(adr_hierarchie%,hieasch1&)/largeur_hierarchie% tail%=pasx*OB_W(adr_hierarchie%,hie_sous&) IF tail%<6 tail%=6 ENDIF OB_W(adr_hierarchie%,hiefilh0&)=tail% OB_W(adr_hierarchie%,hiefilh1&)=PRED(tail%) OB_W(adr_hierarchie%,hiefilh2&)=tail% OB_X(adr_hierarchie%,hiefilh0&)=posx_hierarchie%*pasx ob_state(adr_hierarchie%,hiefilh2&,aes_disable&,FALSE) ob_state(adr_hierarchie%,hiegauto&,aes_disable&,FALSE) ob_state(adr_hierarchie%,hiegauch&,aes_disable&,FALSE) ob_state(adr_hierarchie%,hiedroit&,aes_disable&,FALSE) ob_state(adr_hierarchie%,hiedroto&,aes_disable&,FALSE) ENDIF RETURN > PROCEDURE deplace_curseur_horizontal_hierarchie(pere&,fils&) LOCAL depx&,depy&,depw&,deph&,depart&,arrivee&,valeur& ' objc_offset(adr_hierarchie%,pere&,depart&,depy&) depw&=SUB(OB_W(adr_hierarchie%,pere&),OB_W(adr_hierarchie%,fils&)) arrivee&=PRED(ADD(depart&,depw&)) objc_offset(adr_hierarchie%,fils&,depx&,depy&) depw&=OB_W(adr_hierarchie%,fils&) deph&=OB_H(adr_hierarchie%,fils&) graf_mkstate(global_amx&,global_my&,global_mk&,kbd&) SUB global_amx&,DIV(depw&,2) global_amx&=-depart&*(global_amx&arrivee&)-global_amx&*(global_amx&>=depart& AND global_amx&<=arrivee&) graf_mouse(main_a_plat&,0) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_mx&,DIV(depw&,2) global_mx&=-depart&*(global_mx&arrivee&)-global_mx&*(global_mx&>=depart& AND global_mx&<=arrivee&) IF global_mx&<>global_amx& posx_hierarchie%=ROUND((ABS(SUB(global_mx&,depart&))/(SUB(OB_W(adr_hierarchie%,pere&),OB_W(adr_hierarchie%,fils&))))*largeur_hierarchie%) IF posx_hierarchie%>SUB(largeur_hierarchie%,OB_W(adr_hierarchie%,hie_sous&)) posx_hierarchie%=SUB(largeur_hierarchie%,OB_W(adr_hierarchie%,hie_sous&)) ENDIF position_curseur_horizontal_hierarchie etat_bouton_hierarchie_horizontal(TRUE) redraw_elem(adr_hierarchie%,PRED(pere&)) redraw_elem(adr_hierarchie%,hie_sous&) redessin_hierarchie(FALSE) global_amx&=global_mx& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) RETURN ' > PROCEDURE position_curseur_animation(valeur&,ind!) LOCAL pasx,dex&,dey&,dey2&,temp& ' objc_offset(adr_animation%,anime008&,dex&,dey&) dey2&=ADD(dey&,OB_H(adr_animation%,anime008&)) ' IF ind! IF barre_d_anime!=TRUE objc_offset(adr_animation%,anime003&,dex&,temp&) ADD dex&,8 set_writing_mode(mode_xor|) set_type_de_ligne(rouge&,1,0,0,0,-1) line(dex&,dey&,dex&,dey2&) set_writing_mode(mode_remplace|) ENDIF ENDIF ' pasx=SUB(OB_W(adr_animation%,anime002&),OB_W(adr_animation%,anime003&))/255 OB_X(adr_animation%,anime003&)=valeur&*pasx objc_offset(adr_animation%,anime003&,dex&,temp&) ADD dex&,8 IF ind! redraw_elem(adr_animation%,anime002&) set_writing_mode(mode_xor|) set_type_de_ligne(rouge&,1,0,0,0,-1) line(dex&,dey&,dex&,dey2&) barre_d_anime!=TRUE set_writing_mode(mode_remplace|) ENDIF RETURN > PROCEDURE deplace_curseur_animation LOCAL depx&,depy&,depw&,deph&,depart&,arrivee&,valeur& ' objc_offset(adr_animation%,anime002&,depart&,depy&) depw&=SUB(OB_W(adr_animation%,anime002&),OB_W(adr_animation%,anime003&)) arrivee&=ADD(ADD(depart&,depw&),2) objc_offset(adr_animation%,anime003&,depx&,depy&) depw&=OB_W(adr_animation%,anime003&) deph&=OB_H(adr_animation%,anime003&) graf_mouse(main_a_plat&,0) DO graf_mkstate(global_mx&,global_my&,global_mk&,kbd&) SUB global_mx&,DIV(depw&,2) IF global_mx&arrivee& global_mx&=arrivee& ENDIF IF global_mx&<>global_amx& valeur&=ROUND((SUB(global_mx&,depart&)/(SUB(OB_W(adr_animation%,anime002&),OB_W(adr_animation%,anime003&))))*255) valeur&=-valeur&*(valeur&>-1 AND valeur&<256)+0*(valeur&<0)-255*(valeur&>255) position_curseur_anime&=valeur& position_curseur_animation(valeur&,TRUE) global_amx&=global_mx& ENDIF LOOP UNTIL global_mk&=0 graf_mouse(fleche&,0) RETURN ' ***************************** Gestion de la couleur ************************** > PROCEDURE rvb_tsl(ro&,ve&,bl&,VAR teinte&,saturation&,luminosite&) LOCAL max&,min&,d& LOCAL rc,vc,bc,t max&=MAX(ro&,ve&,bl&) min&=MIN(ro&,ve&,bl&) luminosite&=max& d&=max&-min& IF max&=0 saturation&=0 ELSE saturation&=255*d&/max& ENDIF IF saturation&=0 t=0 ELSE rc=(max&-ro&)/d& vc=(max&-ve&)/d& bc=(max&-bl&)/d& IF ro&=max& t=bc-vc ELSE IF ve&=max& t=2+rc-bc ELSE t=4+vc-rc ENDIF teinte&=t*42.6 IF teinte&<0 teinte&=teinte&+254 ENDIF ENDIF RETURN > PROCEDURE tsl_rvb(teinte&,saturation&,luminosite&,VAR ro&,ve&,bl&) LOCAL i&,p&,q&,w& LOCAL t,s,f s=saturation&/256 IF s=0 ro&=luminosite& ve&=luminosite& bl&=luminosite& ELSE t=teinte&/42.6 i&=t f=t-i& p&=luminosite&*(1-s) q&=luminosite&*(1-s*f) w&=luminosite&*(1-s*(1-f)) $S&,$S> SELECT i& CASE 0 ro&=luminosite& ve&=w& bl&=p& CASE 1 ro&=q& ve&=luminosite& bl&=p& CASE 2 ro&=p& ve&=luminosite& bl&=w& CASE 3 ro&=p& ve&=q& bl&=luminosite& CASE 4 ro&=w& ve&=p& bl&=luminosite& CASE 5 ro&=luminosite& ve&=p& bl&=q& ENDSELECT ENDIF RETURN ' ************************ Gestion des fichiers EB MODEL 3 ********************* > FUNCTION nouvelle_scene(ind!) LOCAL taille_univers%,i&,n% IF ind! cl&=1 ELSE IF travail_a_sauver! AND (nombre_d_objets&>0) CLR cl& IF @afficher_alerte(adr_danger%)=2 cl&=1 ENDIF ELSE cl&=1 ENDIF ENDIF IF cl&=1 ' IF buffer_tga_phong% libere(*buffer_tga_phong%) ENDIF ' hierachie_ok!=FALSE fermeture_fenetre(4) ! Halo fermeture_fenetre(6) ! Modification d'objets fermeture_fenetre(8) ! Textures fermeture_fenetre(10) ! Commentaires fermeture_fenetre(16) ! Fonctions/Effacement/Masques/Blobs fermeture_fenetre(32) ! Textures Multiples fermeture_fenetre(38) ! Gouraud/Phong fermeture_fenetre(42) ! Pigments fermeture_fenetre(44) ! Normals fermeture_fenetre(46) ! Finish fermeture_fenetre(52) ! Information objet fermeture_fenetre(60) ! Hi‚rarchie fermeture_fenetre(62) ! Animation ' Vider la s‚lection multiple libere(*deplacement_multiple%) CLR objets_a_deplacer& ' On efface tout les fichiers UNDO s'il y en a ! IF undo_sauver&>0 AND (NOT charger_ancienne!) definition_fichier(adr_parametres%,cheund&,nom_divers%,FALSE,FALSE,-1) membfill(nom_divers%,256,0) FOR i&=1 TO undo_sauver& CHAR{nom_divers%}="und"+RIGHT$("00000"+STR$(i&),5)+".ebs"+CHR$(0) minuscule(nom_divers%) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) IF @s_exist(mem_che%) efface_fichier ENDIF NEXT i& ENDIF membfill(ADD(camera%,52),taille_normal&,0) BYTE{ADD(ADD(camera%,52),2)}=24 ' Remplir tous les octets … l'adresse univers% par des 0 taille_univers%=MUL(limite_des_objets&,taille_objet&) membfill(univers%,taille_univers%,0) libere(*zone_dessin_3d%) libere(*zone_transfert%) ' Effacer les vecteurs normaux i&=PRED(nombre_d_objets&) DO libere(ADD(edge%,SHL(i&,2))) DEC i& LOOP WHILE i&>-1 ' les points de contr“le des carreaux de B‚zier IF nombre_de_carreaux%>0 n%=PRED(nombre_de_carreaux%) DO libere(ADD(pt_control%,SHL(n%,2))) DEC n% LOOP WHILE n%>-1 ENDIF ' les courbe des objets LATHE/S.O.R./PRISM IF nombre_extrude%>0 n%=PRED(nombre_extrude%) DO libere(ADD(courbe_extrude%,SHL(n%,2))) DEC n% LOOP WHILE n%>-1 ENDIF ' les d‚finitions de C.S.G. IF nombre_de_csg%>0 n%=PRED(nombre_de_csg%) DO libere(ADD(liste_csg%,SHL(n%,2))) DEC n% LOOP WHILE n%>-1 ENDIF ' et les d‚finitions de primitives secondaires IF primitive&>13 i&=PRED(primitive&) DO libere(ADD(objet%,SHL(i&,2))) DEC i& LOOP WHILE i&>12 ENDIF ' Remettre les calques … z‚ro CLR i& RESTORE calques_couleurs_defaut n%=nom_calque% ! fin_adr%=ADD(n%,360) ! 10 * 14 octets DO ! READ j& ! CHAR{n%}="Calque Nø"+RIGHT$(" "+STR$(SUCC(i&)),2)+" " ! Nom du calque BYTE{ADD(n%,34)}=j& ! Couleur BYTE{ADD(n%,35)}=0 ! Etat INC i& ! ADD n%,36 ! LOOP WHILE n% PROCEDURE charger_fichier_ebs(ind!) LOCAL l%,nou&,nbp%,nbf%,ob_ac& LOCAL uni%,fin_uni%,csg_cpt%,adresse% LOCAL num_point_control%,av_adr_fc%,av_adr% LOCAL adr_fc%,adr_pt%,adr_pt_ctrl%,adr_f%,taille% LOCAL offset_courbe&,nbp_courbe&,taille_totale% LOCAL type_courbe|,mode_facette|,type_sweep| LOCAL adr_o%,j%,fin_j%,num_ext% LOCAL xj&,yj&,wj&,hj&,pr_f& LOCAL jx&,jy&,jw&,jh&,pasj ' LOCAL memorise%,memorise_ext%,memorise_car%,memorise_csg% LOCAL memo_ext%,memo_car%,memo_csg% LOCAL num_ext%,num_csg%,treh LOCAL un_bicubic!,un_lathe!,un_sor!,un_prism!,un_quartic!,un_quadric! ' IF nombre_d_objets&>0 nou&=@nouvelle_scene(ind!) ELSE nou&=1 hierachie_ok!=FALSE ENDIF IF nou&=1 CHAR{masque%}="ebs"+CHR$(0) IF ind! CHAR{nom_en_cours%}=RIGHT$(CHAR{titre_en_cours%},SUB(LEN(CHAR{titre_en_cours%}),LEN(LEFT$(CHAR{titre_en_cours%},RINSTR(CHAR{titre_en_cours%},"\")))))+CHR$(0) definition_fichier(adr_parametres%,cheebs&,nom_en_cours%,FALSE,FALSE,OB_SPEC(adr_divers%,lin18&)) ELSE definition_fichier(adr_parametres%,cheebs&,nom_en_cours%,FALSE,TRUE,OB_SPEC(adr_divers%,lin18&)) ENDIF ' graf_mouse(m_off&,0) ' IF CHAR{nom_en_cours%}<>"" CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_en_cours%}+CHR$(0) IF @s_exist(mem_che%) IF NOT charger_ancienne! ajout_memoire_scenes(mem_che%) ENDIF CHAR{titre_en_cours%}=CHAR{mem_che%}+CHR$(0) CHAR{{OB_SPEC(adr_fenetre%,fenvue02&)}}=CHAR{titre_en_cours%} IF NOT ind! redraw_element_fenetre(48,adr_fenetre%,fenvue02&) ENDIF CHAR{{OB_SPEC(adr_parametres%,cheebs&)}}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%}+CHR$(0) OPEN "i",#1,CHAR{mem_che%} CLR l% IF NOT @eb_model CLOSE #1 ~@afficher_alerte(adr_no3d2%) ELSE refaire_normales!=TRUE ! Par d‚faut, c'est … recalculer CLR version_charge IF @charger_ebs IF version_charge<3.1 ~@afficher_alerte(adr_memoire_visu%) ~@nouvelle_scene(TRUE) ELSE IF version_charge<3.36 ' -------------------------------------------------------------- ' -- En cas d'ancienne version de fichier, v‚rifions si il n'y ' -- a pas de bicubic, lathe, S.O.R. ou prism... Si il y en a, ' -- alors, il faut les modifier pour la nouvelle m‚thode. ' -------------------------------------------------------------- form_center(adr_anajauge%,xj&,yj&,wj&,hj&) form_dial(0,xj&,yj&,wj&,hj&,xj&,yj&,wj&,hj&) pr_f&=@wind_create(0,px&,py&,pw&,ph&) IF pr_f&>-1 wind_open(pr_f&,px&,py&,pw&,ph&) ENDIF objc_draw(adr_anajauge%,0,12,xj&,yj&,wj&,hj&,-1) objc_offset(adr_anajauge%,anaboite&,jx&,jy&) jw&=OB_W(adr_anajauge%,anaboite&) jh&=OB_H(adr_anajauge%,anaboite&) pasj=jw&/nombre_d_objets& ' CLR nombre_de_carreaux%,nombre_extrude% memorise%=@prendre(MUL(3,SHL(nombre_d_objets&,1)),TRUE,3) adresse%=memorise% ' adresse%=SHL(SHR(ADD(memorise%,15),4),4) memorise_ext%=@zone(SHL(nombre_d_objets&,1),adresse%) memorise_car%=@zone(SHL(nombre_d_objets&,1),adresse%) memorise_csg%=@zone(SHL(nombre_d_objets&,1),adresse%) ' memo_ext%=memorise_ext% memo_car%=memorise_car% memo_csg%=memorise_csg% CLR objet_actif& uni%=univers% set_remplissage(4,0,rouge&,tracer_trame_jauge%) set_fill_perimeter_visibility(0) set_writing_mode(mode_transparent|) DO un_bicubic!=BTST(BYTE{ADD(uni%,offset_drapeau0&)},bit_bicubic|) un_lathe!=BTST(BYTE{ADD(uni%,offset_drapeau1&)},bit_lathe|) un_sor!=BTST(BYTE{ADD(uni%,offset_drapeau1&)},bit_sor|) un_prism!=BTST(BYTE{ADD(uni%,offset_drapeau1&)},bit_prisme|) un_quartic!=BTST(BYTE{ADD(uni%,offset_drapeau1&)},bit_quartic|) un_quadric!=BTST(BYTE{ADD(uni%,offset_drapeau1&)},bit_quadric|) ' ~~~~ Un carreaux de b‚zier ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IF un_bicubic! refaire_normales!=TRUE IF @deja_memorise(memorise_car%,nombre_de_carreaux%,INT{uni%})>-1 ' av_adr%=@adresse_point_control(CARD{ADD(uni%,offset_force_blob&)}) av_adr_fc%=@adresse_point(INT{uni%}) nbp%=SUCC(CARD{av_adr_fc%}) nbf%=SUCC(CARD{@adresse_face(av_adr_fc%)}) ' INT{uni%}=primitive& INC primitive& ' INT{memo_car%}=INT{uni%} ADD memo_car%,2 ' num_point_control%=nombre_de_carreaux% ' Num‚ro d'index des points de contr“le CARD{ADD(uni%,offset_force_blob&)}=num_point_control% INC nombre_de_carreaux% ' Nouvelle adresse des points de contr“le {ADD(pt_control%,SHL(num_point_control%,2))}=@prendre(198,TRUE,3) adr_pt_ctrl%=@adresse_point_control(num_point_control%) bmove(av_adr%,adr_pt_ctrl%,198) ' taille%=ADD(ADD(2,MUL(nbp%,12)),ADD(2,MUL(nbf%,6))) ' {ADD(objet%,SHL&(INT{uni%},2))}=@prendre(taille%,TRUE,3) adr_pt%=@adresse_point(INT{uni%}) ' bmove(av_adr_fc%,adr_pt%,taille%) ' ELSE ' INT{memo_car%}=INT{uni%} ADD memo_car%,2 ' num_point_control%=nombre_de_carreaux% ' Num‚ro d'index des points de contr“le CARD{ADD(uni%,offset_force_blob&)}=num_point_control% INC nombre_de_carreaux% ' Nouvelle adresse des points de contr“le {ADD(pt_control%,SHL(num_point_control%,2))}=@prendre(198,TRUE,3) ' adr_pt%=@adresse_point(INT{uni%}) adr_fc%=@adresse_face(adr_pt%) adr_pt_ctrl%=@adresse_point_control(num_point_control%) bmove(ADD(adr_pt%,974),adr_pt_ctrl%,198) afficher_les_points_bicubic(uni%,FALSE) recupere_les_points_bicubic(uni%) ' ' Nouvelle taille de l'objet par MSHRINK ~GEMDOS(&H4A,0,L:adr_pt%,L:1360) ' CARD{adr_pt%}=63 adr_fac%=@adresse_face(adr_pt%) CARD{adr_fac%}=97 ' modif_bez!=TRUE generation_de_bicubic modif_bez!=FALSE ENDIF ' ' ~~~~ Un LATHE / Un S.O.R. / Un PRISM ~~~~~~~~~~~~~~~~~~~~~ ELSE IF un_lathe! OR un_sor! OR un_prism! refaire_normales!=TRUE ' num_ext%=@deja_memorise(memorise_ext%,nombre_extrude%,INT{uni%}) IF num_ext%=-1 ' adr_pt%=@adresse_point(INT{uni%}) ! Les points adr_fc%=@adresse_face(adr_pt%) ! Les faces ' INT{memo_ext%}=INT{uni%} ADD memo_ext%,2 ' type_courbe|=BYTE{ADD(uni%,offset_force_blob&)} mode_facette|=BYTE{ADD(ADD(uni%,offset_force_blob&),1)} type_sweep|=BYTE{ADD(ADD(uni%,offset_force_blob&),2)} ' num_point_control%=nombre_extrude% ' Num‚ro d'index des points de contr“le CARD{ADD(uni%,offset_force_blob&)}=num_point_control% INC nombre_extrude% ' nbp%=SUCC(CARD{adr_pt%}) nbf%=SUCC(CARD{adr_fc%}) taille_totale%=ADD(ADD(2,MUL(nbp%,12)),ADD(2,MUL(nbf%,6))) ' DerniŠre face adr_f%=ADD(ADD(adr_fc%,2),MUL(PRED(nbf%),6)) IF mode_facette|<>1 IF CARD{ADD(adr_f%,2)}-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ELSE IF version_charge<3.51 ' -------------------------------------------------------------- ' -- En cas d'ancienne version de fichier, v‚rifions si il n'y ' -- a pas de bicubic. Si il y en a, alors, il faut les ' -- modifier pour la nouvelle m‚thode. ' -------------------------------------------------------------- uni%=univers% CLR objet_actif& fin_uni%=@adresse_objet(nombre_d_objets&) DO un_bicubic!=BTST(BYTE{ADD(uni%,offset_drapeau0&)},bit_bicubic|) ' ~~~~ Un carreaux de b‚zier ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IF un_bicubic! ' afficher_les_points_bicubic(uni%,FALSE) recupere_les_points_bicubic(uni%) ' adr_poi%=@adresse_point(INT{uni%}) ~GEMDOS(&H4A,0,L:adr_poi%,L:1360) CARD{adr_poi%}=63 adr_fac%=@adresse_face(adr_poi%) CARD{adr_fac%}=97 ' modif_bez!=TRUE generation_de_bicubic modif_bez!=FALSE ' ENDIF ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INC objet_actif& ADD uni%,taille_objet& LOOP WHILE uni% FUNCTION charger_ebs LOCAL l%,lo%,sor! sor!=TRUE DO lire_un_chunk(l%,lo%) sor!=@analyse_chunk(l%,lo%) EXIT IF NOT sor! EXIT IF LOC(#1)=>LOF(#1) LOOP CLOSE #1 RETURN sor! ENDFUNC > FUNCTION analyse_chunk(l%,lo%) LOCAL i&,nb_pr&,t% LOCAL nbs&,taille%,adr_sr%,nbi% LOCAL taille_obj%,taille_lum% LOCAL taille_cam%,adr_pos%,cp_t& LOCAL adr_cam%,adr_lum%,fin_sr% LOCAL nbp%,nbf%,adr_poi%,adr_fac% $S$,$S> SELECT MKL$(l%) CASE "VERS" ! *********************** BGET #1,commande%,4 version_charge=VAL(CHAR{commande%}) IF version_charge<3.1 ~@afficher_alerte(adr_memoire_visu%) RETURN FALSE ENDIF CASE "GENE" ! *********************** BGET #1,V:nombre_d_objets&,2 IF nombre_d_objets&=>limite_des_objets& ~@afficher_alerte(adr_depasse%) membfill(coord_polygon%,1024,0) CHAR{coord_polygon%}="[1][ "+STR$(nombre_d_objets&)+" objets trouv‚s | dans le fichier | "+STR$(nombre_d_objets&)+" objects find | in file ][ Ok ]" ~@afficher_alerte(coord_polygon%) CLOSE #1 ~@nouvelle_scene(TRUE) RETURN FALSE ENDIF BGET #1,V:nb_pr&,2 ADD primitive&,nb_pr& BGET #1,V:nbs&,2 IF nbs&<>nombre_de_source& IF nbs&=0 nbs&=2 ENDIF i&=nombre_de_source& nombre_de_source&=nbs& IF nombre_de_source&>i& IF NOT @nouvelle_zone_source(MUL(i&,taille_source&),FALSE) nombre_de_source&=i& ENDIF ELSE IF NOT @nouvelle_zone_source(MUL(nombre_de_source&,taille_source&),FALSE) nombre_de_source&=i& ENDIF ENDIF ENDIF taille_zone_lumiere%=MUL(nombre_de_source&,taille_source&) ' BGET #1,ligne_comment1%,66 BGET #1,ligne_comment2%,66 BGET #1,ligne_comment3%,66 BGET #1,ligne_comment4%,66 BGET #1,ligne_comment5%,66 IF primitive&>13 i&=13 DO BGET #1,V:t%,4 {ADD(objet%,SHL(i&,2))}=@prendre(t%,TRUE,3) INC i& LOOP WHILE i&taille%) OR refaire_normales! refaire_normales!=TRUE ! Donc, au moindre problŠme, on r‚active le flag RELSEEK #1,taille% ELSE {ADD(edge%,SHL(cp_t&,2))}=@prendre(taille%,TRUE,3) t%=@adresse_edge(cp_t&) BGET #1,t%,taille% ENDIF INC cp_t& LOOP WHILE cp_t& PROCEDURE lire_un_chunk(VAR l%,lo%) BGET #1,V:l%,4 BGET #1,V:lo%,4 RETURN > FUNCTION deja_memorise(adr%,tot%,pri&) LOCAL mm%,cptm% IF tot%=0 RETURN -1 ELSE CLR cptm% mm%=adr% DO IF INT{mm%}=pri& RETURN cptm% ENDIF ADD mm%,2 INC cptm% LOOP WHILE cptm% FUNCTION eb_model LOCAL l%,lo% BGET #1,V:l%,4 IF MKL$(l%)<>"FORM" RETURN FALSE ELSE BGET #1,V:lo%,4 taille_fichier%=lo% BGET #1,V:l%,4 BGET #1,V:lo%,4 RELSEEK #1,lo% IF MKL$(l%)<>"EB_M" RETURN FALSE ELSE RETURN TRUE ENDIF ENDIF ENDFUNC ' ..................... Sauvegarde de fichier EBS .............................. > PROCEDURE sauver_fichier_ebs CHAR{nom_en_cours%}=RIGHT$(CHAR{titre_en_cours%},SUB(LEN(CHAR{titre_en_cours%}),LEN(LEFT$(CHAR{titre_en_cours%},RINSTR(CHAR{titre_en_cours%},"\")))))+CHR$(0) definition_fichier(adr_parametres%,cheebs&,nom_en_cours%,FALSE,TRUE,OB_SPEC(adr_divers%,lin20&)) IF LEN(CHAR{nom_en_cours%})<>0 membfill(mem_che%,512,0) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_en_cours%}+CHR$(0) IF @s_exist(mem_che%) membfill(titre_en_cours%,512,0) CHAR{titre_en_cours%}=CHAR{mem_che%} CHAR{{OB_SPEC(adr_parametres%,cheebs&)}}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%}+CHR$(0) IF @afficher_alerte(adr_existe%)=1 sauvegarde_fichiers_ebs(TRUE) ENDIF ELSE membfill(titre_en_cours%,512,0) CHAR{titre_en_cours%}=CHAR{mem_che%} CHAR{{OB_SPEC(adr_parametres%,cheebs&)}}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%}+CHR$(0) sauvegarde_fichiers_ebs(TRUE) ENDIF ENDIF RETURN > PROCEDURE sauvegarde_fichiers_ebs(ind!) LOCAL l%,l&,i&,i%,nb_ob&,nb_pr& LOCAL xj&,yj&,wj&,hj&,pr_f& LOCAL jx&,jy&,jw&,jh& LOCAL adr_fac%,adr_poi% LOCAL adr_p1%,adr_f1% LOCAL nbp%,nbf%,nbi% LOCAL tai_p%,tai_f%,uni%,cp_t& LOCAL taille%,taille_secondaire% LOCAL taille_zone_lumiere%,pasj LOCAL mem_pos%,longueur_fichier% ' IF ind! definition_fichier(adr_parametres%,cheebs&,nom_en_cours%,FALSE,FALSE,-1) extend(nom_en_cours%,masque%,nom_en_cours%) membfill(mem_che%,512,0) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_en_cours%}+CHR$(0) membfill(titre_en_cours%,512,0) CHAR{titre_en_cours%}=CHAR{mem_che%} backup(mem_che%) ENDIF CHAR{{OB_SPEC(adr_fenetre%,fenvue02&)}}=CHAR{titre_en_cours%} redraw_element_fenetre(48,adr_fenetre%,fenvue02&) form_center(adr_anajauge%,xj&,yj&,wj&,hj&) form_dial(0,xj&,yj&,wj&,hj&,xj&,yj&,wj&,hj&) ' pr_f&=@wind_create(0,px&,py&,pw&,ph&) IF pr_f&>-1 wind_open(pr_f&,px&,py&,pw&,ph&) ENDIF graf_mouse(m_off&,0) ' objc_draw(adr_anajauge%,0,12,xj&,yj&,wj&,hj&,-1) objc_offset(adr_anajauge%,anaboite&,jx&,jy&) jw&=OB_W(adr_anajauge%,anaboite&) jh&=OB_H(adr_anajauge%,anaboite&) ' longueur_fichier%=@taille_totale_fichier pasj=jw&/longueur_fichier% ' ' ****** L'entˆte, les lignes d'info, les objets, la cam‚ra, le brouillard, la ' ****** couleur de fond et la texture par d‚faut IF NOT charger_ancienne! ajout_memoire_scenes(mem_che%) ENDIF set_remplissage(4,0,rouge&,tracer_trame_jauge%) set_fill_perimeter_visibility(0) set_writing_mode(mode_transparent|) OPEN "o",#1,CHAR{mem_che%} ' ************** Le chunk "FORM" ************** l%=CVL("FORM") BPUT #1,V:l%,4 ! chunk "FORM" mem_pos%=LOC(#1) l%=0 BPUT #1,V:l%,4 ! longueur du fichier vdi_11(1,jx&,jy&,jx&+(LOC(#1)*pasj),PRED(ADD(jy&,jh&)),0,0,0,0) ' ************** Le chunk "EB_M" ************** l%=CVL("EB_M") BPUT #1,V:l%,4 ! chunk "EB_M" membfill(commande%,272,0) CHAR{commande%}="Fichier cr‚‚ par EB_MODEL "+CHAR{version%}+" du "+CHAR{date%} l%=LEN(CHAR{commande%}) BPUT #1,V:l%,4 ! Taille des donn‚es BPUT #1,commande%,l% vdi_11(1,jx&,jy&,jx&+(LOC(#1)*pasj),PRED(ADD(jy&,jh&)),0,0,0,0) ' ************** Le chunk "VERS" ************** l%=CVL("VERS") BPUT #1,V:l%,4 ! chunk "VERS" membfill(commande%,272,0) CHAR{commande%}=LEFT$(CHAR{version%},4) l%=LEN(CHAR{commande%}) BPUT #1,V:l%,4 ! Taille des donn‚es BPUT #1,commande%,l% vdi_11(1,jx&,jy&,jx&+(LOC(#1)*pasj),PRED(ADD(jy&,jh&)),0,0,0,0) ' ************** Le chunk "GENE" ************** l%=CVL("GENE") BPUT #1,V:l%,4 ! chunk "GENE" nb_pr&=SUB(primitive&,13) l%=336+(nb_pr&*4) BPUT #1,V:l%,4 ! Taille des donn‚es l&=nombre_d_objets& BPUT #1,V:l&,2 ! Nombre d'objets l&=nb_pr& BPUT #1,V:l&,2 ! Nombre d'objets ‚tendus l&=nombre_de_source& BPUT #1,V:l&,2 ! Nombre de sources BPUT #1,ligne_comment1%,66 ! Ligne de commentaire Nø1 BPUT #1,ligne_comment2%,66 ! Ligne de commentaire Nø2 BPUT #1,ligne_comment3%,66 ! Ligne de commentaire Nø3 BPUT #1,ligne_comment4%,66 ! Ligne de commentaire Nø4 BPUT #1,ligne_comment5%,66 ! Ligne de commentaire Nø5 IF primitive&>13 CLR taille_secondaire% i&=13 DO adr_poi%=@adresse_point(i&) adr_fac%=@adresse_face(adr_poi%) nbp%=SUCC(CARD{adr_poi%}) nbf%=SUCC(CARD{adr_fac%}) taille%=ADD(ADD(MUL(nbp%,12),2),ADD(MUL(nbf%,6),2)) l%=taille% BPUT #1,V:l%,4 ADD taille_secondaire%,ADD(4,taille%) vdi_11(1,jx&,jy&,jx&+(LOC(#1)*pasj),PRED(ADD(jy&,jh&)),0,0,0,0) INC i& LOOP WHILE i&13 l%=CVL("ETEN") BPUT #1,V:l%,4 ! chunk "ETEN" l%=taille_secondaire% BPUT #1,V:l%,4 ! Taille des donn‚es i&=13 DO adr_poi%=@adresse_point(i&) adr_fac%=@adresse_face(adr_poi%) nbp%=SUCC(CARD{adr_poi%}) nbf%=SUCC(CARD{adr_fac%}) taille%=ADD(ADD(MUL(nbp%,12),2),ADD(MUL(nbf%,6),2)) l%=taille% BPUT #1,V:l%,4 BPUT #1,adr_poi%,taille% vdi_11(1,jx&,jy&,jx&+(LOC(#1)*pasj),PRED(ADD(jy&,jh&)),0,0,0,0) INC i& LOOP WHILE i&0 l%=CVL("CTRL") BPUT #1,V:l%,4 ! chunk "CTRL" l%=MUL(nombre_de_carreaux%,198) BPUT #1,V:l%,4 ! Taille des donn‚es CLR i% DO adr_poi%=@adresse_point_control(i%) BPUT #1,adr_poi%,198 INC i% vdi_11(1,jx&,jy&,jx&+(LOC(#1)*pasj),PRED(ADD(jy&,jh&)),0,0,0,0) LOOP WHILE i%0 l%=CVL("EXTR") BPUT #1,V:l%,4 ! chunk "EXTR" ' CLR i%,l% ! Ici, on fait la somme des tailles des objets DO ! LATHE/SOR/PRISM adr_poi%=@adresse_point_extrude(i%) nbp%=SUCC(CARD{adr_poi%}) taille%=ADD(ADD(2,SHL(nbp%,2)),4) ADD l%,taille% ' INC i% LOOP WHILE i%0 l%=CVL("BOOL") BPUT #1,V:l%,4 ! chunk "BOOL" ' CLR i%,l% ! Ici, on fait la somme des tailles des listes DO ! d'objets des C.S.G. adr_poi%=@adresse_liste_csg(i%) nbp%=CARD{adr_poi%} taille%=ADD(ADD(2,SHL(nbp%,2)),6) ADD l%,taille% ' INC i% LOOP WHILE i%-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' travail_a_sauver!=FALSE redraw_force(idx_info&,idx_animation&) ' RETURN ' > FUNCTION taille_totale_fichier LOCAL tai%,l%,taille_secondaire%,i&,nbo% LOCAL adr_poi%,adr_fac%,nbp%,nbf%,taille%,uni% LOCAL adr_p1%,adr_f1%,tai_p%,tai_f%,taille_zone_lumiere% ' ************** Le chunk "FORM" ************** tai%=4 ! chunk "FORM" ADD tai%,4 ! longueur du fichier ' ************** Le chunk "EB_M" ************** ADD tai%,4 ! chunk "EB_M" membfill(commande%,272,0) CHAR{commande%}="Fichier cr‚‚ par EB_MODEL "+CHAR{version%}+" du "+CHAR{date%} l%=LEN(CHAR{commande%}) ADD tai%,4 ! Taille des donn‚es ADD tai%,l% ' ************** Le chunk "VERS" ************** ADD tai%,4 ! chunk "VERS" membfill(commande%,272,0) CHAR{commande%}="3.13" l%=LEN(CHAR{commande%}) ADD tai%,4 ! Taille des donn‚es ADD tai%,l% ' ************** Le chunk "GENE" ************** ADD tai%,4 ! chunk "GENE" ADD tai%,4 ! Taille des donn‚es ADD tai%,2 ! Nombre d'objets ADD tai%,2 ! Nombre d'objets ‚tendus ADD tai%,2 ! Nombre de sources ADD tai%,66 ADD tai%,66 ADD tai%,66 ADD tai%,66 ADD tai%,66 CLR taille_secondaire% IF primitive&>13 i&=13 DO adr_poi%=@adresse_point(i&) adr_fac%=@adresse_face(adr_poi%) nbp%=SUCC(CARD{adr_poi%}) nbf%=SUCC(CARD{adr_fac%}) taille%=ADD(ADD(MUL(nbp%,12),2),ADD(MUL(nbf%,6),2)) l%=taille% ADD tai%,4 ADD taille_secondaire%,ADD(4,taille%) INC i& LOOP WHILE i&0 ADD tai%,4 ! chunk "CTRL" l%=MUL(nombre_de_carreaux%,198) ADD tai%,4 ! Taille des donn‚es ADD tai%,l% ENDIF ' ************** Le chunk "EXTR" ************** IF nombre_extrude%>0 ADD tai%,4 ! chunk "EXTR" ADD tai%,4 ! Taille des donn‚es ADD tai%,4 ! Nombre d'objet LATHE/SOR/PRISM CLR i%,l% DO adr_poi%=@adresse_point_extrude(i%) nbp%=SUCC(CARD{adr_poi%}) taille%=ADD(ADD(2,SHL(nbp%,2)),4) ADD tai%,taille% ' INC i% LOOP WHILE i%0 ADD tai%,4 ! chunk "BOOL" ADD tai%,4 ! Taille des donn‚es ADD tai%,4 ! Nombre d'objet C.S.G CLR i%,l% DO adr_poi%=@adresse_liste_csg(i%) nbp%=CARD{adr_poi%} taille%=ADD(ADD(2,SHL(nbp%,2)),6) ADD tai%,taille% ' INC i% LOOP WHILE i%13 ADD tai%,4 ! chunk "ETEN" l%=taille_secondaire% ADD tai%,4 ! Taille des donn‚es i&=13 DO adr_poi%=@adresse_point(i&) adr_fac%=@adresse_face(adr_poi%) nbp%=SUCC(CARD{adr_poi%}) nbf%=SUCC(CARD{adr_fac%}) taille%=ADD(ADD(MUL(nbp%,12),2),ADD(MUL(nbf%,6),2)) l%=taille% ADD tai%,4 ADD tai%,taille% INC i& LOOP WHILE i& PROCEDURE charger_fichier_bic LOCAL i&,var LOCAL flatness& LOCAL type&,t& LOCAL steps& CHAR{masque%}="bic"+CHR$(0) definition_fichier(adr_parametres%,che3d2&,nom_divers%,FALSE,TRUE,OB_SPEC(adr_divers%,lin21&)) IF CHAR{nom_divers%}<>"" membfill(mem_che%,512,0) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) IF @s_exist(mem_che%) CHAR{{OB_SPEC(adr_parametres%,che3d2&)}}=CHAR{disque%}+CHAR{path%}+"*.*" OPEN "i",#1,CHAR{mem_che%} FOR i&=somx01& TO somz16& INPUT #1,var CHAR{{OB_SPEC(adr_bicubics%,i&)}}=STR$(var,10,3) redraw_elem(adr_bicubics%,i&) NEXT i& INPUT #1,flatness& INPUT #1,steps& INPUT #1,type& CLOSE #1 CHAR{{OB_SPEC(adr_bicubics%,SUB(niv01&,2))}}=STR$(flatness&,1) CHAR{{OB_SPEC(adr_bicubics%,SUB(sou01&,2))}}=STR$(steps&,1) ob_state(adr_bicubics%,fraopt&,aes_selected&,(type&=1)) redraw_elem(adr_bicubics%,niv01&) redraw_elem(adr_bicubics%,sou01&) redraw_elem(adr_bicubics%,fraopt&) ELSE ~@afficher_alerte(adr_notrouve%) ENDIF ENDIF RETURN > PROCEDURE sauver_fichier_bic LOCAL i& LOCAL flatness& LOCAL type& LOCAL steps& CHAR{masque%}="bic"+CHR$(0) definition_fichier(adr_parametres%,che3d2&,nom_divers%,FALSE,TRUE,OB_SPEC(adr_divers%,lin22&)) IF CHAR{nom_divers%}<>"" membfill(mem_che%,512,0) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) IF @s_exist(mem_che%) CHAR{{OB_SPEC(adr_parametres%,che3d2&)}}=CHAR{disque%}+CHAR{path%}+"*.*" IF @afficher_alerte(adr_existe%)=1 backup(mem_che%) OPEN "o",#1,CHAR{mem_che%} FOR i&=somx01& TO somz16& PRINT #1,ROUND(VAL(CHAR{{OB_SPEC(adr_bicubics%,i&)}}),3) NEXT i& PRINT #1,VAL(CHAR{{OB_SPEC(adr_bicubics%,SUB(niv01&,2))}}) PRINT #1,VAL(CHAR{{OB_SPEC(adr_bicubics%,SUB(sou01&,2))}}) type&=0 IF BTST(OB_STATE(adr_bicubics%,fraopt&),aes_selected&) type&=1 ENDIF PRINT #1,type& CLOSE #1 ENDIF ELSE OPEN "o",#1,CHAR{mem_che%} FOR i&=somx01& TO somz16& PRINT #1,ROUND(VAL(CHAR{{OB_SPEC(adr_bicubics%,i&)}}),3) NEXT i& PRINT #1,VAL(CHAR{{OB_SPEC(adr_bicubics%,SUB(niv01&,2))}}) PRINT #1,VAL(CHAR{{OB_SPEC(adr_bicubics%,SUB(sou01&,2))}}) type&=0 IF BTST(OB_STATE(adr_bicubics%,fraopt&),aes_selected&) type&=1 ENDIF PRINT #1,type& CLOSE #1 ENDIF ENDIF RETURN ' ..................... Chargement/Sauvegarde des QUARTIC/QUADRIC .............. > PROCEDURE charger_fichier_qut_qud(adr_arb%,deb&,fin&,nom&) LOCAL i&,l%,var IF adr_arb%=adr_quartic% CHAR{masque%}="QUT"+CHR$(0) CHAR{{OB_SPEC(adr_arb%,nom&)}}="" definition_fichier(adr_parametres%,che3d2&,nom_divers%,FALSE,TRUE,OB_SPEC(adr_divers%,lin27&)) ELSE CHAR{masque%}="QUD"+CHR$(0) CHAR{{OB_SPEC(adr_arb%,nom&)}}="" definition_fichier(adr_parametres%,che3d2&,nom_divers%,FALSE,TRUE,OB_SPEC(adr_divers%,lin29&)) ENDIF minuscule(masque%) IF CHAR{nom_divers%}<>"" membfill(mem_che%,512,0) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) IF @s_exist(mem_che%) CHAR{{OB_SPEC(adr_parametres%,che3d2&)}}=CHAR{disque%}+CHAR{path%}+"*.*" OPEN "i",#1,CHAR{mem_che%} INPUT #1,l% membfill(coord_polygon%,100,0) BGET #1,coord_polygon%,l% CHAR{{OB_SPEC(adr_arb%,nom&)}}=LEFT$(CHAR{coord_polygon%}+SPACE$(22),22) FOR i&=deb& TO fin& INPUT #1,var CHAR{{OB_SPEC(adr_arb%,i&)}}=STR$(var,9,3) redraw_elem(adr_arb%,i&) NEXT i& CLOSE #1 redraw_elem(adr_arb%,nom&) ELSE ~@afficher_alerte(adr_notrouve%) ENDIF ENDIF RETURN > PROCEDURE sauver_fichier_qut_qud(adr_arb%,deb&,fin&,nom&) LOCAL i&,l% IF adr_arb%=adr_quartic% CHAR{masque%}="QUT"+CHR$(0) CHAR{msq%}="QKT"+CHR$(0) definition_fichier(adr_parametres%,che3d2&,nom_divers%,FALSE,TRUE,OB_SPEC(adr_divers%,lin28&)) ELSE CHAR{masque%}="QUD"+CHR$(0) CHAR{msq%}="QKD"+CHR$(0) definition_fichier(adr_parametres%,che3d2&,nom_divers%,FALSE,TRUE,OB_SPEC(adr_divers%,lin30&)) ENDIF minuscule(masque%) IF CHAR{nom_divers%}<>"" membfill(mem_che%,512,0) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) IF @s_exist(mem_che%) CHAR{{OB_SPEC(adr_parametres%,che3d2&)}}=CHAR{disque%}+CHAR{path%}+"*.*" IF @afficher_alerte(adr_existe%)=1 backup(mem_che%) OPEN "o",#1,CHAR{mem_che%} l%=LEN(TRIM$(CHAR{{OB_SPEC(adr_arb%,nom&)}})) PRINT #1,l% BPUT #1,{OB_SPEC(adr_arb%,nom&)},l% FOR i&=deb& TO fin& PRINT #1,VAL(CHAR{{OB_SPEC(adr_arb%,i&)}}) NEXT i& CLOSE #1 ENDIF ELSE OPEN "o",#1,CHAR{mem_che%} l%=LEN(CHAR{{OB_SPEC(adr_arb%,nom&)}}) PRINT #1,l% BPUT #1,{OB_SPEC(adr_arb%,nom&)},l% FOR i&=deb& TO fin& PRINT #1,VAL(CHAR{{OB_SPEC(adr_arb%,i&)}}) NEXT i& CLOSE #1 ENDIF ENDIF RETURN ' ..................... Gestion des derniŠres scŠnes travaill‚es ............... > PROCEDURE ajout_memoire_scenes(me%) LOCAL i&,m%,a%,tr! tr!=FALSE m%=memoire_scenes% CLR i& DO IF CHAR{m%}=CHAR{OB_SPEC(adr_divers%,nbiman&)} ' L…, on a trouver une place libre dans la liste, on la remplie CHAR{m%}=CHAR{me%} ENDIF IF CHAR{m%}=CHAR{me%} ' Si le nom est d‚j… dans la liste, on sort (pour le cas pr‚c‚dent aussi) tr!=TRUE ENDIF EXIT IF tr! ADD m%,512 INC i& LOOP WHILE i&<6 IF NOT tr! ' Puisqu'il n'y a plus de place, on d‚cale tous les noms bmove(ADD(memoire_scenes%,512),memoire_scenes%,512) bmove(ADD(memoire_scenes%,1024),ADD(memoire_scenes%,512),512) bmove(ADD(memoire_scenes%,1536),ADD(memoire_scenes%,1024),512) bmove(ADD(memoire_scenes%,2048),ADD(memoire_scenes%,1536),512) bmove(ADD(memoire_scenes%,2560),ADD(memoire_scenes%,2048),512) ' Et on remplace le dernier par le nouveau CHAR{ADD(memoire_scenes%,2560)}=CHAR{me%} ENDIF assigner_les_anciennes_scenes RETURN > PROCEDURE charger_une_ancienne_scene(rep&) LOCAL m% IF CHAR{ADD(memoire_scenes%,SHL(rep&,9))}<>CHAR{OB_SPEC(adr_divers%,nbiman&)} ~@nouvelle_scene(TRUE) CHAR{masque%}="ebs"+CHR$(0) membfill(titre_en_cours%,512,0) bmove(ADD(memoire_scenes%,SHL(rep&,9)),titre_en_cours%,512) ' Extraire le disque du chemin sp‚cifi‚ CHAR{disque%}=LEFT$(CHAR{titre_en_cours%},2) ' Extraire le chemin proprement dit membfill(path%,272,0) CHAR{path%}=RIGHT$(LEFT$(CHAR{titre_en_cours%},RINSTR(CHAR{titre_en_cours%},"\")),SUB(LEN(LEFT$(CHAR{titre_en_cours%},RINSTR(CHAR{titre_en_cours%},"\"))),2)) ' Si extraire le nom du fichier CHAR{nom_mouvement%}=MID$(CHAR{titre_en_cours%},SUCC(RINSTR(CHAR{titre_en_cours%},"\")),LEN(LEFT$(CHAR{titre_en_cours%},RINSTR(CHAR{titre_en_cours%},"\")))) ' CHAR{{OB_SPEC(adr_parametres%,cheebs&)}}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%}+CHR$(0) ' charger_ancienne!=TRUE charger_fichier_ebs(TRUE) mise_a_jour_des_chemins_et_nom_de_fichier mise_a_jour_de_l_objet_actif(TRUE) charger_ancienne!=FALSE ENDIF RETURN > PROCEDURE assigner_les_anciennes_scenes LOCAL i&,o&,m%,a% o&=ancsce01& m%=memoire_scenes% CLR i& DO a%={OB_SPEC(adr_popup_divers%,o&)} IF LEN(CHAR{m%})<=30 CHAR{a%}=CHAR{m%} ELSE CHAR{a%}=LEFT$(CHAR{m%},13)+"..."+RIGHT$(CHAR{m%},14) ENDIF ADD m%,512 INC o& INC i& LOOP WHILE i&<6 RETURN ' > PROCEDURE charger_6_dernieres_scenes ! Lire "6_SCENES.CFG" LOCAL i&,termine! minuscule(mem_che%) OPEN "i",#1,CHAR{mem_che%} IF LOF(#1) DO membfill(mem_che%,512,0) termine!=@lire_une_ligne(mem_che%) EXIT IF LEFT$(CHAR{mem_che%},3)="EOF" IF LEN(CHAR{mem_che%})>1 $S$,$S> SELECT LEFT$(CHAR{mem_che%},3) CASE "6_1","6_2","6_3","6_4","6_5","6_6" i&=PRED(VAL(RIGHT$(LEFT$(CHAR{mem_che%},3),1))) enleve_code(mem_che%) CHAR{ADD(memoire_scenes%,SHL(i&,9))}=CHAR{mem_che%} ENDSELECT ENDIF EXIT IF termine! LOOP ENDIF CLOSE #1 assigner_les_anciennes_scenes RETURN > PROCEDURE sauver_les_6_scenes ! et sauvegarde LOCAL i&,m% ' ---------------------------------------------------------------------------- OPEN "o",#1,CHAR{eb_temp%}+"\6_scenes.mem"+CHR$(0) PRINT #1,"# Les 6 derniŠres scŠnes charger dans EB_MODEL se trouvent" PRINT #1,"# indiqu‚es ici avec leur nom et leu chemin." PRINT #1,"#" PRINT #1,"#(c) BARANGER Emmanuel - EB_MODEL "+CHAR{version%}+" du "+CHAR{date%} m%=memoire_scenes% i&=1 DO PRINT #1,"6_"+STR$(i&,1)+" "+CHAR{m%} ADD m%,512 INC i& LOOP WHILE i&<7 PRINT #1,"EOF" PRINT #1,"" CLOSE #1 RETURN ' ..................... Chargement/Sauvegarde des paramŠtres ................... > PROCEDURE charger_parametres ! Lire "EB_MODEL.CFG" LOCAL racc%,l%,i&,v|,mem_larg&,mem_haut&,termine!,racc%,niv_det ' OPEN "i",#1,CHAR{eb_temp%}+"\eb_model.cfg" IF LOF(#1) CHAR{{OB_SPEC(adr_parametres%,cheebs&)}}="" CHAR{{OB_SPEC(adr_parametres%,chepov&)}}="" CHAR{{OB_SPEC(adr_parametres%,cheimg&)}}="" CHAR{{OB_SPEC(adr_parametres%,chettp&)}}="" CHAR{{OB_SPEC(adr_parametres%,chetxt&)}}="" CHAR{{OB_SPEC(adr_parametres%,chevis&)}}="" CHAR{{OB_SPEC(adr_parametres%,cheund&)}}="" CHAR{{OB_SPEC(adr_parametres%,cheinc&)}}="" CHAR{{OB_SPEC(adr_parametres%,che3d2&)}}="" CHAR{{OB_SPEC(adr_parametres%,cheext&)}}="" CHAR{{OB_SPEC(adr_lanceur%,povbuffe&)}}="" CHAR{{OB_SPEC(adr_lanceur%,povslabs&)}}="" CHAR{{OB_SPEC(adr_lanceur%,txtmode&)}}="" CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}}="" CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}="" DO membfill(mem_che%,512,0) termine!=@lire_une_ligne(mem_che%) EXIT IF LEFT$(CHAR{mem_che%},3)="EOF" IF LEN(CHAR{mem_che%})>1 $S$,$S> SELECT LEFT$(CHAR{mem_che%},3) CASE "CAM" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) camera_visible!=(v|=1) ob_state(adr_popup_parametres%,creaauto&,aes_selected&,camera_visible!) CASE "EBS" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,cheebs&)}}=CHAR{mem_che%} CASE "POV" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,chepov&)}}=CHAR{mem_che%} CASE "IMG" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,cheimg&)}}=CHAR{mem_che%} CASE "RAY" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,chettp&)}}=CHAR{mem_che%} CASE "EDT" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,chetxt&)}}=CHAR{mem_che%} CASE "VIS" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,chevis&)}}=CHAR{mem_che%} CASE "UND" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,cheund&)}}=CHAR{mem_che%} CASE "INC" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,cheinc&)}}=CHAR{mem_che%} CASE "DIV" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,che3d2&)}}=CHAR{mem_che%} CASE "PRG" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,cheext&)}}=CHAR{mem_che%} CASE "SCR" enleve_code(mem_che%) IF INSTR(CHAR{mem_che%},".") CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}}=LEFT$(CHAR{mem_che%}+" ",12) ELSE CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}}=LEFT$(CHAR{mem_che%}+SPACE$(43),43) ENDIF CASE "CLC" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}=CHAR{mem_che%} CASE "TXT" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_lanceur%,txtmode&)}}=CHAR{mem_che%} CASE "ALI" enleve_code(mem_che%) alias&=VAL(CHAR{mem_che%}) CASE "JIT" enleve_code(mem_che%) jittering&=VAL(CHAR{mem_che%}) CASE "+F " enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,povgene&,aes_selected&,(l%=1)) CASE "+D " enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,povaffi&,aes_selected&,(v|=1)) ob_state(adr_lanceur%,modeaffi&,aes_disable&,(v|=0)) CASE "+X " enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,povatte&,aes_selected&,(l%=1)) CASE "+P " enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,povater&,aes_selected&,(l%=1)) CASE "+MB" enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,povutsl&,aes_selected&,(l%=1)) ob_state(adr_lanceur%,povslabs&,aes_disable&,(l%=0)) CASE "+V " enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,povnume&,aes_selected&,(l%=1)) CASE "+AM" enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,povlafa&,aes_selected&,(l%=1)) CASE "+B " enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,buffonof&,aes_selected&,(l%=1)) ob_state(adr_lanceur%,povbuffe&,aes_disable&,(l%=0)) CASE "+A " enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,antionof&,aes_selected&,(l%=1)) ob_state(adr_lanceur%,PRED(povpere&),aes_disable&,(l%=0)) ob_state(adr_lanceur%,bpovfil&,aes_disable&,(l%=0)) ob_state(adr_lanceur%,jittonof&,aes_disable&,(l%=0)) ob_state(adr_lanceur%,PRED(jittpere&),aes_disable&,(l%=0)) ob_state(adr_lanceur%,bjittfil&,aes_disable&,(l%=0)) ob_state(adr_lanceur%,povlafa&,aes_disable&,(NOT BTST(OB_STATE(adr_lanceur%,antionof&),aes_selected&))) FOR i&=povmat01& TO povmat09& ob_state(adr_lanceur%,i&,aes_disable&,(l%=0)) NEXT i& CASE "+J " enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) IF NOT BTST(OB_STATE(adr_lanceur%,jittonof&),aes_disable&) ob_state(adr_lanceur%,jittonof&,aes_selected&,(l%=1)) ob_state(adr_lanceur%,PRED(jittpere&),aes_disable&,(l%=0)) ob_state(adr_lanceur%,bjittfil&,aes_disable&,(l%=0)) ENDIF CASE "+Q " enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_lanceur%,SUB(povquali&,2))}}="Q"+STR$(l%) CASE "+QR" enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) IF l%=1 CHAR{{OB_SPEC(adr_lanceur%,SUB(povradio&,2))}}=LEFT$(CHAR{OB_SPEC(adr_divers%,lin8&)},PRED(INSTR(CHAR{OB_SPEC(adr_divers%,lin8&)},"/"))) ELSE CHAR{{OB_SPEC(adr_lanceur%,SUB(povradio&,2))}}=RIGHT$(CHAR{OB_SPEC(adr_divers%,lin8&)},SUB(LEN(CHAR{OB_SPEC(adr_divers%,lin8&)}),INSTR(CHAR{OB_SPEC(adr_divers%,lin8&)},"/"))) ENDIF CASE "+DF" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}}=CHAR{{OB_SPEC(adr_popup_divers%,ADD(outfile0&,v|))}} CASE "+T " enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) FOR i&=povmat01& TO povmat09& ob_state(adr_lanceur%,i&,aes_selected&,FALSE) IF SUB(i&,povmat01&)=l% ob_state(adr_lanceur%,i&,aes_selected&,TRUE) ENDIF NEXT i& CASE "BUF" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_lanceur%,povbuffe&)}}=STR$(VAL(CHAR{mem_che%}),6) CASE "SLB" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_lanceur%,povslabs&)}}=STR$(VAL(CHAR{mem_che%}),3) CASE "WID" enleve_code(mem_che%) mem_larg&=VAL(CHAR{mem_che%}) CASE "HEI" enleve_code(mem_che%) mem_haut&=VAL(CHAR{mem_che%}) CASE "BAK" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) backup!=(v|=1) ob_state(adr_popup_parametres%,backup&,aes_selected&,backup!) CASE "SMO" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) smooth!=(v|=1) ob_state(adr_popup_parametres%,smooth&,aes_selected&,smooth!) CASE "QUI" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) dessin_rapide!=(v|=1) ob_state(adr_popup_parametres%,rapide&,aes_selected&,dessin_rapide!) CASE "GRI" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) IF WORD{{ADD(GB,4)}}<&H340 ! Si l'AES est inf‚rieur … 3.40 fond_gris!=(v|=1) ob_state(adr_popup_parametres%,fondgris&,aes_selected&,fond_gris!) ELSE ob_state(adr_popup_parametres%,fondgris&,aes_disable&,TRUE) ob_state(adr_popup_parametres%,fondgris&,aes_selected&,FALSE) fond_gris!=TRUE ENDIF CASE "GRD" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) filaire_cache!=(v|=1) ob_state(adr_popup_parametres%,actiauto&,aes_selected&,filaire_cache!) CASE "GRL" enleve_code(mem_che%) pas_grille&=VAL(CHAR{mem_che%}) IF pas_grille&<1 pas_grille&=20 ENDIF CHAR{{OB_SPEC(adr_parametres%,tailgril&)}}=STR$(pas_grille&,3) CASE "JAU" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) mode_jauge!=(v|=1) ob_state(adr_popup_parametres%,ch255&,aes_selected&,mode_jauge!) ob_state(adr_popup_parametres%,ch100&,aes_selected&,NOT mode_jauge!) CASE "BDG" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) texture_avant!=(v|=1) ob_state(adr_popup_parametres%,bounding&,aes_selected&,texture_avant!) CASE "PVS" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) point_vise_lie!=(v|=1) ob_state(adr_popup_parametres%,pvise&,aes_selected&,point_vise_lie!) CASE "DFX" enleve_code(mem_che%) i&=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_parametres%,def_x&)}}=STR$(i&,7,3) CASE "DFY" enleve_code(mem_che%) i&=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_parametres%,def_y&)}}=STR$(i&,7,3) CASE "DFZ" enleve_code(mem_che%) i&=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_parametres%,def_z&)}}=STR$(i&,7,3) CASE "DET" enleve_code(mem_che%) niv_det=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_parametres%,chedetai&)}}=STR$(niv_det,3) CASE "BEZ" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) carreaux_visible!=(v|=1) ob_state(adr_popup_parametres%,carrvisi&,aes_selected&,carreaux_visible!) CASE "PTV" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) controle_visible!=(v|=1) ob_state(adr_popup_parametres%,ctrlvisi&,aes_selected&,controle_visible!) CASE "IN1" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_chemin_include%,cheinca1&,aes_selected&,v|=1) CASE "IN2" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_chemin_include%,cheinca2&,aes_selected&,v|=1) CASE "IN3" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_chemin_include%,cheinca3&,aes_selected&,v|=1) CASE "IN4" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_chemin_include%,cheinca4&,aes_selected&,v|=1) CASE "IN5" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_chemin_include%,cheinca5&,aes_selected&,v|=1) CASE "IN6" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_chemin_include%,cheinca6&,aes_selected&,v|=1) CASE "IN7" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_chemin_include%,cheinca7&,aes_selected&,v|=1) CASE "IN8" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_chemin_include%,cheinca8&,aes_selected&,v|=1) CASE "IN9" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_chemin_include%,cheinca9&,aes_selected&,v|=1) CASE "CH1" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_chemin_include%,cheinc1&)}}=CHAR{mem_che%} CASE "CH2" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_chemin_include%,cheinc2&)}}=CHAR{mem_che%} CASE "CH3" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_chemin_include%,cheinc3&)}}=CHAR{mem_che%} CASE "CH4" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_chemin_include%,cheinc4&)}}=CHAR{mem_che%} CASE "CH5" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_chemin_include%,cheinc5&)}}=CHAR{mem_che%} CASE "CH6" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_chemin_include%,cheinc6&)}}=CHAR{mem_che%} CASE "CH7" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_chemin_include%,cheinc7&)}}=CHAR{mem_che%} CASE "CH8" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_chemin_include%,cheinc8&)}}=CHAR{mem_che%} CASE "CH9" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_chemin_include%,cheinc9&)}}=CHAR{mem_che%} CASE "NBU" enleve_code(mem_che%) max_undo&=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_parametres%,cheundo&)}}=STR$(max_undo&,5) CASE "+UL" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,pov_ul&,aes_selected&,v|=1) CASE "+UV" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,pov_uv&,aes_selected&,v|=1) CASE "+UR" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,pov_ur&,aes_selected&,v|=1) CASE "+SU" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,pov_su&,aes_selected&,v|=1) CASE "+UA" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,pov_ua&,aes_selected&,v|=1) CASE "+GA" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,pov_ga&,aes_selected&,v|=1) CASE "+GD" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,pov_gd&,aes_selected&,v|=1) CASE "+GF" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,pov_gf&,aes_selected&,v|=1) CASE "+GR" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,pov_gr&,aes_selected&,v|=1) CASE "+GS" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,pov_gs&,aes_selected&,v|=1) CASE "+GW" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) ob_state(adr_lanceur%,pov_gw&,aes_selected&,v|=1) CASE "+MO" enleve_code(mem_che%) v|=VAL(CHAR{mem_che%}) IF BTST(OB_STATE(adr_lanceur%,povaffi&),aes_selected&) ob_state(adr_lanceur%,povmosai&,aes_disable&,FALSE) ob_state(adr_lanceur%,povmosai&,aes_selected&,v|=1) ob_state(adr_lanceur%,mosadebu&,aes_disable&,NOT (v|=1)) ob_state(adr_lanceur%,mosafin&,aes_disable&,NOT (v|=1)) ELSE ob_state(adr_lanceur%,povmosai&,aes_disable&,TRUE) ob_state(adr_lanceur%,mosadebu&,aes_disable&,TRUE) ob_state(adr_lanceur%,mosafin&,aes_disable&,TRUE) ENDIF CASE "DEM" enleve_code(mem_che%) i&=VAL(CHAR{mem_che%}) IF i&=0 i&=4 ENDIF CHAR{{OB_SPEC(adr_lanceur%,SUB(mosadebu&,2))}}=STR$(i&,3) CASE "FIM" enleve_code(mem_che%) i&=VAL(CHAR{mem_che%}) IF i&=0 i&=2 ENDIF CHAR{{OB_SPEC(adr_lanceur%,SUB(mosafin&,2))}}=STR$(i&,3) CASE "BPC" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_lanceur%,bpc&)}}=STR$(VAL(CHAR{mem_che%}),2) CASE "FRM" enleve_code(mem_che%) l%=VAL(CHAR{mem_che%}) CLR largeur_par_defaut&,hauteur_par_defaut& FOR i&=format0& TO format1& ob_state(adr_lanceur%,i&,aes_selected&,FALSE) IF SUB(i&,format0&)=l% ob_state(adr_lanceur%,i&,aes_selected&,TRUE) IF i&=format1& largeur_par_defaut&=-1 hauteur_par_defaut&=-1 ENDIF i&=format1& ENDIF NEXT i& IF largeur_par_defaut&=-1 OR hauteur_par_defaut&=-1 largeur_par_defaut&=mem_larg& hauteur_par_defaut&=mem_haut& ENDIF CASE "MRQ" enleve_code(mem_che%) marqueur|=VAL(CHAR{mem_che%}) CASE "SXP" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,consxpov&)}}=STR$(VAL(CHAR{mem_che%}),3) CASE "SYP" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,consypov&)}}=STR$(VAL(CHAR{mem_che%}),3) CASE "TG0" enleve_code(mem_che%) ob_state(adr_parametre_tos2gem%,t2gclose&,aes_selected&,(VAL(CHAR{mem_che%})=1)) CASE "TG1" enleve_code(mem_che%) ob_state(adr_parametre_tos2gem%,t2gmove&,aes_selected&,(VAL(CHAR{mem_che%})=1)) CASE "TG2" enleve_code(mem_che%) ob_state(adr_parametre_tos2gem%,t2gfulle&,aes_selected&,(VAL(CHAR{mem_che%})=1)) CASE "TG3" enleve_code(mem_che%) ob_state(adr_parametre_tos2gem%,t2gvert&,aes_selected&,(VAL(CHAR{mem_che%})=1)) CASE "TG4" enleve_code(mem_che%) ob_state(adr_parametre_tos2gem%,t2gsize&,aes_selected&,(VAL(CHAR{mem_che%})=1)) CASE "TG5" enleve_code(mem_che%) ob_state(adr_parametre_tos2gem%,t2ghori&,aes_selected&,(VAL(CHAR{mem_che%})=1)) CASE "TG6" enleve_code(mem_che%) ob_state(adr_parametre_tos2gem%,t2gfo4&,aes_selected&,FALSE) ob_state(adr_parametre_tos2gem%,t2gfo6&,aes_selected&,FALSE) ob_state(adr_parametre_tos2gem%,t2gfo13&,aes_selected&,FALSE) IF VAL(CHAR{mem_che%})=4 ob_state(adr_parametre_tos2gem%,t2gfo4&,aes_selected&,TRUE) ELSE IF VAL(CHAR{mem_che%})=6 ob_state(adr_parametre_tos2gem%,t2gfo6&,aes_selected&,TRUE) ELSE IF VAL(CHAR{mem_che%})=13 ob_state(adr_parametre_tos2gem%,t2gfo13&,aes_selected&,TRUE) ENDIF CASE "TG7" enleve_code(mem_che%) ob_state(adr_parametre_tos2gem%,t2gpbuf&,aes_selected&,FALSE) ob_state(adr_parametre_tos2gem%,t2ggbuf&,aes_selected&,FALSE) ob_state(adr_parametre_tos2gem%,t2glbuf&,aes_selected&,FALSE) IF VAL(CHAR{mem_che%})=0 ob_state(adr_parametre_tos2gem%,t2gpbuf&,aes_selected&,TRUE) ELSE IF VAL(CHAR{mem_che%})=1 ob_state(adr_parametre_tos2gem%,t2ggbuf&,aes_selected&,TRUE) ELSE IF VAL(CHAR{mem_che%})=2 ob_state(adr_parametre_tos2gem%,t2glbuf&,aes_selected&,TRUE) ENDIF CASE "TG8" enleve_code(mem_che%) ob_state(adr_parametre_tos2gem%,t2gpal0&,aes_selected&,FALSE) ob_state(adr_parametre_tos2gem%,t2gpal1&,aes_selected&,FALSE) ob_state(adr_parametre_tos2gem%,t2gpal2&,aes_selected&,FALSE) IF VAL(CHAR{mem_che%})=0 ob_state(adr_parametre_tos2gem%,t2gpal0&,aes_selected&,TRUE) ELSE IF VAL(CHAR{mem_che%})=1 ob_state(adr_parametre_tos2gem%,t2gpal1&,aes_selected&,TRUE) ELSE IF VAL(CHAR{mem_che%})=2 ob_state(adr_parametre_tos2gem%,t2gpal2&,aes_selected&,TRUE) ENDIF CASE "TG9" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametre_tos2gem%,t2gbuff&)}}=CHAR{mem_che%} CASE "LOO" enleve_code(mem_che%) type_de_bouton|=VAL(CHAR{mem_che%}) ob_state(adr_parametres%,chebou01&,aes_selected&,(type_de_bouton|=0)) ob_state(adr_parametres%,chebou02&,aes_selected&,(type_de_bouton|=1)) ob_state(adr_parametres%,chebou03&,aes_selected&,(type_de_bouton|=2)) ob_state(adr_parametres%,chebou04&,aes_selected&,(type_de_bouton|=3)) ob_state(adr_parametres%,chebou05&,aes_selected&,(type_de_bouton|=4)) ob_state(adr_parametres%,chebou06&,aes_selected&,(type_de_bouton|=5)) changer_les_boutons CASE "OGL" enleve_code(mem_che%) utilise_opengl!=VAL(CHAR{mem_che%})=1 ob_state(adr_parametres%,act_opengl&,aes_selected&,utilise_opengl!) ENDSELECT ENDIF EXIT IF termine! LOOP ENDIF CLOSE #1 ob_flags(adr_parametres%,SUB(chet2g&,3),aes_hidetree&,NOT tos2gem!) RETURN > PROCEDURE sauver_parametres ! et sauvegarde LOCAL num&,asc|,ctr|,racc% LOCAL l%,i&,j& sauver_langage OPEN "o",#1,CHAR{eb_temp%}+"\eb_model.cfg" PRINT #1,"# Fichier de configuration principal pour EB_MODEL. Ce fichier" PRINT #1,"# contient tout les diff‚rents chemins et tous les paramŠtres" PRINT #1,"# modifiables et n'ayant pas besoin de relancer EB_MODEL pour" PRINT #1,"# ˆtre activ‚." PRINT #1,"#" PRINT #1,"#(c) BARANGER Emmanuel - EB_MODEL "+CHAR{version%}+" du "+CHAR{date%} PRINT #1,"#--------------------------------------------------------------" ' ********** Formulaire de paramŠtrage PRINT #1,"# Chemin des scŠnes EBS" PRINT #1,"EBS ";CHAR{{OB_SPEC(adr_parametres%,cheebs&)}} PRINT #1,"# Chemin des scripts POV" PRINT #1,"POV ";CHAR{{OB_SPEC(adr_parametres%,chepov&)}} PRINT #1,"# Chemin des images calcul‚es" PRINT #1,"IMG ";CHAR{{OB_SPEC(adr_parametres%,cheimg&)}} PRINT #1,"# Chemin de P.O.V." PRINT #1,"RAY ";CHAR{{OB_SPEC(adr_parametres%,chettp&)}} PRINT #1,"# Chemin de l'‚diteur de texte" PRINT #1,"EDT ";CHAR{{OB_SPEC(adr_parametres%,chetxt&)}} PRINT #1,"# Chemin du visualiseur d'images" PRINT #1,"VIS ";CHAR{{OB_SPEC(adr_parametres%,chevis&)}} PRINT #1,"# Chemin de sauvegarde des UNDOs" PRINT #1,"UND ";CHAR{{OB_SPEC(adr_parametres%,cheund&)}} PRINT #1,"# Chemin d'INCLUDE num‚ro 1" PRINT #1,"INC ";CHAR{{OB_SPEC(adr_parametres%,cheinc&)}} PRINT #1,"# Chemin fourre tout" PRINT #1,"DIV ";CHAR{{OB_SPEC(adr_parametres%,che3d2&)}} PRINT #1,"# Chemin d'un programme de son choix" PRINT #1,"PRG ";CHAR{{OB_SPEC(adr_parametres%,cheext&)}} ' ********** Formulaire de lancement de POV PRINT #1,"# Nom du script … calculer" PRINT #1,"SCR ";CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}} PRINT #1,"# Nom de l'image … g‚n‚rer" PRINT #1,"CLC ";CHAR{{OB_SPEC(adr_lanceur%,povimage&)}} PRINT #1,"# Type de rendu ‚cran lors des calculs de POV (0,1,2 ou 3)" PRINT #1,"TXT ";CHAR{{OB_SPEC(adr_lanceur%,txtmode&)}} PRINT #1,"# Taux d'antialiasing" PRINT #1,"ALI ";alias& PRINT #1,"# Taux de jittering" PRINT #1,"JIT ";jittering& PRINT #1,"# G‚n‚ration d'une image (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,povgene&),aes_selected&) PRINT #1,"+F 1" ELSE PRINT #1,"+F 0" ENDIF PRINT #1,"# Affichage durant calcul (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,povaffi&),aes_selected&) PRINT #1,"+D 1" ELSE PRINT #1,"+D 0" ENDIF PRINT #1,"# Attente d'appui sur une touche aprŠs calcul de l'image" IF BTST(OB_STATE(adr_lanceur%,povatte&),aes_selected&) PRINT #1,"+X 1" ELSE PRINT #1,"+X 0" ENDIF PRINT #1,"# Attente d'appui sur une touche aprŠs erreur de calcul" IF BTST(OB_STATE(adr_lanceur%,povater&),aes_selected&) PRINT #1,"+P 1" ELSE PRINT #1,"+P 0" ENDIF PRINT #1,"# Bounding SLAB activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,povutsl&),aes_selected&) PRINT #1,"+MB 1" ELSE PRINT #1,"+MB 0" ENDIF PRINT #1,"# Affichage des num‚ro de ligne (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,povnume&),aes_selected&) PRINT #1,"+V 1" ELSE PRINT #1,"+V 0" ENDIF PRINT #1,"# M‚thode d'antialisaing (1 = m‚thode 2, 0 = m‚thode 1)" IF BTST(OB_STATE(adr_lanceur%,povlafa&),aes_selected&) PRINT #1,"+AM 1" ELSE PRINT #1,"+AM 0" ENDIF PRINT #1,"# Buffer de sauvegarde pour POV activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,buffonof&),aes_selected&) PRINT #1,"+B 1" ELSE PRINT #1,"+B 0" ENDIF PRINT #1,"# Activation de l'antialiasing (1) ou d‚sactivation (0)" IF BTST(OB_STATE(adr_lanceur%,antionof&),aes_selected&) PRINT #1,"+A 1" ELSE PRINT #1,"+A 0" ENDIF PRINT #1,"# Activation de du jittering (1) ou d‚sactivation (0)" IF BTST(OB_STATE(adr_lanceur%,jittonof&),aes_selected&) PRINT #1,"+J 1" ELSE PRINT #1,"+J 0" ENDIF PRINT #1,"# Qualit‚ de rendu de POV (0,1,2,3,4,5,6,7,8 ou 9)" PRINT #1,"+Q ";VAL(RIGHT$(TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povquali&,2))}}),1)) PRINT #1,"# Activation radiosit‚ (1) - D‚sactivation radiosit‚ (0)" IF CHAR{{OB_SPEC(adr_lanceur%,SUB(povradio&,2))}}=LEFT$(CHAR{OB_SPEC(adr_divers%,lin8&)},PRED(INSTR(CHAR{OB_SPEC(adr_divers%,lin8&)},"/"))) PRINT #1,"+QR 1" ELSE PRINT #1,"+QR 0" ENDIF PRINT #1,"# Format de l'image … g‚n‚rer" PRINT #1,"# 0 : Format TGA type 2" PRINT #1,"# 1 : Format TGA type 10" PRINT #1,"# 2 : Format PPM" PRINT #1,"# 3 : Format PNG 8" PRINT #1,"# 4 : Format PNG n" SELECT LEFT$(TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}}),3) CASE "TGA" IF TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}})="TGA 2" PRINT #1,"+DF 0" ELSE PRINT #1,"+DF 1" ENDIF CASE "PPM" PRINT #1,"+DF 2" CASE "PNG" IF TRIM$(CHAR{{OB_SPEC(adr_lanceur%,SUB(povforma&,2))}})="PNG 8" PRINT #1,"+DF 3" ELSE PRINT #1,"+DF 4" ENDIF ENDSELECT PRINT #1,"# Matrice d'antialiasing" FOR i&=povmat01& TO povmat09& IF BTST(OB_STATE(adr_lanceur%,i&),aes_selected&) PRINT #1,"+T ";SUB(i&,povmat01&) ENDIF NEXT i& PRINT #1,"# Taille du buffer pour POV" PRINT #1,"BUF ";VAL(CHAR{{OB_SPEC(adr_lanceur%,povbuffe&)}}) PRINT #1,"# Nombre d'objet minimum d'activation des Bounding SLAB" PRINT #1,"SLB ";VAL(CHAR{{OB_SPEC(adr_lanceur%,povslabs&)}}) PRINT #1,"# Largeur de l'image … g‚n‚rer en pixels" PRINT #1,"WID ";largeur_par_defaut& PRINT #1,"# Hauteur de l'image … g‚n‚rer en pixels" PRINT #1,"HEI ";hauteur_par_defaut& PRINT #1,"# Sauvegarde de secour activ‚e (1) ou pas (0)" IF BTST(OB_STATE(adr_popup_parametres%,backup&),aes_selected&) PRINT #1,"BAK 1" ELSE PRINT #1,"BAK 0" ENDIF PRINT #1,"# Smooth de tous les objets facettes activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_popup_parametres%,smooth&),aes_selected&) PRINT #1,"SMO 1" ELSE PRINT #1,"SMO 0" ENDIF PRINT #1,"# Primitives rapides activ‚es (1) ou pas (1) (que des boŒtes)" IF BTST(OB_STATE(adr_popup_parametres%,rapide&),aes_selected&) PRINT #1,"QUI 1" ELSE PRINT #1,"QUI 0" ENDIF PRINT #1,"# Fond gris activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_popup_parametres%,fondgris&),aes_selected&) PRINT #1,"GRI 1" ELSE PRINT #1,"GRI 0" ENDIF PRINT #1,"# Mode filaire avec segments cach‚s (1) ou pas (0)" IF BTST(OB_STATE(adr_popup_parametres%,actiauto&),aes_selected&) PRINT #1,"GRD 1" ELSE PRINT #1,"GRD 0" ENDIF PRINT #1,"# Taille de la grille de travail" PRINT #1,"GRL ";VAL(CHAR{{OB_SPEC(adr_parametres%,tailgril&)}}) PRINT #1,"# Jauge centr‚ … l'‚cran (0) ou en haut de la fenˆtre de travail (1)" IF BTST(OB_STATE(adr_popup_parametres%,ch255&),aes_selected&) PRINT #1,"JAU 1" ELSE PRINT #1,"JAU 0" ENDIF PRINT #1,"# D‚finition des textures avant l'‚chelle de l'objet" IF BTST(OB_STATE(adr_popup_parametres%,bounding&),aes_selected&) PRINT #1,"BDG 1" ELSE PRINT #1,"BDG 0" ENDIF PRINT #1,"# Lier les points de vis‚e au point de d‚part (1) ou pas (0) (Cam‚ra et lumiŠres)" IF BTST(OB_STATE(adr_popup_parametres%,pvise&),aes_selected&) PRINT #1,"PVS 1" ELSE PRINT #1,"PVS 0" ENDIF PRINT #1,"# Largeur d'un objet par d‚faut" PRINT #1,"DFX ";VAL(CHAR{{OB_SPEC(adr_parametres%,def_x&)}}) PRINT #1,"# Hauteur d'un objet par d‚faut" PRINT #1,"DFY ";VAL(CHAR{{OB_SPEC(adr_parametres%,def_y&)}}) PRINT #1,"# Profondeur d'un objet par d‚faut" PRINT #1,"DFZ ";VAL(CHAR{{OB_SPEC(adr_parametres%,def_z&)}}) PRINT #1,"# Pourcentage de d‚tail affichable" PRINT #1,"DET ";VAL(CHAR{{OB_SPEC(adr_parametres%,chedetai&)}}) PRINT #1,"# Cam‚ra et lumiŠre d‚taill‚es visible (1) oui pas (0)" IF camera_visible! PRINT #1,"CAM 1" ELSE PRINT #1,"CAM 0" ENDIF PRINT #1,"# Carreaux de B‚zier visible des deux cot‚s (1) ou d'un cot‚ (0)" IF BTST(OB_STATE(adr_popup_parametres%,carrvisi&),aes_selected&) PRINT #1,"BEZ 1" ELSE PRINT #1,"BEZ 0" ENDIF PRINT #1,"# Points de contr“le des carreaux de B‚zier visible (1) ou pas (0)" IF BTST(OB_STATE(adr_popup_parametres%,ctrlvisi&),aes_selected&) PRINT #1,"PTV 1" ELSE PRINT #1,"PTV 0" ENDIF PRINT #1,"# Chemin d'INCLUDE num‚ro 2 activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_chemin_include%,cheinca1&),aes_selected&) PRINT #1,"IN1 1" ELSE PRINT #1,"IN1 0" ENDIF PRINT #1,"# Chemin d'INCLUDE num‚ro 3 activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_chemin_include%,cheinca2&),aes_selected&) PRINT #1,"IN2 1" ELSE PRINT #1,"IN2 0" ENDIF PRINT #1,"# Chemin d'INCLUDE num‚ro 4 activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_chemin_include%,cheinca3&),aes_selected&) PRINT #1,"IN3 1" ELSE PRINT #1,"IN3 0" ENDIF PRINT #1,"# Chemin d'INCLUDE num‚ro 5 activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_chemin_include%,cheinca4&),aes_selected&) PRINT #1,"IN4 1" ELSE PRINT #1,"IN4 0" ENDIF PRINT #1,"# Chemin d'INCLUDE num‚ro 6 activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_chemin_include%,cheinca5&),aes_selected&) PRINT #1,"IN5 1" ELSE PRINT #1,"IN5 0" ENDIF PRINT #1,"# Chemin d'INCLUDE num‚ro 7 activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_chemin_include%,cheinca6&),aes_selected&) PRINT #1,"IN6 1" ELSE PRINT #1,"IN6 0" ENDIF PRINT #1,"# Chemin d'INCLUDE num‚ro 8 activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_chemin_include%,cheinca7&),aes_selected&) PRINT #1,"IN7 1" ELSE PRINT #1,"IN7 0" ENDIF PRINT #1,"# Chemin d'INCLUDE num‚ro 9 activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_chemin_include%,cheinca8&),aes_selected&) PRINT #1,"IN8 1" ELSE PRINT #1,"IN8 0" ENDIF PRINT #1,"# Chemin d'INCLUDE num‚ro 10 activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_chemin_include%,cheinca9&),aes_selected&) PRINT #1,"IN9 1" ELSE PRINT #1,"IN9 0" ENDIF PRINT #1,"# Chemin d'INCLUDE num‚ro 2" PRINT #1,"CH1 ";CHAR{{OB_SPEC(adr_chemin_include%,cheinc1&)}} PRINT #1,"# Chemin d'INCLUDE num‚ro 3" PRINT #1,"CH2 ";CHAR{{OB_SPEC(adr_chemin_include%,cheinc2&)}} PRINT #1,"# Chemin d'INCLUDE num‚ro 4" PRINT #1,"CH3 ";CHAR{{OB_SPEC(adr_chemin_include%,cheinc3&)}} PRINT #1,"# Chemin d'INCLUDE num‚ro 5" PRINT #1,"CH4 ";CHAR{{OB_SPEC(adr_chemin_include%,cheinc4&)}} PRINT #1,"# Chemin d'INCLUDE num‚ro 6" PRINT #1,"CH5 ";CHAR{{OB_SPEC(adr_chemin_include%,cheinc5&)}} PRINT #1,"# Chemin d'INCLUDE num‚ro 7" PRINT #1,"CH6 ";CHAR{{OB_SPEC(adr_chemin_include%,cheinc6&)}} PRINT #1,"# Chemin d'INCLUDE num‚ro 8" PRINT #1,"CH7 ";CHAR{{OB_SPEC(adr_chemin_include%,cheinc7&)}} PRINT #1,"# Chemin d'INCLUDE num‚ro 9" PRINT #1,"CH8 ";CHAR{{OB_SPEC(adr_chemin_include%,cheinc8&)}} PRINT #1,"# Chemin d'INCLUDE num‚ro 10" PRINT #1,"CH9 ";CHAR{{OB_SPEC(adr_chemin_include%,cheinc9&)}} PRINT #1,"# Nombre de UNDO autoris‚s" IF VAL(CHAR{{OB_SPEC(adr_parametres%,cheundo&)}})=0 PRINT #1,"NBU 1" ELSE PRINT #1,"NBU ";VAL(CHAR{{OB_SPEC(adr_parametres%,cheundo&)}}) ENDIF PRINT #1,"# Buffer lumiŠre activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,pov_ul&),aes_selected&) PRINT #1,"+UL 1" ELSE PRINT #1,"+UL 0" ENDIF PRINT #1,"# Vista buffer activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,pov_uv&),aes_selected&) PRINT #1,"+UV 1" ELSE PRINT #1,"+UV 0" ENDIF PRINT #1,"# Remove_bound activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,pov_ur&),aes_selected&) PRINT #1,"+UR 1" ELSE PRINT #1,"+UR 0" ENDIF PRINT #1,"# Split union activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,pov_su&),aes_selected&) PRINT #1,"+SU 1" ELSE PRINT #1,"+SU 0" ENDIF PRINT #1,"# Alpha_channel activ‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,pov_ua&),aes_selected&) PRINT #1,"+UA 1" ELSE PRINT #1,"+UA 0" ENDIF PRINT #1,"# Option de console activ‚es (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,pov_ga&),aes_selected&) PRINT #1,"+GA 1" ELSE PRINT #1,"+GA 0" ENDIF PRINT #1,"# Option Debug de la console activ‚e (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,pov_gd&),aes_selected&) PRINT #1,"+GD 1" ELSE PRINT #1,"+GD 0" ENDIF PRINT #1,"# Option Fatal de la console activ‚e (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,pov_gf&),aes_selected&) PRINT #1,"+GF 1" ELSE PRINT #1,"+GF 0" ENDIF PRINT #1,"# Option Render de la console activ‚e (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,pov_gr&),aes_selected&) PRINT #1,"+GR 1" ELSE PRINT #1,"+GR 0" ENDIF PRINT #1,"# Option Statistic de la console activ‚e (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,pov_gs&),aes_selected&) PRINT #1,"+GS 1" ELSE PRINT #1,"+GS 0" ENDIF PRINT #1,"# Option Waring de la console activ‚e (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,pov_gw&),aes_selected&) PRINT #1,"+GW 1" ELSE PRINT #1,"+GW 0" ENDIF PRINT #1,"# Activation de la mosaique (1) ou pas (0)" IF BTST(OB_STATE(adr_lanceur%,povmosai&),aes_selected&) PRINT #1,"+MO 1" ELSE PRINT #1,"+MO 0" ENDIF PRINT #1,"# Valeur de d‚part de la mosaique" PRINT #1,"# Valeur : 0 1 2 3 4 5 6" PRINT #1,"# Effet : 2 8 16 32 64 128 256" PRINT #1,"DEM ";VAL(CHAR{{OB_SPEC(adr_lanceur%,SUB(mosadebu&,2))}}) PRINT #1,"# Valeur de fin de la mosaique" PRINT #1,"# Valeurs identiques au pr‚c‚dent" PRINT #1,"FIM ";VAL(CHAR{{OB_SPEC(adr_lanceur%,SUB(mosafin&,2))}}) PRINT #1,"# Nombre de Bit par pixel pour l'Alpha channel" PRINT #1,"BPC ";VAL(CHAR{{OB_SPEC(adr_lanceur%,bpc&)}}) PRINT #1,"# Taille pr‚-d‚finie de l'image … g‚n‚rer" FOR i&=format0& TO format1& IF BTST(OB_STATE(adr_lanceur%,i&),aes_selected&) PRINT #1,"FRM ";SUB(i&,format0&) ENDIF NEXT i& PRINT #1,"# Type de marqueur pour la grille ‚cran (0,1,2 ou 3)" PRINT #1,"MRQ ";marqueur| PRINT #1,"# Largeur de la console POV en caractŠres" PRINT #1,"SXP ";VAL(CHAR{{OB_SPEC(adr_parametres%,consxpov&)}}) PRINT #1,"# Hauteur de la console POV en caractŠres" PRINT #1,"SYP ";VAL(CHAR{{OB_SPEC(adr_parametres%,consypov&)}}) PRINT #1,"# ParamŠtrage de la console pour TOS2GEM." PRINT #1,"# Bouton de fermeture (0 ou 1)" IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gclose&),aes_selected&) PRINT #1,"TG0 1" ELSE PRINT #1,"TG0 0" ENDIF PRINT #1,"# Barre de d‚placement (0 ou 1)" IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gmove&),aes_selected&) PRINT #1,"TG1 1" ELSE PRINT #1,"TG1 0" ENDIF PRINT #1,"# Bouton de mise en plein ‚cran (0 ou 1)" IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gfulle&),aes_selected&) PRINT #1,"TG2 1" ELSE PRINT #1,"TG2 0" ENDIF PRINT #1,"# Ascenceur vertical (0 ou 1)" IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gvert&),aes_selected&) PRINT #1,"TG3 1" ELSE PRINT #1,"TG3 0" ENDIF PRINT #1,"# Bouton de changement de taille (0 ou 1)" IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gsize&),aes_selected&) PRINT #1,"TG4 1" ELSE PRINT #1,"TG4 0" ENDIF PRINT #1,"# Ascenceur horizontal (0 ou 1)" IF BTST(OB_STATE(adr_parametre_tos2gem%,t2ghori&),aes_selected&) PRINT #1,"TG5 1" ELSE PRINT #1,"TG5 0" ENDIF PRINT #1,"# Taille de la fonte (4,6 ou 13)" IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gfo4&),aes_selected&) PRINT #1,"TG6 4" ELSE IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gfo6&),aes_selected&) PRINT #1,"TG6 6" ELSE IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gfo13&),aes_selected&) PRINT #1,"TG6 13" ENDIF PRINT #1,"# Taille du buffer (0,1 ou 2)" IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gpbuf&),aes_selected&) PRINT #1,"TG7 0" ELSE IF BTST(OB_STATE(adr_parametre_tos2gem%,t2ggbuf&),aes_selected&) PRINT #1,"TG7 1" ELSE IF BTST(OB_STATE(adr_parametre_tos2gem%,t2glbuf&),aes_selected&) PRINT #1,"TG7 2" ENDIF PRINT #1,"# Type de palette utilis‚e (0,1 ou 2)" IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gpal0&),aes_selected&) PRINT #1,"TG8 0" ELSE IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gpal1&),aes_selected&) PRINT #1,"TG8 1" ELSE IF BTST(OB_STATE(adr_parametre_tos2gem%,t2gpal2&),aes_selected&) PRINT #1,"TG8 2" ENDIF PRINT #1,"# Valeur de buffer libre (000 … 999 ms)" PRINT #1,"TG9 ";CHAR{{OB_SPEC(adr_parametre_tos2gem%,t2gbuff&)}} PRINT #1,"# Type de bouton graphique pour l'interface" PRINT #1,"LOO ";type_de_bouton| PRINT #1,"# Utilisation de OPEN GL autoris‚e (0 ou 1)" IF utilise_opengl! PRINT #1,"OGL 1" ELSE PRINT #1,"OGL 0" ENDIF PRINT #1,"# Utilisation de XtendTOS autoris‚e (0 ou 1)" PRINT #1,"EOF" PRINT #1,"" CLOSE #1 sauvegarde_limite_par_defaut RETURN ' .............................................................................. > PROCEDURE charger_configuration ! Lire "CONFIG.CFG" LOCAL termine!,i& ' OPEN "i",#1,CHAR{eb_temp%}+"\config.cfg" IF LOF(#1) DO membfill(mem_che%,512,0) termine!=@lire_une_ligne(mem_che%) EXIT IF LEFT$(CHAR{mem_che%},3)="EOF" IF LEN(CHAR{mem_che%})>1 $S$,$S> SELECT LEFT$(CHAR{mem_che%},3) CASE "BKG" enleve_code(mem_che%) image_de_calque!=(VAL(CHAR{mem_che%})=1) ob_state(adr_outils%,iimgfond&,aes_selected&,image_de_calque!) CASE "BKI" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_image_fond%,imgfon01&)}}=CHAR{mem_che%} CASE "FTH" enleve_code(mem_che%) taille_vue_hierarchie|=VAL(CHAR{mem_che%}) ENDSELECT ENDIF EXIT IF termine! LOOP ENDIF CLOSE #1 ' ~@charger_image_de_fond(image_fond_face|) ~@charger_image_de_fond(image_fond_dos|) ~@charger_image_de_fond(image_fond_droite|) ~@charger_image_de_fond(image_fond_gauche|) ~@charger_image_de_fond(image_fond_dessus|) ~@charger_image_de_fond(image_fond_dessous|) ' RETURN > PROCEDURE sauver_configuration ! et sauvegarde ' OPEN "o",#1,CHAR{eb_temp%}+"\config.cfg" PRINT #1,"# Fichier de configuration secondaire pour EB_MODEL. Ce fichier" PRINT #1,"# est mis … jour automatiquement … chaque sortie de EB MODEL." PRINT #1,"#" PRINT #1,"#(c) BARANGER Emmanuel - EB_MODEL "+CHAR{version%}+" du "+CHAR{date%} PRINT #1,"#--------------------------------------------------------------" PRINT #1,"# Les images de fond ne sont pas affch‚es (0), elles le sont (1)." IF BTST(OB_STATE(adr_outils%,iimgfond&),aes_selected&) PRINT #1,"BKG 1" ELSE PRINT #1,"BKG 0" ENDIF PRINT #1,"# Chemin des images de fond" PRINT #1,"BKI ";CHAR{{OB_SPEC(adr_image_fond%,imgfon01&)}} PRINT #1,"# Taille de la fonte de la fenˆtre de hi‚rarchie" PRINT #1,"FTH ";taille_vue_hierarchie| PRINT #1,"EOF" PRINT #1,"" CLOSE #1 RETURN ' .............................................................................. > PROCEDURE charger_langage ! Lire "LANGAGE.CFG" LOCAL termine!,i& ' CHAR{mem_che%}=CHAR{eb_temp%}+"\langage.cfg"+CHR$(0) IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} IF LOF(#1) DO membfill(mem_che%,512,0) termine!=@lire_une_ligne(mem_che%) EXIT IF LEFT$(CHAR{mem_che%},3)="EOF" IF LEN(CHAR{mem_che%})>1 $S$,$S> SELECT LEFT$(CHAR{mem_che%},3) CASE "LAN" enleve_code(mem_che%) CHAR{nom_mouvement%}=CHAR{mem_che%}+CHR$(0) ENDSELECT ENDIF EXIT IF termine! LOOP ENDIF CLOSE #1 ELSE CHAR{nom_mouvement%}="FRANCAIS"+CHR$(0) ENDIF membfill(mem_che%,512,0) ' RETURN > PROCEDURE sauver_langage ! et sauvegarde ' OPEN "o",#1,CHAR{eb_temp%}+"\langage.cfg" PRINT #1,"# Fichier de d‚finition de la traduction choisie pour EB Model 3." PRINT #1,"# Se fichier contient le nom du r‚pertoire dans lequel se trouvent" PRINT #1,"# les ressources de la traduction d‚sir‚e." PRINT #1,"#" PRINT #1,"# Exemple : Pour le fran‡ais : FRANCAIS" PRINT #1,"# Pour l'anglais : ENGLISH" PRINT #1,"#" PRINT #1,"# Bien sur, vous pouvez changez les noms des r‚pertoires vous mˆme." PRINT #1,"# Rien n'est fig‚. Vous ˆtes libre aprŠs tout." PRINT #1,"#" PRINT #1,"#(c) BARANGER Emmanuel - EB_MODEL "+CHAR{version%}+" du "+CHAR{date%} PRINT #1,"#--------------------------------------------------------------" PRINT #1,"# R‚pertoire de la traduction de EB Model 3" PRINT #1,"LAN "+CHAR{{OB_SPEC(adr_parametres%,SUB(chelangu&,2))}} PRINT #1,"EOF" PRINT #1,"" CLOSE #1 RETURN ' .............................................................................. > PROCEDURE lire_limite_par_defaut ! Lire "LIMITES.CFG" LOCAL i&,termine!,v|,n% cfg_lim!=FALSE limite_des_objets&=20 palette_ebmodel!=FALSE duree%=100 fond_img!=FALSE primitives_simples!=TRUE n%=@prendre(512,TRUE,3) CHAR{n%}=CHAR{eb_temp%}+"\limites.cfg"+CHR$(0) IF @s_exist(n%) OPEN "i",#1,CHAR{n%} IF LOF(#1) DO membfill(n%,256,0) termine!=@lire_une_ligne(n%) EXIT IF LEFT$(CHAR{n%},3)="EOF" IF LEN(CHAR{n%})>1 $S$,$S> SELECT LEFT$(CHAR{n%},3) CASE "MAX" enleve_code(n%) limite_des_objets&=VAL(CHAR{n%}) IF SUB(MAX(@memoire_dispo(0),@memoire_dispo(1)),500)<=@memoire_demandee(limite_des_objets&) limite_des_objets&=@maximum_d_objet_possible ENDIF CASE "FON" enleve_code(n%) v|=VAL(CHAR{n%}) fond_img!=(v|=1) CASE "PAL" enleve_code(n%) v|=VAL(CHAR{n%}) palette_ebmodel!=(v|=1) CASE "SIM" enleve_code(n%) v|=VAL(CHAR{n%}) primitives_simples!=(v|=1) ENDSELECT ENDIF EXIT IF termine! LOOP cfg_lim!=TRUE ENDIF CLOSE #1 ENDIF libere(*n%) RETURN > PROCEDURE sauvegarde_limite_par_defaut ! et sauvegarde OPEN "o",#1,CHAR{eb_temp%}+"\limites.cfg" PRINT #1,"# Les quelques paramŠtres qui ont besoin, pour ˆtre activ‚s" PRINT #1,"# que EB_MODEL soit relanc‚." PRINT #1,"#" PRINT #1,"#(c) BARANGER Emmanuel - EB_MODEL "+CHAR{version%}+" du "+CHAR{date%} PRINT #1,"# Nombre d'objets maximum autoris‚s dans EB_MODEL" IF VAL(CHAR{{OB_SPEC(adr_parametres%,limites&)}})>@maximum_d_objet_possible PRINT #1,"MAX ";@maximum_d_objet_possible ELSE PRINT #1,"MAX ";VAL(CHAR{{OB_SPEC(adr_parametres%,limites&)}}) ENDIF PRINT #1,"# Le fond des ressources est d‚cor‚ (1) ou pas (0)" IF BTST(OB_STATE(adr_popup_parametres%,ecravirt&),aes_selected&) PRINT #1,"FON 1" ELSE PRINT #1,"FON 0" ENDIF PRINT #1,"# Palette du Bureau utilis‚e (1) ou celle d'EB_MODEL (0)" IF BTST(OB_STATE(adr_popup_parametres%,palsyste&),aes_selected&) PRINT #1,"PAL 1" ELSE PRINT #1,"PAL 0" ENDIF PRINT #1,"# Primitives simplifi‚es utilis‚es (1) ou primitives complexes (0)" IF BTST(OB_STATE(adr_popup_parametres%,primsimp&),aes_selected&) PRINT #1,"SIM 1" ELSE PRINT #1,"SIM 0" ENDIF PRINT #1,"EOF" PRINT #1,"" CLOSE #1 RETURN ' .............................................................................. > PROCEDURE lire_parametrage_par_defaut ! Lire "DEFAUT.DEF" LOCAL angle,num_s&,adr_s%,valeur%,i& LOCAL ro&,ve&,bl&,teinte&,saturation&,luminosite& LOCAL termine! membfill(mem_che%,512,0) CHAR{mem_che%}=CHAR{eb_temp%}+"\defaut.def"+CHR$(0) IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} IF LOF(#1) DO membfill(mem_che%,512,0) termine!=@lire_une_ligne(mem_che%) EXIT IF LEFT$(CHAR{mem_che%},3)="EOF" IF LEN(CHAR{mem_che%})>1 $S$,$S> SELECT LEFT$(CHAR{mem_che%},2) CASE "CA" IF MID$(CHAR{mem_che%},3,1)="X" enleve_code(mem_che%) SINGLE{camera%}=ROUND(VAL(CHAR{mem_che%}),3) ELSE IF MID$(CHAR{mem_che%},3,1)="Y" enleve_code(mem_che%) SINGLE{ADD(camera%,4)}=ROUND(VAL(CHAR{mem_che%}),3) ELSE IF MID$(CHAR{mem_che%},3,1)="Z" enleve_code(mem_che%) SINGLE{ADD(camera%,8)}=ROUND(VAL(CHAR{mem_che%}),3) ENDIF CASE "VU" IF MID$(CHAR{mem_che%},3,1)="X" enleve_code(mem_che%) SINGLE{ADD(camera%,12)}=ROUND(VAL(CHAR{mem_che%}),3) ELSE IF MID$(CHAR{mem_che%},3,1)="Y" enleve_code(mem_che%) SINGLE{ADD(camera%,16)}=ROUND(VAL(CHAR{mem_che%}),3) ELSE IF MID$(CHAR{mem_che%},3,1)="Z" enleve_code(mem_che%) SINGLE{ADD(camera%,20)}=ROUND(VAL(CHAR{mem_che%}),3) ENDIF CASE "AN" enleve_code(mem_che%) SINGLE{ADD(camera%,24)}=VAL(CHAR{mem_che%}) CASE "SP" IF MID$(CHAR{mem_che%},3,1)="X" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_vue_subjective%,possubx&)}}=STR$(ROUND(VAL(CHAR{mem_che%}),3),10,3) ELSE IF MID$(CHAR{mem_che%},3,1)="Y" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_vue_subjective%,possuby&)}}=STR$(ROUND(VAL(CHAR{mem_che%}),3),10,3) ELSE IF MID$(CHAR{mem_che%},3,1)="Z" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_vue_subjective%,possubz&)}}=STR$(ROUND(VAL(CHAR{mem_che%}),3),10,3) ENDIF CASE "SV" IF MID$(CHAR{mem_che%},3,1)="X" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_vue_subjective%,subversx&)}}=STR$(ROUND(VAL(CHAR{mem_che%}),3),10,3) ELSE IF MID$(CHAR{mem_che%},3,1)="Y" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_vue_subjective%,subversy&)}}=STR$(ROUND(VAL(CHAR{mem_che%}),3),10,3) ELSE IF MID$(CHAR{mem_che%},3,1)="Z" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_vue_subjective%,subversz&)}}=STR$(ROUND(VAL(CHAR{mem_che%}),3),10,3) ENDIF CASE "FO" enleve_code(mem_che%) $S$,$S> SELECT CHAR{mem_che%} CASE "%1" focale&=400 CASE "%2" focale&=48 CASE "%3" focale&=1080 CASE "%4" focale&=2240 CASE "%5" focale&=3200 CASE "%6" focale&=280 CASE "%7" focale&=224 CASE "%8" focale&=192 CASE "%9" focale&=144 DEFAULT angle=VAL(CHAR{mem_che%}) focale&=ROUND(0.5/(TAN(RAD(angle/2)))*400) ENDSELECT {ADD(tracer_proj3d%,28)}=SHL(focale&,10) {ADD(tracer_proj3d%,32)}=SHL(focale&,10) INT{ADD(camera%,28)}=focale& CASE "NB" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_copier%,conombr&)}}=CHAR{mem_che%} CASE "XC" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_copier%,comdistx&)}}=CHAR{mem_che%} CASE "YC" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_copier%,comdisty&)}}=CHAR{mem_che%} CASE "ZC" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_copier%,comdistz&)}}=CHAR{mem_che%} CASE "RX" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_copier%,codegrex&)}}=CHAR{mem_che%} CASE "RY" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_copier%,codegrey&)}}=CHAR{mem_che%} CASE "RZ" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_copier%,codegrez&)}}=CHAR{mem_che%} CASE "AX" enleve_code(mem_che%) IF VAL(CHAR{mem_che%})=0 CHAR{mem_che%}="1" ENDIF CHAR{{OB_SPEC(adr_copier%,coptauxx&)}}=CHAR{mem_che%} CASE "AY" enleve_code(mem_che%) IF VAL(CHAR{mem_che%})=0 CHAR{mem_che%}="1" ENDIF CHAR{{OB_SPEC(adr_copier%,coptauxy&)}}=CHAR{mem_che%} CASE "AZ" enleve_code(mem_che%) IF VAL(CHAR{mem_che%})=0 CHAR{mem_che%}="1" ENDIF CHAR{{OB_SPEC(adr_copier%,coptauxz&)}}=CHAR{mem_che%} CASE "XA" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) IF num_s&=0 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_copier%,coalea0x&)}}=STR$(valeur%,3) ELSE IF num_s&=1 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_copier%,coalea1x&)}}=STR$(valeur%,3) ELSE IF num_s&=2 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_copier%,coalea2x&)}}=STR$(valeur%,3) ENDIF CASE "YA" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) IF num_s&=0 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_copier%,coalea0y&)}}=STR$(valeur%,3) ELSE IF num_s&=1 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_copier%,coalea1y&)}}=STR$(valeur%,3) ELSE IF num_s&=2 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_copier%,coalea2y&)}}=STR$(valeur%,3) ENDIF CASE "ZA" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) IF num_s&=0 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_copier%,coalea0z&)}}=STR$(valeur%,3) ELSE IF num_s&=1 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_copier%,coalea1z&)}}=STR$(valeur%,3) ELSE IF num_s&=2 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_copier%,coalea2z&)}}=STR$(valeur%,3) ENDIF CASE "DX" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) IF num_s&=0 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) ob_state(adr_copier%,distri0x&,aes_selected&,(valeur%=1)) ELSE IF num_s&=1 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) ob_state(adr_copier%,distri1x&,aes_selected&,(valeur%=1)) ENDIF CASE "DY" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) IF num_s&=0 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) ob_state(adr_copier%,distri0y&,aes_selected&,(valeur%=1)) ELSE IF num_s&=1 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) ob_state(adr_copier%,distri1y&,aes_selected&,(valeur%=1)) ENDIF CASE "DZ" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) IF num_s&=0 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) ob_state(adr_copier%,distri0z&,aes_selected&,(valeur%=1)) ELSE IF num_s&=1 enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) ob_state(adr_copier%,distri1z&,aes_selected&,(valeur%=1)) ENDIF CASE "AC" enleve_code(mem_che%) IF VAL(CHAR{mem_che%})=1 copie_reference!=TRUE ELSE copie_reference!=FALSE ENDIF ob_state(adr_copier%,corefer0&,aes_selected&,copie_reference!) ob_state(adr_copier%,corefer1&,aes_selected&,NOT copie_reference!) CASE "AL" enleve_code(mem_che%) valeur%=VAL(CHAR{mem_che%}) CHAR{{OB_SPEC(adr_copier%,coinitia&)}}=STR$(valeur%,9) CASE "SR" enleve_code(mem_che%) IF VAL(CHAR{mem_che%})=0 CHAR{mem_che%}="1"+CHR$(0) ENDIF i&=nombre_de_source& nombre_de_source&=VAL(TRIM$(CHAR{mem_che%})) IF nombre_de_source&>i& IF NOT @nouvelle_zone_source(MUL(i&,taille_source&),FALSE) nombre_de_source&=i& ENDIF ELSE IF NOT @nouvelle_zone_source(MUL(nombre_de_source&,taille_source&),FALSE) nombre_de_source&=i& ENDIF ENDIF CASE "NO" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) adr_s%=@adresse_source(num_s&) BYTE{adr_s%}=1 enleve_code(mem_che%) CHAR{ADD(adr_s%,62)}=LEFT$(CHAR{mem_che%}+SPACE$(20),20)+CHR$(0) CASE "LX","LY","LZ" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) adr_s%=@adresse_source(num_s&) IF MID$(CHAR{mem_che%},2,1)="X" enleve_code(mem_che%) SINGLE{ADD(adr_s%,8)}=VAL(CHAR{mem_che%}) ELSE IF MID$(CHAR{mem_che%},2,1)="Y" enleve_code(mem_che%) SINGLE{ADD(adr_s%,12)}=VAL(CHAR{mem_che%}) ELSE IF MID$(CHAR{mem_che%},2,1)="Z" enleve_code(mem_che%) SINGLE{ADD(adr_s%,16)}=VAL(CHAR{mem_che%}) ENDIF CASE "RO","VE","BL" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) adr_s%=@adresse_source(num_s&) IF LEFT$(CHAR{mem_che%},2)="RO" enleve_code(mem_che%) ro&=VAL(CHAR{mem_che%}) ELSE IF LEFT$(CHAR{mem_che%},2)="VE" enleve_code(mem_che%) ve&=VAL(CHAR{mem_che%}) ELSE IF LEFT$(CHAR{mem_che%},2)="BL" enleve_code(mem_che%) bl&=VAL(CHAR{mem_che%}) CARD{ADD(adr_s%,2)}=0 ! A d‚finir (Voir bouton "Recherche") BYTE{ADD(adr_s%,4)}=ro& BYTE{ADD(adr_s%,5)}=ve& BYTE{ADD(adr_s%,6)}=bl& ENDIF CASE "VX","VY","VZ" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) adr_s%=@adresse_source(num_s&) BYTE{ADD(adr_s%,1)}=BSET(BYTE{ADD(adr_s%,1)},bit_spot|) IF MID$(CHAR{mem_che%},2,1)="X" enleve_code(mem_che%) SINGLE{ADD(adr_s%,20)}=VAL(CHAR{mem_che%}) ELSE IF MID$(CHAR{mem_che%},2,1)="Y" enleve_code(mem_che%) SINGLE{ADD(adr_s%,24)}=VAL(CHAR{mem_che%}) ELSE IF MID$(CHAR{mem_che%},2,1)="Z" enleve_code(mem_che%) SINGLE{ADD(adr_s%,28)}=VAL(CHAR{mem_che%}) ENDIF CASE "RA" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) adr_s%=@adresse_source(num_s&) BYTE{ADD(adr_s%,1)}=BSET(BYTE{ADD(adr_s%,1)},bit_spot|) enleve_code(mem_che%) INT{ADD(adr_s%,48)}=VAL(CHAR{mem_che%}) CASE "FA" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) adr_s%=@adresse_source(num_s&) BYTE{ADD(adr_s%,1)}=BSET(BYTE{ADD(adr_s%,1)},bit_spot|) enleve_code(mem_che%) INT{ADD(adr_s%,50)}=VAL(CHAR{mem_che%}) CASE "TI" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) adr_s%=@adresse_source(num_s&) BYTE{ADD(adr_s%,1)}=BSET(BYTE{ADD(adr_s%,1)},bit_spot|) enleve_code(mem_che%) INT{ADD(adr_s%,52)}=VAL(CHAR{mem_che%}) CASE "LA" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) adr_s%=@adresse_source(num_s&) BYTE{ADD(adr_s%,1)}=BSET(BYTE{ADD(adr_s%,1)},bit_surface|) enleve_code(mem_che%) SINGLE{ADD(adr_s%,32)}=VAL(CHAR{mem_che%}) CASE "LO" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) adr_s%=@adresse_source(num_s&) BYTE{ADD(adr_s%,1)}=BSET(BYTE{ADD(adr_s%,1)},bit_surface|) enleve_code(mem_che%) SINGLE{ADD(adr_s%,36)}=VAL(CHAR{mem_che%}) CASE "AD" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) adr_s%=@adresse_source(num_s&) BYTE{ADD(adr_s%,1)}=BSET(BYTE{ADD(adr_s%,1)},bit_surface|) enleve_code(mem_che%) BYTE{ADD(adr_s%,56)}=VAL(CHAR{mem_che%}) CASE "JI" num_s&=VAL(MID$(CHAR{mem_che%},3,1)) adr_s%=@adresse_source(num_s&) BYTE{ADD(adr_s%,1)}=BSET(BYTE{ADD(adr_s%,1)},bit_surface|) enleve_code(mem_che%) BYTE{ADD(adr_s%,7)}=1 ENDSELECT ENDIF EXIT IF termine! LOOP ENDIF CLOSE #1 ELSE CHAR{titre_en_cours%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"*.ebs"+CHR$(0) nombre_de_source&=10 ! Par d‚faut nous mettons 10 sources ~@nouvelle_zone_source(MUL(nombre_de_source&,taille_source&),FALSE) vider_les_sources ENDIF RETURN > PROCEDURE creation_du_fichier_defaut ! et sauvegarde OPEN "o",#1,CHAR{eb_temp%}+"\defaut.def" PRINT #1,"# EB_MODEL de BARANGER Emmanuel Version "+CHAR{version%} PRINT #1,"# Fichier de configuration de EB_MODEL lors d'un lancement … vide." PRINT #1,"# Ce fichier permet de configurer la cam‚ra et les sources de lumiŠre." PRINT #1,"# Toutes le lignes commen‡ant par '#' sont ignor‚es par EB_MODEL et servent" PRINT #1,"# de remarques." PRINT #1,"# -------------------------------------------------------------------------" PRINT #1,"# Voici la liste des commandes utilisable (Obligatoirement en MAJUSCULE):" PRINT #1,"# CAX, CAY et CAZ : Position de la cam‚ra" PRINT #1,"# VUX, VUY et VUZ : Position du point de vue de la cam‚ra" PRINT #1,"# ANG : Angle d'inclinaison horizontal de la cam‚ra" PRINT #1,"# FOC : Focale de la cam‚ra" PRINT #1,"# SPX, SPZ, SPZ : Position de la vue subjective" PRINT #1,"# SVX, SVY, SVZ : Point de vis‚ de la vue subjective" PRINT #1,"# NBC : Nombre de copie" PRINT #1,"# XCO, YCO et ZCO : Distances en copie" PRINT #1,"# RXC, RYC et RZC : Rotations en copie" PRINT #1,"# AXC, AYC et AZC : Taux de changement de taille en copie" PRINT #1,"# XA0, YA0 et ZA0 : Pourcentage d'al‚atoire des distances copi‚es" PRINT #1,"# XA1, YA1 et ZA1 : Pourcentage d'al‚atoire des rotations copi‚es" PRINT #1,"# XA2, YA2 et ZA2 : Pourcentage d'al‚atoire des tailles copi‚es" PRINT #1,"# DX0, DY0 et DZ0 : Distribution des distances copi‚es" PRINT #1,"# DX1, DY1 et DZ1 : Distribution des rotations copi‚es" PRINT #1,"# ACT : R‚f‚rence de copie sur premier objet ou non" PRINT #1,"# ALE : Valeur d'initialisation al‚atoire" PRINT #1,"# SRC : Nombre de source de lumiŠre par d‚faut" PRINT #1,"# NO? : Nom d'une source de lumiŠres" PRINT #1,"# LX?, LY? et LZ? : Position d'une source de lumiŠre" PRINT #1,"# RO?, VE? et BL? : Couleur d'une source de lumiŠre en RVB" PRINT #1,"# VX?, VY? et VZ? : Point de vis‚ d'un projecteur" PRINT #1,"# RA? : Rayon int‚rieur d'un projecteur" PRINT #1,"# FA? : Rayon ext‚rieur d'un projecteur" PRINT #1,"# TI? : Qualit‚ du d‚grad‚ entre RA? et FA?" PRINT #1,"# LA? : Largeur d'une surface lumineuse" PRINT #1,"# LO? : Longueur d'une surface lumineuse" PRINT #1,"# AD? : Adaptive d'une surface lumineuse" PRINT #1,"# JI? : Activation de l'option JITTER d'une surface" PRINT #1,"# -------------------------------------------------------------------------" PRINT #1,"# Le simple fait d'activer un point de vis‚ de projecteur indique … EB_MODEL" PRINT #1,"# que la source consid‚r‚e en est un (projecteur)." PRINT #1,"# Bien sur, les commandes qui ne sont pas donn‚es dans ce fichier ont une" PRINT #1,"# valeur par d‚faut (trŠs souvent … 0)." PRINT #1,"# ATTENTION : Si EB_MODEL accepte un nombre de 999 sources de lumiŠre, …" PRINT #1,"# partir de ce fichier de configuration, il n'est possible de ne fixer que" PRINT #1,"# 10 sources au maximum." PRINT #1,"# Par contre, le nombre maximum de sources (fix‚ par la commande 'SRC' peut" PRINT #1,"# all‚ jusqu'… 999." PRINT #1,"# -------------------------------------------------------------------------" PRINT #1,"# Position de la cam‚ra en X Y Z." PRINT #1,"# Les valeurs peuvent avoir jusqu'a 3 chiffres aprŠs la virgule." PRINT #1,"CAX 100" PRINT #1,"CAY 100" PRINT #1,"CAZ -200" PRINT #1,"# Position du point de vue en X Y Z" PRINT #1,"# Les valeurs peuvent avoir jusqu'a 3 chiffres aprŠs la virgule." PRINT #1,"VUX 0" PRINT #1,"VUY 0" PRINT #1,"VUZ 0" PRINT #1,"# Angle d'inclinaison de l'horizon en degr‚s" PRINT #1,"# La valeur peut avoir jusqu'a 3 chiffres aprŠs la virgule." PRINT #1,"ANG 0" PRINT #1,"# Position par d‚faut de l'oeuil de la vue subjective" PRINT #1,"SPX 500" PRINT #1,"SPY 200" PRINT #1,"SPZ -250" PRINT #1,"# Point de vis‚ par d‚faut de l'oeuil de la vue subjective" PRINT #1,"SVX 0" PRINT #1,"SVY 0" PRINT #1,"SVZ 0" PRINT #1,"# Type de Focale ou angle d'ouverture en d‚gr‚s" PRINT #1,"# %1=50mm, %2=6mm, %3=135mm, %4=280mm, %5=35mm, %6=28mm, %7=24mm, %8=18mm" PRINT #1,"# Toute autre expr‚ssion est consid‚r‚e comme l'angle en degr‚s" PRINT #1,"# L'angle peut avoir jusqu'a 3 chiffres aprŠs la virgule." PRINT #1,"FOC %1" PRINT #1,"# Ici, on peut installer des valeurs par d‚faut pour les options de copie" PRINT #1,"# Tout d'abord, le nombre de copie par d‚faut" PRINT #1,"NBC 1" PRINT #1,"# Puis, les translations des copies sur X,Y et Z" PRINT #1,"XCO 0" PRINT #1,"YCO 0" PRINT #1,"ZCO 0" PRINT #1,"# Puis, les rotations des copies sur X, Y et Z" PRINT #1,"RXC 0" PRINT #1,"RYC 0" PRINT #1,"RZC 0" PRINT #1,"# Les taux d'agrandissement/R‚tr‚cissement des copies sur X, Y et Z" PRINT #1,"# bien sur, ces taux sont en pourcentage." PRINT #1,"AXC 100" PRINT #1,"AYC 100" PRINT #1,"AZC 100" PRINT #1,"# Les taux de tirage al‚atoire pour les distances" PRINT #1,"XA0 0" PRINT #1,"YA0 0" PRINT #1,"ZA0 0" PRINT #1,"# Les taux de tirage al‚atoire pour les rotations" PRINT #1,"XA1 0" PRINT #1,"YA1 0" PRINT #1,"ZA1 0" PRINT #1,"# Les taux de tirage al‚atoire des changements de taille" PRINT #1,"XA2 0" PRINT #1,"YA2 0" PRINT #1,"ZA2 0" PRINT #1,"# Si les distances copi‚es sont distribu‚es de part et autre de l'objet" PRINT #1,"# mettre les valeurs … 1 sinon … 0" PRINT #1,"DX0 0" PRINT #1,"DY0 0" PRINT #1,"DZ0 0" PRINT #1,"# Idem pour les rotations" PRINT #1,"DX1 0" PRINT #1,"DY1 0" PRINT #1,"DZ1 0" PRINT #1,"# Pour que se soit le premier objet qui serve de r‚f‚rence … toutes les" PRINT #1,"# copies, il faut mettre cette valeur … 1 sinon … 0." PRINT #1,"ACT 0" PRINT #1,"# Cette valeur de 9 chiffres maximum initialise les tirages al‚atoire." PRINT #1,"# Avec une mˆme valeur, les tirages al‚atoires sont identiques … chaque fois." PRINT #1,"ALE 24041967" PRINT #1,"# Suit les sources de lumiŠre" PRINT #1,"# le nombre d‚sir‚ par la commande 'SRC'" PRINT #1,"SRC 10" PRINT #1,"# PremiŠre lampe" PRINT #1,"# Son nom (21 caractŠres maximum)" PRINT #1,"NO0 SOLEIL" PRINT #1,"# Sa position." PRINT #1,"# les valeurs ne peuvent avoir de virgule. Ce sont des entiers" PRINT #1,"LX0 150" PRINT #1,"LY0 150" PRINT #1,"LZ0 -150" PRINT #1,"# Couleur de la lampe" PRINT #1,"# Les valeurs sont comprise entre 0 et 255 (composantes de couleur R.V.B.)" PRINT #1,"# avec 0 = 0% et 255 = 100%" PRINT #1,"RO0 255" PRINT #1,"VE0 255" PRINT #1,"BL0 255" PRINT #1,"EOF" CLOSE #1 RETURN ' .............................................................................. > PROCEDURE charger_l_envirronnement ! Lire "ENVIRRON.CFG" LOCAL i&,i%,top&,atop&,x_ouv&,y_ouv&,w_ouv&,h_ouv&,dum& minuscule(mem_che%) OPEN "i",#2,CHAR{mem_che%} IF LOF(#2) ' -------------------------------------------------------------------------- ' ----- D'abord, v‚rifier si la r‚solution est ‚gale ou sup‚rieure. ----- ' -------------------------------------------------------------------------- INPUT #2,x_ouv& INPUT #2,y_ouv& IF (xmax&<>x_ouv&) OR (ymax&<>y_ouv&) ' ------------------------------------------------------------------------ ' --- Mauvaise r‚solution...On arrˆte tout ici et on ouvre par d‚faut ---- ' --- la boŒte … outils et la fenˆtre de vue. ---- ' ------------------------------------------------------------------------ CLOSE #2 ouvrir_outils ouvrir_fenetre_de_vue(-1,-1,-1,-1) ELSE ' ------------------------------------------------------------------------ ' --- Maintenant, on r‚cupŠre toutes les positions des fenˆtres... ----- ' ------------------------------------------------------------------------ CLR i& DO INPUT #2,dum& INPUT #2,x_ouv& INPUT #2,y_ouv& IF i&=24 ' -------------------------------------------------------------------- ' ----- R‚cupŠre la taille de la fenˆtre de vue ----- ' -------------------------------------------------------------------- INPUT #2,w_ouv& INPUT #2,h_ouv& ENDIF IF i&=30 ' -------------------------------------------------------------------- ' ----- R‚cupŠre la taille de la fenˆtre de hierarchie ----- ' -------------------------------------------------------------------- INPUT #2,w_ouv& INPUT #2,h_ouv& INPUT #2,largeur_hierarchie% INPUT #2,hauteur_hierarchie% ENDIF IF x_ouv&<>-999 i%=@arbre_ressource(i&) OB_X(i%,0)=x_ouv& OB_Y(i%,0)=y_ouv& IF dum&>0 $S&,$S> SELECT i& CASE 0 ouvrir_information CASE 1 ouvrir_outils CASE 2 ' Pour plus tard CASE 3 IF nombre_d_objets&>0 ouvrir_modification ENDIF CASE 4 ' Pour plus tard CASE 5 ' Pour plus tard CASE 6 ouvrir_lumieres CASE 7 ouvrir_aide CASE 8 IF nombre_d_objets&>0 ouvrir_fonctions ENDIF CASE 9 ouvrir_les_calques CASE 10 ouvrir_statistiques CASE 11 ouvrir_merci CASE 12 ouvrir_camera CASE 13 ouvrir_lanceur_pov CASE 14 ' Pour plus tard CASE 15 ouvrir_parametrages CASE 16 ' Pour plus tard CASE 17 ouvrir_bicubics CASE 18 ouvrir_image_auteur CASE 20 IF fl_timer! temps_des_calcul!=TRUE ouvrir_temps_passe ENDIF CASE 21 ' Pour plus tard CASE 22 ' Pour plus tard CASE 23 ' Pour plus tard CASE 24 ouvrir_fenetre_de_vue(x_ouv&,y_ouv&,w_ouv&,h_ouv&) CASE 25 ouvrir_les_calages CASE 26 info_objet_supp!=TRUE ouvrir_info_objet CASE 27 ouvrir_creation_quartic CASE 28 ouvrir_creation_quadric CASE 29 ouvrir_bibliotheque CASE 30 OB_W(adr_hierarchie%,hie_sous&)=w_ouv& OB_H(adr_hierarchie%,hie_sous&)=h_ouv& IF nombre_d_objets&>0 ouvrir_hierarchie ENDIF CASE 31 IF nombre_d_objets&>0 ouvrir_animation ELSE fermeture_fenetre(48) ouvrir_fenetre_de_vue(-1,-1,-1,-1) ENDIF ENDSELECT ENDIF ENDIF INC i& LOOP WHILE i&<32 ' ------------------------------------------------------------------------ ' ----- Changement de la fenˆtre au TOP ----- ' ------------------------------------------------------------------------ ~@wind_get(0,wf_top&,atop&,dum&,dum&,dum&) atop&=@numero_fenetre(atop&) INPUT #2,top& ENDIF CLOSE #2 IF top&<>atop& IF INT{ADD(hwind%,SHL(top&,1))}>-1 wind_set(INT{ADD(hwind%,SHL(top&,1))},wf_top&,0,0,0,0) ENDIF ENDIF 2d_3d mise_a_la_taille_fenetre_de_vue redraw_force(idx_info&,idx_animation&) ENDIF ' ---------------------------------------------------------------------------- RETURN > PROCEDURE sauver_l_envirronnement ! et sauvegarde LOCAL top&,i&,i%,xw&,xh&,cl&,dum& ' OPEN "o",#1,CHAR{eb_temp%}+"\environn.cfg" ' ........... On sauve la r‚solution de l'‚cran actuelle... PRINT #1,xmax& PRINT #1,ymax& ' ........... Maintenant, on sauve toutes les positions des fenˆtres... CLR i& DO i%=@arbre_ressource(i&) IF i%=adr_desk% xw&=-999 yw&=-999 cl&=-1 ELSE xw&=OB_X(i%,0) yw&=OB_Y(i%,0) cl&=INT{ADD(hwind%,SHL(i&,1))} ENDIF PRINT #1,cl& PRINT #1,xw& PRINT #1,yw& IF i&=24 ' ........... Et la taille de la fenˆtre de vue. PRINT #1,OB_W(@arbre_ressource(i&),0) PRINT #1,OB_H(@arbre_ressource(i&),0) ELSE IF i&=30 ' ........... Et la taille de la fenˆtre de hi‚rarchie. PRINT #1,OB_W(@arbre_ressource(i&),hie_sous&) PRINT #1,OB_H(@arbre_ressource(i&),hie_sous&) PRINT #1,largeur_hierarchie% PRINT #1,hauteur_hierarchie% ENDIF INC i& LOOP WHILE i&<32 ~@wind_get(0,wf_top&,top&,dum&,dum&,dum&) PRINT #1,@numero_fenetre(top&) CLOSE #1 RETURN ' .............................................................................. > PROCEDURE charger_derniere_session ! Lire "EN_COURS.PRJ" LOCAL i&,termine!,l% minuscule(mem_che%) OPEN "i",#1,CHAR{mem_che%} IF LOF(#1) DO membfill(mem_che%,512,0) termine!=@lire_une_ligne(mem_che%) EXIT IF LEFT$(CHAR{mem_che%},3)="EOF" IF LEN(CHAR{mem_che%})>1 $S$,$S> SELECT LEFT$(CHAR{mem_che%},3) CASE "TIT" enleve_code(mem_che%) CHAR{titre_en_cours%}=CHAR{mem_che%} CASE "CHE" enleve_code(mem_che%) CHAR{{OB_SPEC(adr_parametres%,cheebs&)}}=CHAR{mem_che%} CASE "ZOO" enleve_code(mem_che%) zoom%=VAL(CHAR{mem_che%}) CASE "MOD" enleve_code(mem_che%) dessin_3d|=VAL(CHAR{mem_che%}) CASE "MEM" enleve_code(mem_che%) memoire_dessin|=VAL(CHAR{mem_che%}) CASE "DPX" enleve_code(mem_che%) deplacement_en_x&=VAL(CHAR{mem_che%}) CASE "DPY" enleve_code(mem_che%) deplacement_en_y&=VAL(CHAR{mem_che%}) CASE "TRA" enleve_code(mem_che%) trait!=VAL(CHAR{mem_che%}) CASE "FAC" enleve_code(mem_che%) face_pleine!=VAL(CHAR{mem_che%}) CASE "OBJ" enleve_code(mem_che%) objet_actif&=VAL(CHAR{mem_che%}) CASE "CTR" enleve_code(mem_che%) centrage_auto!=VAL(CHAR{mem_che%}) CASE "TOT" enleve_code(mem_che%) total_auto!=VAL(CHAR{mem_che%}) CASE "3VU" enleve_code(mem_che%) trois_vue!=VAL(CHAR{mem_che%}) ENDSELECT ENDIF EXIT IF termine! LOOP ENDIF CLOSE #1 ' IF @s_exist(titre_en_cours%) IF @alerte_session_precedente=1 charger_fichier_ebs(TRUE) mise_a_jour_des_chemins_et_nom_de_fichier mise_a_jour_de_l_objet_actif(TRUE) ELSE ~@nouvelle_scene(TRUE) ENDIF ELSE ~@nouvelle_scene(TRUE) ENDIF demarquer_les_menus marquer_les_menus RETURN > PROCEDURE sauver_dernier_session ! et sauvegarde LOCAL cl&,l% ' Sauvegarde du projet pour ˆtre recharger a la prochaine cession de travail IF nombre_d_objets&>0 CHAR{msq%}="ebs"+CHR$(0) minuscule(msq%) minuscule(titre_en_cours%) IF MID$(CHAR{titre_en_cours%},SUCC(RINSTR(CHAR{titre_en_cours%},"\")),LEN(LEFT$(CHAR{titre_en_cours%},RINSTR(CHAR{titre_en_cours%},"\"))))<>"*."+CHAR{msq%} membfill(mem_che%,512,0) CHAR{mem_che%}=CHAR{eb_temp%}+"\en_cours.prj"+CHR$(0) minuscule(mem_che%) OPEN "o",#1,CHAR{mem_che%} PRINT #1,"TIT ";CHAR{titre_en_cours%} PRINT #1,"CHE ";CHAR{{OB_SPEC(adr_parametres%,cheebs&)}} PRINT #1,"ZOO ";zoom% PRINT #1,"MOD ";dessin_3d| PRINT #1,"MEM ";memoire_dessin| PRINT #1,"DPX ";deplacement_en_x& PRINT #1,"DPY ";deplacement_en_y& PRINT #1,"TRA ";trait! PRINT #1,"FAC ";face_pleine! PRINT #1,"OBJ ";objet_actif& PRINT #1,"CTR ";centrage_auto! PRINT #1,"TOT ";total_auto! PRINT #1,"3VU ";trois_vue! PRINT #1,"EOF" PRINT #1,"" CLOSE #1 ENDIF ELSE membfill(mem_che%,512,0) CHAR{mem_che%}=CHAR{eb_temp%}+"\en_cours.prj"+CHR$(0) efface_fichier ENDIF RETURN ' .............................................................................. > PROCEDURE sauvegarde_palette_systeme ! Et une palette ! Une ! LOCAL i&,i%,r&,v&,b& RESTORE pal CLR i& i%=palette% DO inquire_color_representation(i&,r&,v&,b&,vdihandle%) INT{i%}=r& INT{ADD(i%,2)}=v& INT{ADD(i%,4)}=b& IF palette_ebmodel! READ r&,v&,b& set_color_representation(i&,r&,v&,b&,vdihandle%) ENDIF INC i& ADD i%,6 LOOP WHILE i&<256 ' ****************************************************************************** pal: DATA 1000,1000,1000 DATA 0000,0000,0000 DATA 1000,0000,0000 DATA 0000,1000,0000 DATA 0000,0000,1000 DATA 0000,1000,1000 DATA 1000,1000,0000 DATA 1000,0000,1000 DATA 0800,0800,0800 DATA 0533,0533,0533 DATA 0659,0000,0000 DATA 0000,0659,0000 DATA 0000,0000,0659 DATA 0000,0659,0659 DATA 0659,0659,0000 DATA 0659,0000,0659 DATA 0000,0000,0200 DATA 0000,0000,0400 DATA 0000,0000,0600 DATA 0000,0000,0800 DATA 0000,0000,1000 DATA 0000,0200,0000 DATA 0000,0200,0200 DATA 0000,0200,0400 DATA 0000,0200,0600 DATA 0000,0200,0800 DATA 0000,0200,1000 DATA 0000,0400,0000 DATA 0000,0400,0200 DATA 0000,0400,0400 DATA 0000,0400,0600 DATA 0000,0400,0800 DATA 0000,0400,1000 DATA 0000,0600,0000 DATA 0000,0600,0200 DATA 0000,0600,0400 DATA 0000,0600,0600 DATA 0000,0600,0800 DATA 0000,0600,1000 DATA 0000,0800,0000 DATA 0000,0800,0200 DATA 0000,0800,0400 DATA 0000,0800,0600 DATA 0000,0800,0800 DATA 0000,0800,1000 DATA 0000,1000,0000 DATA 0000,1000,0200 DATA 0000,1000,0400 DATA 0000,1000,0600 DATA 0000,1000,0800 DATA 0000,1000,1000 DATA 0200,0000,0000 DATA 0200,0000,0200 DATA 0200,0000,0400 DATA 0200,0000,0600 DATA 0200,0000,0800 DATA 0200,0000,1000 DATA 0200,0200,0000 DATA 0200,0200,0200 DATA 0200,0200,0400 DATA 0000,0000,0753 DATA 0200,0200,0800 DATA 0200,0200,1000 DATA 0200,0400,0000 DATA 0200,0400,0200 DATA 0200,0400,0400 DATA 0200,0400,0600 DATA 0200,0400,0800 DATA 0200,0400,1000 DATA 0200,0600,0000 DATA 0200,0600,0200 DATA 0200,0600,0400 DATA 0200,0600,0600 DATA 0200,0600,0800 DATA 0200,0600,1000 DATA 0200,0800,0000 DATA 0200,0800,0200 DATA 0200,0800,0400 DATA 0200,0800,0600 DATA 0200,0800,0800 DATA 0200,0800,1000 DATA 0200,1000,0000 DATA 0200,1000,0200 DATA 0200,1000,0400 DATA 0200,1000,0600 DATA 0200,1000,0800 DATA 0200,1000,1000 DATA 0400,0000,0000 DATA 0400,0000,0200 DATA 0400,0000,0400 DATA 0400,0000,0600 DATA 0400,0000,0800 DATA 0400,0000,1000 DATA 0400,0200,0000 DATA 0400,0200,0200 DATA 0400,0200,0400 DATA 0400,0200,0600 DATA 0400,0200,0800 DATA 0400,0200,1000 DATA 0400,0400,0000 DATA 0400,0400,0200 DATA 0400,0400,0400 DATA 0400,0400,0600 DATA 0400,0400,0800 DATA 0400,0400,1000 DATA 0400,0600,0000 DATA 0400,0600,0200 DATA 0400,0600,0400 DATA 0400,0600,0600 DATA 0400,0600,0800 DATA 0400,0600,1000 DATA 0400,0800,0000 DATA 0400,0800,0200 DATA 0400,0800,0400 DATA 0400,0800,0600 DATA 0400,0800,0800 DATA 0400,0800,1000 DATA 0400,1000,0000 DATA 0400,1000,0200 DATA 0400,1000,0400 DATA 0400,1000,0600 DATA 0400,1000,0800 DATA 0400,1000,1000 DATA 0600,0000,0000 DATA 0600,0000,0200 DATA 0600,0000,0400 DATA 0600,0000,0600 DATA 0600,0000,0800 DATA 0600,0000,1000 DATA 0600,0200,0000 DATA 0600,0200,0200 DATA 0600,0200,0400 DATA 0600,0200,0600 DATA 0600,0200,0800 DATA 0600,0200,1000 DATA 0600,0400,0000 DATA 0600,0400,0200 DATA 0600,0400,0400 DATA 0600,0400,0600 DATA 0600,0400,0800 DATA 0600,0400,1000 DATA 0600,0600,0000 DATA 0600,0600,0200 DATA 0600,0600,0400 DATA 0600,0600,0600 DATA 0600,0600,0800 DATA 0600,0600,1000 DATA 0600,0800,0000 DATA 0600,0800,0200 DATA 0600,0800,0400 DATA 0600,0800,0600 DATA 0600,0800,0800 DATA 0600,0800,1000 DATA 0600,1000,0000 DATA 0600,1000,0200 DATA 0600,1000,0400 DATA 0600,1000,0600 DATA 0600,1000,0800 DATA 0600,1000,1000 DATA 0800,0000,0000 DATA 0800,0000,0200 DATA 0800,0000,0400 DATA 0800,0000,0600 DATA 0800,0000,0800 DATA 0800,0000,1000 DATA 0800,0200,0000 DATA 0800,0200,0200 DATA 0800,0200,0400 DATA 0800,0200,0600 DATA 0800,0200,0800 DATA 0800,0200,1000 DATA 0800,0400,0000 DATA 0800,0400,0200 DATA 0800,0400,0400 DATA 0800,0400,0600 DATA 0800,0400,0800 DATA 0800,0400,1000 DATA 0800,0600,0000 DATA 0800,0600,0200 DATA 0800,0600,0400 DATA 0800,0600,0600 DATA 0800,0600,0800 DATA 0800,0600,1000 DATA 0800,0800,0000 DATA 0800,0800,0200 DATA 0800,0800,0400 DATA 0800,0800,0600 DATA 0800,0800,0800 DATA 0800,0800,1000 DATA 0800,1000,0000 DATA 0800,1000,0200 DATA 0800,1000,0400 DATA 0800,1000,0600 DATA 0800,1000,0800 DATA 0800,1000,1000 DATA 1000,0000,0000 DATA 1000,0000,0200 DATA 1000,0000,0400 DATA 1000,0000,0600 DATA 1000,0000,0800 DATA 1000,0000,1000 DATA 1000,0200,0000 DATA 1000,0200,0200 DATA 1000,0200,0400 DATA 1000,0200,0600 DATA 1000,0200,0800 DATA 1000,0200,1000 DATA 1000,0400,0000 DATA 1000,0400,0200 DATA 1000,0400,0400 DATA 1000,0400,0600 DATA 1000,0400,0800 DATA 1000,0400,1000 DATA 1000,0600,0000 DATA 1000,0600,0200 DATA 1000,0600,0400 DATA 1000,0600,0600 DATA 1000,0600,0800 DATA 1000,0600,1000 DATA 1000,0800,0000 DATA 1000,0800,0200 DATA 1000,0800,0400 DATA 1000,0800,0600 DATA 1000,0800,0800 DATA 1000,0800,1000 DATA 1000,1000,0000 DATA 1000,1000,0200 DATA 1000,1000,0400 DATA 1000,1000,0600 DATA 1000,1000,0800 DATA 0949,0000,0000 DATA 0902,0000,0000 DATA 0753,0000,0000 DATA 0702,0000,0000 DATA 0502,0000,0000 DATA 0302,0000,0000 DATA 0102,0000,0000 DATA 0000,0949,0000 DATA 0000,0902,0000 DATA 0000,0753,0000 DATA 0000,0702,0000 DATA 0000,0502,0000 DATA 0000,0302,0000 DATA 0000,0102,0000 DATA 0000,0000,0102 DATA 0000,0000,0302 DATA 0000,0000,0502 DATA 0000,0000,0702 DATA 0200,0200,0600 DATA 0000,0000,0902 DATA 0949,0949,0949 DATA 0902,0902,0902 DATA 0753,0753,0753 DATA 0702,0702,0702 DATA 0302,0302,0302 DATA 0102,0102,0102 ' RETURN > PROCEDURE reinstalle_palette_systeme ! Allez, on la rend la palette LOCAL i&,i% ' Redonner la palette au systŠme. Normal, c'est la sienne aprŠs tout... IF palette%<>0 CLR i& i%=palette% DO set_color_representation(i&,INT{i%},INT{ADD(i%,2)},INT{ADD(i%,4)},vdihandle%) INC i& ADD i%,6 LOOP WHILE i&<256 ENDIF RETURN ' .............................................................................. > FUNCTION charger_image_de_fond(vue|) ! Charger les images pour copier LOCAL en_tete&,plan&,pattern&,largeur_dest&,buffer% LOCAL taille_fichier%,adr_source%,buffer%,taille% LOCAL image_flg!,f_handle% LOCAL image_largeur& LOCAL image_hauteur& LOCAL image_adresse% ' CHAR{masque%}="img"+CHR$(0) definition_fichier(adr_image_fond%,imgfon01&,nom_divers%,FALSE,FALSE,-1) ' SELECT vue| CASE image_fond_face| CHAR{nom_divers%}="face.img"+CHR$(0) ABSOLUTE image_flg!,*image_flg_face! ABSOLUTE image_largeur&,*largeur_buf_af_face& ABSOLUTE image_hauteur&,*hauteur_buf_af_face& ABSOLUTE image_adresse%,*image_buf_face% CASE image_fond_dos| CHAR{nom_divers%}="dos.img"+CHR$(0) ABSOLUTE image_flg!,*image_flg_dos! ABSOLUTE image_largeur&,*largeur_buf_af_dos& ABSOLUTE image_hauteur&,*hauteur_buf_af_dos& ABSOLUTE image_adresse%,*image_buf_dos% CASE image_fond_droite| CHAR{nom_divers%}="droite.img"+CHR$(0) ABSOLUTE image_flg!,*image_flg_droite! ABSOLUTE image_largeur&,*largeur_buf_af_droite& ABSOLUTE image_hauteur&,*hauteur_buf_af_droite& ABSOLUTE image_adresse%,*image_buf_droite% CASE image_fond_gauche| CHAR{nom_divers%}="gauche.img"+CHR$(0) ABSOLUTE image_flg!,*image_flg_gauche! ABSOLUTE image_largeur&,*largeur_buf_af_gauche& ABSOLUTE image_hauteur&,*hauteur_buf_af_gauche& ABSOLUTE image_adresse%,*image_buf_gauche% CASE image_fond_dessus| CHAR{nom_divers%}="dessus.img"+CHR$(0) ABSOLUTE image_flg!,*image_flg_dessus! ABSOLUTE image_largeur&,*largeur_buf_af_dessus& ABSOLUTE image_hauteur&,*hauteur_buf_af_dessus& ABSOLUTE image_adresse%,*image_buf_dessus% CASE image_fond_dessous| CHAR{nom_divers%}="dessous.img"+CHR$(0) ABSOLUTE image_flg!,*image_flg_dessous! ABSOLUTE image_largeur&,*largeur_buf_af_dessous& ABSOLUTE image_hauteur&,*hauteur_buf_af_dessous& ABSOLUTE image_adresse%,*image_buf_dessous% ENDSELECT ' image_flg!=FALSE membfill(mem_che%,512,0) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) IF @s_exist(mem_che%) ' Chargement d'un fichier BITMAP au format GEM -> *.IMG f_handle%=@fopen(mem_che%,gemdos_read%) taille_fichier%=@flof(f_handle%) buffer%=@prendre(taille_fichier%,TRUE,3) ~@fread(f_handle%,buffer%,taille_fichier%) ~@fclose(f_handle%) ' OPEN "i",#1,CHAR{mem_che%} ' taille_fichier%=LOF(#1) ' buffer%=@prendre(taille_fichier%,TRUE,3) ' BGET #1,buffer%,taille_fichier% ' CLOSE #1 ' en_tete&=WORD{ADD(buffer%,2)}*2 ! Taille en-tˆte en octets ' L'adresse source pour le d‚compactage est juste aprŠs l'en-tˆte. ' Ne pas se fier au fait que "g‚n‚ralement" celle-ci fait 8 mots !!! adr_source%=ADD(buffer%,en_tete&) plan&=WORD{ADD(buffer%,4)} ! Nombre de plans de l'image IF plan&=1 pattern&=WORD{ADD(buffer%,6)} ! nbr d'octets du PATTERN_RUN image_largeur&=WORD{ADD(buffer%,12)} ! Largeur de l'image image_hauteur&=WORD{ADD(buffer%,14)} ! Hauteur de l'image largeur_dest&=SHR(largeur_buf_af_face&,4) ' taille%=(image_largeur&/8*image_hauteur&) taille%=MUL(MUL(DIV(ADD(image_largeur&,15),16),2),image_hauteur&) image_adresse%=@prendre(taille%,TRUE,3) ' $C+ ' ~C:load_img%(L:adr_source%,L:image_adresse%,W:plan&,W:pattern&,W:image_largeur&,W:image_hauteur&,W:largeur_dest&) ~C:img_asm%(L:buffer%,L:image_adresse%,image_largeur&,image_hauteur&,L:taille%) ' ~C:char_img%(L:adr_source%,L:image_adresse%,plan&,pattern&,image_largeur&,image_hauteur&,largeur_dest&) $C- ELSE ~@afficher_alerte(adr_nomonochrome%) RETURN FALSE ENDIF libere(*buffer%) image_flg!=TRUE RETURN TRUE ENDIF RETURN FALSE ' ENDFUNC ' > PROCEDURE assigner_les_images_de_fond ! Oh!, on peut d‚calquer ici... LOCAL fx&,fy&,fw&,fh&,evnt&,mem_ob&,pr_f&,sort! ' form_center(adr_image_fond%,fx&,fy&,fw&,fh&) x&=SHL(SHR(x&,4),4) form_dial(0,fx&,fy&,ADD(fw&,4),ADD(fh&,4),fx&,fy&,ADD(fw&,4),ADD(fh&,4)) ' videsouris ' pr_f&=@wind_create(0,fx&,fy&,fw&,fh&) IF pr_f&>-1 wind_open(pr_f&,fx&,fy&,fw&,fh&) ENDIF ' objc_draw(adr_image_fond%,0,12,fx&,fy&,fw&,fh&,-1) sort!=FALSE DO ' Appel fonction xform_do() juste pour la fenˆtre concern‚e evnt&=@xform_do(&X110011,adr_image_fond%,0) IF BTST(evnt&,0) ! EVENEMENT CLAVIER IF key&=&HD ' RETURN/ENTER objet&=imgfonok& evnt&=2 ELSE CLR evnt& ENDIF ENDIF EXIT IF sort! IF BTST(evnt&,1) ! EVENEMENT DE CLIC SOURIS $S&,$S> SELECT objet& CASE imgfon01& ob_state(adr_image_fond%,imgfon01&,aes_selected&,FALSE) CHAR{masque%}="img"+CHR$(0) membfill(nom_divers%,256,0) definition_fichier(adr_image_fond%,imgfon01&,nom_divers%,FALSE,TRUE,-1) CHAR{{OB_SPEC(adr_image_fond%,imgfon01&)}}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%}+CHR$(0) vider_les_images_de_fond IF @charger_image_de_fond(image_fond_face|) redessin_deja_fait!=FALSE ENDIF IF @charger_image_de_fond(image_fond_dos|) redessin_deja_fait!=FALSE ENDIF IF @charger_image_de_fond(image_fond_droite|) redessin_deja_fait!=FALSE ENDIF IF @charger_image_de_fond(image_fond_gauche|) redessin_deja_fait!=FALSE ENDIF IF @charger_image_de_fond(image_fond_dessus|) redessin_deja_fait!=FALSE ENDIF IF @charger_image_de_fond(image_fond_dessous|) redessin_deja_fait!=FALSE ENDIF redraw_elem(adr_image_fond%,imgfon01&) CASE imgfonef& objc_change(adr_image_fond%,objet&) vider_les_images_de_fond CASE imgfonok& objc_change(adr_image_fond%,objet&) form_dial(3,fx&,fy&,ADD(fw&,4),ADD(fh&,4),fx&,fy&,ADD(fw&,4),ADD(fh&,4)) ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' sort!=TRUE ENDSELECT ENDIF EXIT IF sort! LOOP RETURN > PROCEDURE vider_les_images_de_fond libere(*image_buf_af%) libere(*image_buf_face%) CLR largeur_buf_af_face&,hauteur_buf_af_face& libere(*image_buf_dos%) CLR largeur_buf_af_dos&,hauteur_buf_af_dos& libere(*image_buf_droite%) CLR largeur_buf_af_droite&,hauteur_buf_af_droite& libere(*image_buf_gauche%) CLR largeur_buf_af_gauche&,hauteur_buf_af_gauche& libere(*image_buf_dessus%) CLR largeur_buf_af_dessus&,hauteur_buf_af_dessus& libere(*image_buf_dessous%) CLR largeur_buf_af_dessous&,hauteur_buf_af_dessous& image_flg_face!=FALSE image_flg_dos!=FALSE image_flg_droite!=FALSE image_flg_gauche!=FALSE image_flg_dessus!=FALSE image_flg_dessous!=FALSE CLR image_fond| redessin_deja_fait!=FALSE RETURN ' > PROCEDURE inverse_image_h(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&) LOCAL x_source&,x_destination&,taille_fic% taille_fic%=largeur_buf_af&/8*hauteur_buf_af&*plan_systeme& membfill(image_buf_af%,taille_fic%,0) ' CLR x_source& x_destination&=PRED(dl&) DO copy_raster_transparent(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x_source&,0,x_source&,PRED(sh&),x_destination&,0,x_destination&,PRED(dh&)) DEC x_destination& INC x_source& LOOP WHILE x_source& PROCEDURE inverse_image_v(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&) LOCAL y_source&,y_destination&,taille_fic% taille_fic%=largeur_buf_af&/8*hauteur_buf_af&*plan_systeme& membfill(image_buf_af%,taille_fic%,0) ' CLR y_source& y_destination&=PRED(dh&) DO copy_raster_transparent(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,0,y_source&,PRED(sl&),y_source&,0,y_destination&,PRED(dl&),y_destination&) DEC y_destination& INC y_source& LOOP WHILE y_source& PROCEDURE charger_les_trames ! Les trames d'affichage LOCAL tt% CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\trames\trames.ovl"+CHR$(0) IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} tt%=LOF(#1) BGET #1,trame%,tt% CLOSE #1 ELSE ~@afficher_alerte(adr_movl1%) close_virtual_screen_workstation(vdihandle%) ! On ferme la sation de travail liberation_memoire ! On rend la m‚moire au GEM appl_exit ! et on le dit au GEM END ! L…, c'est la fin...snif...snif ENDIF RETURN ' .............................................................................. > FUNCTION lire_une_ligne(b%) LOCAL lig%,f!,pos% lig%=b% DO BGET #1,lig%,1 f!=EOF(#1) EXIT IF (BYTE{lig%}=13) OR (BYTE{lig%}=10) OR (f!=TRUE) INC lig% LOOP lig%=b% DO EXIT IF (BYTE{lig%}=13) OR (BYTE{lig%}=10) OR (BYTE{lig%}=35) INC lig% LOOP BYTE{lig%}=0 pos%=PRED(LEN(CHAR{b%})) DO EXIT IF BYTE{ADD(b%,pos%)}<>&H20 BYTE{ADD(b%,pos%)}=0 DEC pos% LOOP RETURN f! ENDFUNC > PROCEDURE enleve_code(b%) ! On enlŠve les espaces en trop CHAR{b%}=RIGHT$(CHAR{b%},SUB(LEN(CHAR{b%}),3)) b%=@enleve_caractere(b%,&H20) RETURN ' ****************************************************************************** ' *************** Chargement et conversions des images utiles ****************** ' ****************************************************************************** > PROCEDURE charger_images_utiles LOCAL adr_image%,taille_image%,largeur_image&,hauteur_image&,force_img! ' ' Ici nous allons chercher si les images au formats ‚cran sont pr‚sentes ' En cas d'absence, il faut les afficher et les convertir pour la prochaine ' session de travail. ' IF flag_creation_eb_temp! force_img!=TRUE ELSE force_img!=@test_touche_morte(TRUE,FALSE,FALSE,FALSE) ENDIF ' IF force_img! CHAR{mem_nom%}="presente.ecr"+CHR$(0) CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\presente.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_presente& INPUT #1;hauteur_presente& INPUT #1;taille_image% presente%=@prendre(taille_image%,TRUE,3) BGET #1,presente%,taille_image% CLOSE #1 ' CHAR{mem_nom%}="auteur.ecr"+CHR$(0) CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\auteur.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_auteur& INPUT #1;hauteur_auteur& INPUT #1;taille_image% auteur%=@prendre(taille_image%,TRUE,3) BGET #1,auteur%,taille_image% CLOSE #1 ' CHAR{mem_nom%}="fond.ecr"+CHR$(0) CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\fond\fond.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_image& INPUT #1;hauteur_image& INPUT #1;taille_image% adr_image%=@prendre(taille_image%,TRUE,3) BGET #1,adr_image%,taille_image% CLOSE #1 ' @coloriage_du_fond(adr_image%,0,0,largeur_image&,hauteur_image&) ' libere(*adr_image%) ' CHAR{mem_nom%}="roue.ecr"+CHR$(0) CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\roue.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_roue& INPUT #1;hauteur_roue& INPUT #1;taille_image% roue%=@prendre(taille_image%,TRUE,3) BGET #1,roue%,taille_image% CLOSE #1 ' CHAR{mem_nom%}="deg_gris.ecr"+CHR$(0) CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\deg_gris.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_deg_gris& INPUT #1;hauteur_deg_gris& INPUT #1;taille_image% deg_gris%=@prendre(taille_image%,TRUE,3) BGET #1,deg_gris%,taille_image% CLOSE #1 ' CHAR{mem_nom%}="degigris.ecr"+CHR$(0) CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\degigris.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_degigris& INPUT #1;hauteur_degigris& INPUT #1;taille_image% degigris%=@prendre(taille_image%,TRUE,3) BGET #1,degigris%,taille_image% CLOSE #1 ' CHAR{mem_nom%}="deg_roug.ecr"+CHR$(0) CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\deg_roug.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_deg_roug& INPUT #1;hauteur_deg_roug& INPUT #1;taille_image% deg_roug%=@prendre(taille_image%,TRUE,3) BGET #1,deg_roug%,taille_image% CLOSE #1 ' CHAR{mem_nom%}="deg_vert.ecr"+CHR$(0) CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\deg_vert.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_deg_vert& INPUT #1;hauteur_deg_vert& INPUT #1;taille_image% deg_vert%=@prendre(taille_image%,TRUE,3) BGET #1,deg_vert%,taille_image% CLOSE #1 ' CHAR{mem_nom%}="deg_bleu.ecr"+CHR$(0) CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\deg_bleu.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_deg_bleu& INPUT #1;hauteur_deg_bleu& INPUT #1;taille_image% deg_bleu%=@prendre(taille_image%,TRUE,3) BGET #1,deg_bleu%,taille_image% CLOSE #1 ' ELSE CHAR{mem_nom%}="presente.ecr"+CHR$(0) chemin_et_nom_image_ecran IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_presente& INPUT #1;hauteur_presente& INPUT #1;taille_image% presente%=@prendre(taille_image%,TRUE,3) BGET #1,presente%,taille_image% CLOSE #1 ELSE CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\presente.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_presente& INPUT #1;hauteur_presente& INPUT #1;taille_image% presente%=@prendre(taille_image%,TRUE,3) BGET #1,presente%,taille_image% CLOSE #1 ' ENDIF ' CHAR{mem_nom%}="auteur.ecr"+CHR$(0) chemin_et_nom_image_ecran IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_auteur& INPUT #1;hauteur_auteur& INPUT #1;taille_image% auteur%=@prendre(taille_image%,TRUE,3) BGET #1,auteur%,taille_image% CLOSE #1 ELSE CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\auteur.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_auteur& INPUT #1;hauteur_auteur& INPUT #1;taille_image% auteur%=@prendre(taille_image%,TRUE,3) BGET #1,auteur%,taille_image% CLOSE #1 ' ENDIF ' CHAR{mem_nom%}="fond.ecr"+CHR$(0) chemin_et_nom_image_ecran IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_image& INPUT #1;hauteur_image& INPUT #1;taille_image% adr_image%=@prendre(taille_image%,TRUE,3) BGET #1,adr_image%,taille_image% CLOSE #1 ' @coloriage_du_fond(adr_image%,0,0,largeur_image&,hauteur_image&) ' libere(*adr_image%) ELSE CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\fond\fond.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_image& INPUT #1;hauteur_image& INPUT #1;taille_image% adr_image%=@prendre(taille_image%,TRUE,3) BGET #1,adr_image%,taille_image% CLOSE #1 ' @coloriage_du_fond(adr_image%,0,0,largeur_image&,hauteur_image&) ' libere(*adr_image%) ENDIF ' CHAR{mem_nom%}="roue.ecr"+CHR$(0) chemin_et_nom_image_ecran IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_roue& INPUT #1;hauteur_roue& INPUT #1;taille_image% roue%=@prendre(taille_image%,TRUE,3) BGET #1,roue%,taille_image% CLOSE #1 ' ELSE CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\roue.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_roue& INPUT #1;hauteur_roue& INPUT #1;taille_image% roue%=@prendre(taille_image%,TRUE,3) BGET #1,roue%,taille_image% CLOSE #1 ' ENDIF ' CHAR{mem_nom%}="deg_gris.ecr"+CHR$(0) chemin_et_nom_image_ecran IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_deg_gris& INPUT #1;hauteur_deg_gris& INPUT #1;taille_image% deg_gris%=@prendre(taille_image%,TRUE,3) BGET #1,deg_gris%,taille_image% CLOSE #1 ' ELSE CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\deg_gris.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_deg_gris& INPUT #1;hauteur_deg_gris& INPUT #1;taille_image% deg_gris%=@prendre(taille_image%,TRUE,3) BGET #1,deg_gris%,taille_image% CLOSE #1 ' ENDIF ' CHAR{mem_nom%}="degigris.ecr"+CHR$(0) chemin_et_nom_image_ecran IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_degigris& INPUT #1;hauteur_degigris& INPUT #1;taille_image% degigris%=@prendre(taille_image%,TRUE,3) BGET #1,degigris%,taille_image% CLOSE #1 ' ELSE CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\degigris.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_degigris& INPUT #1;hauteur_degigris& INPUT #1;taille_image% degigris%=@prendre(taille_image%,TRUE,3) BGET #1,degigris%,taille_image% CLOSE #1 ' ENDIF ' CHAR{mem_nom%}="deg_roug.ecr"+CHR$(0) chemin_et_nom_image_ecran IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_deg_roug& INPUT #1;hauteur_deg_roug& INPUT #1;taille_image% deg_roug%=@prendre(taille_image%,TRUE,3) BGET #1,deg_roug%,taille_image% CLOSE #1 ' ELSE CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\deg_roug.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_deg_roug& INPUT #1;hauteur_deg_roug& INPUT #1;taille_image% deg_roug%=@prendre(taille_image%,TRUE,3) BGET #1,deg_roug%,taille_image% CLOSE #1 ' ENDIF ' CHAR{mem_nom%}="deg_vert.ecr"+CHR$(0) chemin_et_nom_image_ecran IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_deg_vert& INPUT #1;hauteur_deg_vert& INPUT #1;taille_image% deg_vert%=@prendre(taille_image%,TRUE,3) BGET #1,deg_vert%,taille_image% CLOSE #1 ' ELSE CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\deg_vert.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_deg_vert& INPUT #1;hauteur_deg_vert& INPUT #1;taille_image% deg_vert%=@prendre(taille_image%,TRUE,3) BGET #1,deg_vert%,taille_image% CLOSE #1 ' ENDIF ' CHAR{mem_nom%}="deg_bleu.ecr"+CHR$(0) chemin_et_nom_image_ecran IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_deg_bleu& INPUT #1;hauteur_deg_bleu& INPUT #1;taille_image% deg_bleu%=@prendre(taille_image%,TRUE,3) BGET #1,deg_bleu%,taille_image% CLOSE #1 ' ELSE CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"sys\intro\deg_bleu.tga"+CHR$(0) charger_afficher_tga2 ' chemin_et_nom_image_ecran OPEN "i",#1,CHAR{mem_che%} INPUT #1;largeur_deg_bleu& INPUT #1;hauteur_deg_bleu& INPUT #1;taille_image% deg_bleu%=@prendre(taille_image%,TRUE,3) BGET #1,deg_bleu%,taille_image% CLOSE #1 ' ENDIF ENDIF ' RETURN ' > PROCEDURE chemin_et_nom_image_ecran $S&,$S> SELECT plan_systeme& CASE 1 CHAR{mem_che%}=CHAR{eb_temp%}+"\screens\1_plan\"+CHR$(0) CASE 2 CHAR{mem_che%}=CHAR{eb_temp%}+"\screens\2_plans\"+CHR$(0) CASE 4 IF mode_entrelace! CHAR{mem_che%}=CHAR{eb_temp%}+"\screens\4_plansc\"+CHR$(0) ELSE CHAR{mem_che%}=CHAR{eb_temp%}+"\screens\4_plans\"+CHR$(0) ENDIF CASE 8 IF mode_entrelace! CHAR{mem_che%}=CHAR{eb_temp%}+"\screens\8_plansc\"+CHR$(0) ELSE CHAR{mem_che%}=CHAR{eb_temp%}+"\screens\8_plans\"+CHR$(0) ENDIF CASE 15 CHAR{mem_che%}=CHAR{eb_temp%}+"\screens\15_plans\"+CHR$(0) CASE 16 CHAR{mem_che%}=CHAR{eb_temp%}+"\screens\16_plans\"+CHR$(0) CASE 24 CHAR{mem_che%}=CHAR{eb_temp%}+"\screens\24_plans\"+CHR$(0) CASE 32 CHAR{mem_che%}=CHAR{eb_temp%}+"\screens\32_plans\"+CHR$(0) DEFAULT CHAR{mem_che%}=CHAR{eb_temp%}+"\screens\24_plans\"+CHR$(0) ENDSELECT ' CHAR{mem_che%}=CHAR{mem_che%}+CHAR{mem_nom%}+CHR$(0) ' RETURN > PROCEDURE charger_afficher_tga2 LOCAL longueur_info|,largeur_image&,hauteur_image&,plan_image| LOCAL pre_vide|,pre_vide&,taille% LOCAL ef&,x&,y&,w&,h&,adr_img% LOCAL taille_ecr%,image_ecr% ' IF @s_exist(mem_che%) ' OPEN "i",#1,CHAR{mem_che%} BGET #1,V:longueur_info|,1 ! Longueur de l'entˆte BGET #1,V:pre_vide|,1 ! Type de palette BGET #1,V:pre_vide|,1 ! Type de l'image IF pre_vide|=2 BGET #1,V:pre_vide&,2 ! Origine de la palette BGET #1,V:pre_vide&,2 ! Longueur de la palette BGET #1,V:pre_vide|,1 ! Type de palette BGET #1,V:pre_vide&,2 ! Origine de l'image en X BGET #1,V:pre_vide&,2 ! Origine de l'image en Y BGET #1,V:pre_vide&,2 ! Largeur de l'image en pixel largeur_image&=ROR&(pre_vide&,8) BGET #1,V:pre_vide&,2 ! Hauteur de l'image en pixel hauteur_image&=ROR&(pre_vide&,8) BGET #1,V:plan_image|,1 ! Nombre de plans de l'image IF plan_image|=24 BGET #1,V:pre_vide|,1 ! Informations suppl‚mentaire taille%=MUL(MUL(largeur_image&,hauteur_image&),3) adr_img%=@prendre(taille%,TRUE,3) IF longueur_info|<>0 BGET #1,adr_img%,longueur_info| ENDIF BGET #1,adr_img%,taille% CLOSE #1 x&=SUB(SHR(xmax&,1),SHR(largeur_image&,1)) y&=SUB(SHR(ymax&,1),SHR(hauteur_image&,1)) w&=largeur_image& h&=hauteur_image& ' ef&=@wind_create(0,x&,y&,w&,h&) wind_open(ef&,x&,y&,w&,h&) ' conversion_image_ecran(adr_img%,largeur_image&,hauteur_image&,x&,y&,w&,h&) ' libere(*adr_img%) garbage_collector ' taille_ecr%=MUL(MUL(SHR(largeur_image&,3),hauteur_image&),plan_systeme&) image_ecr%=@prendre(taille_ecr%,TRUE,3) copie_ecran_vers_memoire(image_ecr%,x&,y&,w&,h&) ' chemin_et_nom_image_ecran OPEN "o",#1,CHAR{mem_che%} PRINT #1;largeur_image& PRINT #1;hauteur_image& PRINT #1;taille_ecr% BPUT #1,image_ecr%,taille_ecr% CLOSE #1 ' libere(*image_ecr%) ' wind_close(ef&) wind_delete(ef&) ' garbage_collector ' ELSE CLOSE #1 ENDIF ELSE CLOSE #1 ENDIF ELSE CLOSE #1 ENDIF RETURN > PROCEDURE conversion_image_ecran(image%,largeur&,hauteur&,px&,py&,pw&,ph&) LOCAL pre_xx&,pre_yy& LOCAL pre_ro&,pre_ve&,pre_bl& LOCAL ava_ro&,ava_ve&,ava_bl& LOCAL pre_cou1&,pre_cou2&,pre_tra1%,pre_tra2%,pre_tra3% ' ava_ro&=-1 ava_ve&=-1 ava_bl&=-1 set_fill_perimeter_visibility(0) set_writing_mode(mode_remplace|) buff%=image% pre_yy&=SUB(hauteur&,1) graf_mouse(m_off&,0) DO yp&=ADD(py&,pre_yy&) pre_xx&=0 DO xp&=ADD(px&,pre_xx&) ' pre_bl&=BYTE{buff%} pre_ve&=BYTE{SUCC(buff%)} pre_ro&=BYTE{ADD(buff%,2)} $S&,$S> SELECT plan_systeme& CASE 1,2 IF ava_ro&<>pre_ro& OR ava_ve&<>pre_ve& OR ava_bl&<>pre_bl& pre_cou1&=(pre_ro&*0.3)+(pre_ve&*0.59)+(pre_bl&*0.11) pre_cou1&=SUB(255,pre_cou1&) pre_tra1%=ADD(trame%,SHL(pre_cou1&,5)) ENDIF ' set_writing_mode(mode_remplace|) set_remplissage(4,1,noir&,pre_tra1%) ! Tramage de luminosit‚ CASE 4,8 IF ava_ro&<>pre_ro& OR ava_ve&<>pre_ve& OR ava_bl&<>pre_bl& couleur_et_trame(pre_ro&,pre_ve&,pre_bl&,pre_cou1&,pre_cou2&,pre_tra1%,pre_tra2%,pre_tra3%) ENDIF ' set_writing_mode(mode_remplace|) set_remplissage(4,1,noir&,pre_tra1%) ! Fond noir/blanc vdi_11(1,xp&,yp&,xp&,yp&,0,0,0,0) set_writing_mode(mode_transparent|) set_remplissage(4,1,pre_cou1&,pre_tra2%) ! Couleur principale vdi_11(1,xp&,yp&,xp&,yp&,0,0,0,0) set_remplissage(4,1,pre_cou2&,pre_tra3%) ! Couleur secondaire DEFAULT pre_ro&=pre_ro&*3.9216 pre_ve&=pre_ve&*3.9216 pre_bl&=pre_bl&*3.9216 IF ava_ro&<>pre_ro& OR ava_ve&<>pre_ve& OR ava_bl&<>pre_bl& set_color_representation(254,pre_ro&,pre_ve&,pre_bl&,vdihandle%) set_fill_interior_style(2) set_fill_style_index(8) set_fill_color_index(254) ENDIF ENDSELECT vdi_11(1,xp&,yp&,xp&,yp&,0,0,0,0) IF ava_ro&<>pre_ro& OR ava_ve&<>pre_ve& OR ava_bl&<>pre_bl& ava_ro&=pre_ro& ava_ve&=pre_ve& ava_bl&=pre_bl& ENDIF ' ADD buff%,3 INC pre_xx& LOOP WHILE pre_xx&-1 set_writing_mode(mode_remplace|) graf_mouse(m_on&,0) ' RETURN ' > PROCEDURE copie_ecran_vers_memoire(image_ecr%,ex&,ey&,ew&,eh&) LOCAL d%,dl&,dh&,dp&,x11&,y11&,x21&,y21& ' ************************* D‚finition du raster source ' C'est l'‚cran le GEM s'occupe de tout ' ************************* D‚finition du raster destination d%=image_ecr% ! L'adresse de l'image de l'‚cran dl&=ew& ! Sa largeur dh&=eh& ! Sa hauteur dp&=plan_systeme& ! Son nombre de plans (comme l'‚cran) ' ************************* Definition de la partie … d‚placer x11&=ex& ! Position X source y11&=ey& ! Position Y source x21&=0 ! Position X destination y21&=0 ! Position Y destination clip_raster(0,0,0,0,d%,dl&,dh&,dp&,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) RETURN > PROCEDURE coloriage_du_fond(adr_image%,sourx&,soury&,sourw&,sourh&) LOCAL xclip&,yclip&,wclip&,hclip& LOCAL axclip&,ayclip&,awclip&,ahclip& LOCAL ex&,ey&,ew&,eh& LOCAL s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x11&,y11&,x21&,y21& ' CLR xclip&,yclip&,ex&,ey& wclip&=SUCC(xmax&) hclip&=SUCC(ymax&) ' ************************* D‚finition du raster source s%=adr_image% ! L'‚cran, c'est le GEM qui s'occupe de tout sl&=sourw& ! Largeur sh&=sourh& ! Hauteur sp&=plan_systeme& ! Nombre de plans ' ************************* D‚finition du raster destination d%=fond% ! L'image de fond (marbre ou autre) dl&=largeur_fond% ! Largeur dh&=hauteur_fond% ! Hauteur dp&=plan_systeme& ! Nombre de plans ' ************************* Definition de la partie … d‚placer x11&=sourx& ! Position X source y11&=soury& ! Position Y source IF wclip&<=sourw& AND hclip&<=sourh& ex&=xclip& ey&=yclip& ew&=wclip& eh&=hclip& x21&=ex& ! Position X destination y21&=ey& ! Position Y destination clip_raster(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) ELSE IF wclip&<=ADD(sourw&,2) awclip&=SUB(wclip&,2) ELSE awclip&=sourw& ENDIF axclip&=SUCC(xclip&) DO IF hclip&<=ADD(sourh&,2) ahclip&=SUB(hclip&,2) ELSE ahclip&=sourh& ENDIF ayclip&=SUCC(yclip&) DO ex&=axclip& ey&=ayclip& ew&=awclip& eh&=ahclip& x21&=ex& ! Position X destination y21&=ey& ! Position Y destination clip_raster(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,3) ADD ayclip&,ahclip& IF ADD(ayclip&,ahclip&)>ADD(yclip&,hclip&) ahclip&=SUB(PRED(ADD(yclip&,hclip&)),ayclip&) ENDIF EXIT IF ayclip&=>SUB(ADD(yclip&,hclip&),2) OR ahclip&=0 LOOP ADD axclip&,awclip& IF ADD(axclip&,awclip&)>ADD(xclip&,wclip&) awclip&=SUB(PRED(ADD(xclip&,wclip&)),axclip&) ENDIF EXIT IF axclip&=>SUB(ADD(xclip&,wclip&),2) OR awclip&=0 LOOP ENDIF RETURN ' ********************** Fonctions diverses et vari‚es ************************* > FUNCTION adresse_objet(nu&) RETURN ADD(univers%,MUL(nu&,taille_objet&)) ENDFUNC > FUNCTION adresse_point(nu&) RETURN {ADD(objet%,SHL(nu&,2))} ENDFUNC > FUNCTION adresse_edge(nu&) RETURN {ADD(edge%,SHL(nu&,2))} ENDFUNC > FUNCTION adresse_face(adrob%) RETURN ADD(ADD(adrob%,2),MUL(SUCC(CARD{adrob%}),12)) ENDFUNC > FUNCTION adresse_texture(nu&) RETURN ADD(texture%,MUL(nu&,taille_texture&)) ENDFUNC > FUNCTION adresse_pigment(nu&) RETURN ADD(pigment%,MUL(nu&,taille_pigment&)) ENDFUNC > FUNCTION adresse_normal(nu&) RETURN ADD(normal%,MUL(nu&,taille_normal&)) ENDFUNC > FUNCTION adresse_finish(nu&) RETURN ADD(finish%,MUL(nu&,taille_finish&)) ENDFUNC > FUNCTION adresse_interior(nu&) RETURN ADD(interior%,MUL(nu&,taille_interior&)) ENDFUNC > FUNCTION adresse_liaison(nu&) RETURN ADD(liaison%,MUL(nu&,50)) ENDFUNC > FUNCTION adresse_point_control(nu%) RETURN {ADD(pt_control%,SHL(nu%,2))} ENDFUNC > FUNCTION adresse_point_extrude(nu%) RETURN {ADD(courbe_extrude%,SHL(nu%,2))} ENDFUNC > FUNCTION adresse_liste_csg(nu%) RETURN {ADD(liste_csg%,SHL(nu%,2))} ENDFUNC > FUNCTION adresse_source(nu&) RETURN ADD(source%,MUL(nu&,taille_source&)) ENDFUNC > FUNCTION afficher_alerte(message_d_alerte%) RETURN @form_alert(1,message_d_alerte%) ENDFUNC > FUNCTION nom_objet$(num&,ind!) LOCAL choix&,height!,obface!,csg&,bezier!,ouvert! LOCAL quarti!,quadri!,uni%,flag0|,flag1|,uni2%,smo! CLR csg& IF ind! uni%=@adresse_objet(objet_actif&) choix&=num& ELSE uni%=@adresse_objet(num&) choix&=INT{uni%} ENDIF csg&=INT{ADD(uni%,offset_csg_type&)} flag0|=BYTE{ADD(uni%,offset_drapeau0&)} flag1|=BYTE{ADD(uni%,offset_drapeau1&)} ouvert!=BTST(flag0|,bit_ouvert|) bezier!=BTST(flag0|,bit_bicubic|) height!=BTST(flag0|,bit_montagne|) obface!=BTST(flag0|,bit_facette|) quadri!=BTST(flag1|,bit_quadric|) quarti!=BTST(flag1|,bit_quartic|) smo!=BTST(flag1|,bit_smooth|) IF (bezier!+height!+obface!+quarti!+quadri!)=0 ' Quand on sait pas, on force en objet facette obface!=TRUE ENDIF ob_state(adr_modifier%,modpx&,aes_disable&,FALSE) ob_state(adr_modifier%,modpy&,aes_disable&,FALSE) ob_state(adr_modifier%,modpz&,aes_disable&,FALSE) ob_state(adr_modifier%,modtx&,aes_disable&,FALSE) ob_state(adr_modifier%,modty&,aes_disable&,FALSE) ob_state(adr_modifier%,modtz&,aes_disable&,FALSE) ob_state(adr_modifier%,modrx&,aes_disable&,FALSE) ob_state(adr_modifier%,modry&,aes_disable&,FALSE) ob_state(adr_modifier%,modrz&,aes_disable&,FALSE) ob_state(adr_modifier%,modbez&,aes_disable&,TRUE) ob_state(adr_modifier%,modcsg&,aes_disable&,TRUE) ob_state(adr_modifier%,modquart&,aes_disable&,TRUE) ob_state(adr_modifier%,modquadr&,aes_disable&,TRUE) ob_state(adr_modifier%,ouvert&,aes_disable&,TRUE) ob_state(adr_modifier%,ouvert&,aes_selected&,FALSE) ob_state(adr_modifier%,rapptext&,aes_disable&,TRUE) ob_state(adr_modifier%,rappcone&,aes_disable&,TRUE) ob_flags(adr_modifier%,modpx&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modpy&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modpz&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modtx&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modty&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modtz&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modrx&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modry&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modrz&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modtaide&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modforbl&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modthrbl&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,souediri&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modtora1&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modtora2&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,sousplus&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,facinout&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,SUB(encones&,3),aes_hidetree&,TRUE) ob_flags(adr_modifier%,SUB(ensmooth&,3),aes_hidetree&,TRUE) IF INT{ADD(uni%,offset_relation_csg&)}<>-1 uni2%=@adresse_objet(INT{ADD(uni%,offset_relation_csg&)}) IF INT{ADD(uni2%,offset_csg_type&)}=-5 ob_flags(adr_modifier%,sousplus&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modforbl&,aes_hidetree&,FALSE) ENDIF ENDIF $S|,S> SELECT choix& CASE 0 ob_state(adr_modifier%,modty&,aes_disable&,TRUE) ob_state(adr_modifier%,modtz&,aes_disable&,TRUE) ob_flags(adr_modifier%,modtaide&,aes_hidetree&,TRUE) RETURN "SEGMENT" CASE 1 ob_state(adr_modifier%,rapptext&,aes_disable&,FALSE) ob_state(adr_modifier%,rappcone&,aes_disable&,FALSE) CHAR{{OB_SPEC(adr_modifier%,rappcone&)}}=STR$(BYTE{ADD(uni%,offset_rapport&)},3) IF BYTE{ADD(uni%,offset_rapport&)}=0 RETURN "PYRAMIDE" ELSE IF BYTE{ADD(uni%,offset_rapport&)}=100 RETURN "BOITE" ELSE RETURN "TRONC_PYRAMI" ENDIF CASE 2 RETURN "SPHERE" CASE 3 RETURN "PRISME" CASE 4 ob_flags(adr_modifier%,modpx&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modpy&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modpz&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modtx&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modty&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modtz&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modrx&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modry&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,modrz&,aes_hidetree&,TRUE) ob_flags(adr_modifier%,souediri&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modtaide&,aes_hidetree&,TRUE) RETURN "TRIANGLE" CASE 5 ob_state(adr_modifier%,ouvert&,aes_disable&,FALSE) ob_state(adr_modifier%,rapptext&,aes_disable&,FALSE) ob_state(adr_modifier%,rappcone&,aes_disable&,FALSE) ob_state(adr_modifier%,ouvert&,aes_selected&,ouvert!) CHAR{{OB_SPEC(adr_modifier%,rappcone&)}}=STR$(BYTE{ADD(uni%,offset_rapport&)},3) RETURN "TRONC_D_CONE" CASE 6 RETURN "HEMISPHERE" CASE 7 ob_state(adr_modifier%,rapptext&,aes_disable&,FALSE) ob_state(adr_modifier%,rappcone&,aes_disable&,FALSE) CHAR{{OB_SPEC(adr_modifier%,rappcone&)}}=STR$(BYTE{ADD(uni%,offset_rapport&)},3) RETURN "BOITE_RONDE" CASE 8 ob_state(adr_modifier%,modty&,aes_disable&,TRUE) ob_state(adr_modifier%,rapptext&,aes_disable&,FALSE) ob_state(adr_modifier%,rappcone&,aes_disable&,FALSE) CHAR{{OB_SPEC(adr_modifier%,rappcone&)}}=STR$(BYTE{ADD(uni%,offset_rapport&)},3) RETURN "DISQUE" CASE 9 RETURN "TEXTE" CASE 10 RETURN "COLONNE" CASE 11 ob_state(adr_modifier%,modtx&,aes_disable&,TRUE) ob_state(adr_modifier%,modty&,aes_disable&,TRUE) ob_state(adr_modifier%,modtz&,aes_disable&,TRUE) RETURN "PLAN" CASE 12 ob_flags(adr_modifier%,sousplus&,aes_hidetree&,FALSE) ob_state(adr_modifier%,rapptext&,aes_disable&,FALSE) ob_state(adr_modifier%,rappcone&,aes_disable&,FALSE) ob_flags(adr_modifier%,modtora1&,aes_hidetree&,FALSE) ob_flags(adr_modifier%,modtora2&,aes_hidetree&,FALSE) CHAR{{OB_SPEC(adr_modifier%,rappcone&)}}=STR$(BYTE{ADD(uni%,offset_rapport&)},3) CHAR{{OB_SPEC(adr_modifier%,modtora1&)}}=STR$(INT{ADD(uni%,offset_force_blob&)},4) CHAR{{OB_SPEC(adr_modifier%,modtora2&)}}=STR$(INT{ADD(uni%,ADD(offset_force_blob&,2))},4) RETURN "TOR" DEFAULT IF bezier! ob_state(adr_modifier%,modbez&,aes_disable&,FALSE) ob_flags(adr_modifier%,facinout&,aes_hidetree&,FALSE) RETURN "FORME_BEZIER" ELSE IF height! ob_flags(adr_modifier%,facinout&,aes_hidetree&,FALSE) RETURN "MONTAGNE" ELSE IF csg&<0 SELECT csg& CASE -5 ob_flags(adr_modifier%,sousplus&,aes_hidetree&,FALSE) ob_state(adr_modifier%,modcsg&,aes_disable&,FALSE) ob_flags(adr_modifier%,modthrbl&,aes_hidetree&,FALSE) RETURN "BLOB" CASE -4 ob_state(adr_modifier%,modcsg&,aes_disable&,FALSE) RETURN "MERGE" CASE -3 ob_state(adr_modifier%,modcsg&,aes_disable&,FALSE) RETURN "DIFFERENCE" CASE -2 ob_state(adr_modifier%,modcsg&,aes_disable&,FALSE) RETURN "INTERSECTION" CASE -1 ob_state(adr_modifier%,modcsg&,aes_disable&,FALSE) RETURN "UNION" ENDSELECT ELSE IF quadri! ob_state(adr_modifier%,modquadr&,aes_disable&,FALSE) ob_flags(adr_modifier%,facinout&,aes_hidetree&,FALSE) RETURN "QUADRIC" ELSE IF quarti! ob_state(adr_modifier%,modquart&,aes_disable&,FALSE) ob_flags(adr_modifier%,facinout&,aes_hidetree&,FALSE) RETURN "QUARTIC" ELSE IF obface! IF BTST(flag1|,bit_lathe|) IF eb_tours! ob_flags(adr_modifier%,SUB(encones&,3),aes_hidetree&,FALSE) ENDIF ob_state(adr_modifier%,ouvert&,aes_disable&,FALSE) ob_state(adr_modifier%,ouvert&,aes_selected&,ouvert!) ob_flags(adr_modifier%,facinout&,aes_hidetree&,FALSE) RETURN "LATHE_POV3" ELSE IF BTST(flag1|,bit_sor|) IF eb_tours! ob_flags(adr_modifier%,SUB(encones&,3),aes_hidetree&,FALSE) ENDIF ob_state(adr_modifier%,ouvert&,aes_disable&,FALSE) ob_state(adr_modifier%,ouvert&,aes_selected&,ouvert!) ob_flags(adr_modifier%,facinout&,aes_hidetree&,FALSE) RETURN "SOR_POV3" ELSE IF BTST(flag1|,bit_prisme|) IF eb_tours! ob_flags(adr_modifier%,SUB(encones&,3),aes_hidetree&,FALSE) ENDIF ob_state(adr_modifier%,ouvert&,aes_disable&,FALSE) ob_state(adr_modifier%,ouvert&,aes_selected&,ouvert!) ob_flags(adr_modifier%,facinout&,aes_hidetree&,FALSE) RETURN "PRISM_POV3" ELSE ob_flags(adr_modifier%,SUB(ensmooth&,3),aes_hidetree&,FALSE) ob_state(adr_modifier%,ensmooth&,aes_selected&,smo!) ob_flags(adr_modifier%,facinout&,aes_hidetree&,FALSE) RETURN "OBJ_FACETTES" ENDIF ENDIF ENDSELECT ENDFUNC > FUNCTION fenetre_deja_ouverte(nn&) LOCAL ttop&,dm& ' V‚rifier si la fenˆtre concern‚e par l'ic“ne cliqu‚e n'est pas d‚j… ouverte ' et si c'est le cas, v‚rifier si elle n'est pas derriŠre une autre fenˆtre ' dans ce cas, c'est TRUE qui sera renvoy‚ et la fenˆtre sera remis en TOP, ' sinon, soit on ouvre la fenˆtre, soit on ne fait rien puisqu'elle est d‚j… ' au TOP sur l'‚cran. Merci … LOUVET Fabrice pour avoir lev‚ un vice cach‚ ' … cet endroit. $S&,$S> SELECT nn& CASE iinfo& IF INT{ADD(hwind%,idx_info_dbl&)}>-1 ~@wind_get(0,wf_top&,ttop&,dm&,dm&,dm&) IF @numero_fenetre(ttop&)=idx_info& RETURN FALSE ENDIF ENDIF CASE itrait&,iboite&,isphere&,iprisme&,ifcone&,itroncon&,idemisph&,itube&,idisque&,ipyramid&,icolonne&,iplan&,itor&,imodif& IF INT{ADD(hwind%,idx_modification_dbl&)}>-1 ~@wind_get(0,wf_top&,ttop&,dm&,dm&,dm&) IF @numero_fenetre(ttop&)=idx_modification& RETURN FALSE ENDIF ENDIF ' CASE ispov& ! Boite Nø5 ' IF INT{ADD(hwind%,10)}>-1 ' ~@wind_get(0,wf_top&,ttop&,dm&,dm&,dm&) ' IF @numero_fenetre(ttop&)=5 ! Si la boŒte est au TOP ' RETURN FALSE ' ENDIF ' ENDIF CASE ilampe& IF INT{ADD(hwind%,idx_lumieres_dbl&)}>-1 ~@wind_get(0,wf_top&,ttop&,dm&,dm&,dm&) IF @numero_fenetre(ttop&)=idx_lumieres& RETURN FALSE ENDIF ENDIF CASE itaille&,icsg& IF INT{ADD(hwind%,idx_fonctions_dbl&)}>-1 ~@wind_get(0,wf_top&,ttop&,dm&,dm&,dm&) IF @numero_fenetre(ttop&)=idx_fonctions& RETURN FALSE ENDIF ENDIF CASE istat& IF INT{ADD(hwind%,idx_statistiques_dbl&)}>-1 ~@wind_get(0,wf_top&,ttop&,dm&,dm&,dm&) IF @numero_fenetre(ttop&)=idx_statistiques& RETURN FALSE ENDIF ENDIF CASE icamera& IF INT{ADD(hwind%,idx_camera_dbl&)}>-1 ~@wind_get(0,wf_top&,ttop&,dm&,dm&,dm&) IF @numero_fenetre(ttop&)=idx_camera& RETURN FALSE ENDIF ENDIF CASE icarreau& IF INT{ADD(hwind%,idx_bicubic_dbl&)}>-1 ~@wind_get(0,wf_top&,ttop&,dm&,dm&,dm&) IF @numero_fenetre(ttop&)=idx_bicubic& RETURN FALSE ENDIF ENDIF ENDSELECT RETURN TRUE ENDFUNC > FUNCTION arbre_ressource(n&) ' $S&,S> SELECT n& CASE idx_info& RETURN adr_info% CASE idx_outils& RETURN adr_outils% CASE idx_vue_subjective& RETURN adr_vue_subjective% CASE idx_modification& RETURN adr_modifier% CASE idx_couleurs& RETURN adr_predefinie% CASE 5 RETURN adr_desk% ! Inutilis‚e CASE idx_lumieres& RETURN adr_lumieres% CASE idx_aide& RETURN adr_aide% CASE idx_fonctions& RETURN adr_fonctions% CASE idx_calques& RETURN adr_calques% CASE idx_statistiques& RETURN adr_stat% CASE idx_merci& RETURN adr_merci% CASE idx_camera& RETURN adr_camera% CASE idx_lanceur& RETURN adr_lanceur% CASE 14 RETURN adr_desk% ! Inutilis‚e CASE idx_parametrage& RETURN adr_parametres% CASE 16 RETURN adr_desk% ! Inutilis‚e CASE idx_bicubic& RETURN adr_bicubics% CASE idx_auteur& RETURN adr_auteur% CASE idx_vue_fine& RETURN adr_vue_fine% CASE idx_temps_passe& RETURN adr_temps_passe% CASE 21 RETURN adr_desk% ! Inutilis‚e CASE 22 RETURN adr_desk% ! Inutilis‚e CASE 23 RETURN adr_desk% ! Inutilis‚e CASE idx_vue& RETURN adr_fenetre% CASE idx_calage& RETURN adr_calage% CASE idx_info_objet& RETURN adr_info_objet% CASE idx_quartic& RETURN adr_quartic% CASE idx_quadric& RETURN adr_quadric% CASE idx_bibliotheque& RETURN adr_bibliotheque% CASE idx_hierarchie& RETURN adr_hierarchie% CASE idx_animation& RETURN adr_animation% DEFAULT RETURN adr_desk% ENDSELECT ENDFUNC > FUNCTION numero_fenetre(n&) LOCAL z& CLR z& DO IF INT{ADD(hwind%,SHL(z&,1))}=n& RETURN z& ENDIF INC z& LOOP WHILE z&<32 RETURN -1 ENDFUNC > FUNCTION chercher_dans_plusieurs LOCAL pl%,fin_pl%,po& CLR po& pl%=ADD(plusieurs%,2) fin_pl%=CARD{plusieurs%} DO IF objet_actif&=CARD{pl%} RETURN po& ENDIF INC po& ADD pl%,2 LOOP WHILE pl% FUNCTION source_active LOCAL adr_sr%,fin_s% fin_s%=@adresse_source(nombre_de_source&) adr_sr%=source% DO IF BYTE{adr_sr%}=1 RETURN TRUE ENDIF ADD adr_sr%,taille_source& LOOP WHILE adr_sr% FUNCTION enleve_caractere(l%,car|) LOCAL pos%,lon% IF l%<>0 pos%=PRED(LEN(CHAR{l%})) DO EXIT IF BYTE{ADD(l%,pos%)}<>car| BYTE{ADD(l%,pos%)}=0 DEC pos% LOOP lon%=LEN(CHAR{l%}) DO EXIT IF BYTE{l%}<>car| BMOVE SUCC(l%),l%,PRED(lon%) BYTE{ADD(l%,PRED(lon%))}=0 DEC lon% LOOP ENDIF RETURN l% ENDFUNC > FUNCTION lower(l%) LOCAL i&,l| IF LEN(CHAR{l%}) CLR i& DO l|=BYTE{ADD(l%,i&)} IF l|=>65 AND l|<=90 ADD l|,32 BYTE{ADD(l%,i&)}=l| ENDIF INC i& LOOP WHILE i& FUNCTION calcul_correction IF trois_vue! ! Si mode multi-vues IF (dif_fx&=0 AND dif_fy&=0) ! Si tout est centr‚ RETURN TRUE ! OUI on calcul ENDIF ! IF dessin_3d|=vue_en_3d| ! Si c'est la vue 3D RETURN TRUE ! OUI on calcul ENDIF ! ELSE ! Si mode une fenˆtre RETURN TRUE ! OUI on calcul ENDIF ! RETURN FALSE ! Sinon on ne calcul pas ENDFUNC > FUNCTION recherche_couleur_predefinie(adr_col%) LOCAL i&,ro&,ve&,bl&,tr&,coul%,tai%,cc% ro&=BYTE{ADD(adr_col%,2)} ve&=BYTE{ADD(adr_col%,3)} bl&=BYTE{ADD(adr_col%,4)} tr&=BYTE{ADD(adr_col%,5)} OPEN "i",#1,CHAR{eb_temp%}+"\textures\eb_coule.ovl" tai%=LOF(#1) coul%=@prendre(tai%,TRUE,3) BGET #1,coul%,tai% CLOSE #1 cc%=ADD(coul%,taille_couleur&) i&=1 DO IF BYTE{cc%}=ro& ! Rouge identique IF BYTE{ADD(cc%,1)}=ve& ! Vert identique IF BYTE{ADD(cc%,2)}=bl& ! Bleu identique IF BYTE{ADD(cc%,3)}=tr& ! Transparence identique CARD{adr_col%}=i& ! OK, c'est la couleur recherch‚ libere(*coul%) RETURN TRUE ENDIF ENDIF ENDIF ENDIF ADD cc%,taille_couleur& INC i& LOOP WHILE i& FUNCTION dans_csg(num&) LOCAL t&,ch& CLR t& DO ch&=INT{ADD(effacement%,SHL(t&,1))} IF num&=ch& RETURN t& ENDIF INC t& LOOP WHILE t& FUNCTION nom_texture$(ad_t%,n&) IF LEN(TRIM$(LEFT$(CHAR{ADD(ad_t%,MUL(n&,22))}+SPACE$(20),20))) RETURN TRIM$(LEFT$(CHAR{ADD(ad_t%,MUL(n&,22))}+SPACE$(20),20)) ELSE $S%,$S> SELECT ad_t% CASE include_texture% RETURN "Texture_"+STR$(n&) CASE include_couleur% RETURN "Couleur_"+STR$(n&) CASE include_pigment% RETURN "Pigment_"+STR$(n&) CASE include_normal% RETURN "Normal_"+STR$(n&) CASE include_finish% RETURN "Finish_"+STR$(n&) CASE include_interior% RETURN "Interior_"+STR$(n&) CASE include_color_map% RETURN "Colo_Map_"+STR$(n&) CASE include_texture_map% RETURN "Text_Map_"+STR$(n&) CASE include_pigment_map% RETURN "Pigm_map_"+STR$(n&) CASE include_normal_map% RETURN "Norm_Map_"+STR$(n&) CASE include_warps% RETURN "Warps_N_"+STR$(n&) CASE include_projection% RETURN "Projection_"+STR$(n&) CASE include_atmosphere% RETURN "Atmos_"+STR$(n&) ENDSELECT ENDIF ENDFUNC ' > FUNCTION memoire_demandee(li&) LOCAL taille% taille%=MUL(li&,taille_objet&) ADD taille%,MUL(li&,taille_texture&) ADD taille%,MUL(li&,taille_pigment&) ADD taille%,MUL(li&,taille_normal&) ADD taille%,MUL(li&,taille_finish&) ADD taille%,taille_camera& ADD taille%,taille_atmosphere& ADD taille%,taille_texture& ADD taille%,taille_pigment& ADD taille%,taille_normal& ADD taille%,taille_finish& RETURN taille% ENDFUNC > FUNCTION maximum_d_objet_possible LOCAL tail%,taille%,l&,l% tail%=taille_objet& ADD tail%,taille_texture& ADD tail%,taille_pigment& ADD tail%,taille_normal& ADD tail%,taille_finish& taille%=taille_camera& ADD taille%,taille_atmosphere& ADD taille%,taille_texture& ADD taille%,taille_pigment& ADD taille%,taille_normal& ADD taille%,taille_finish& l%=DIV(SUB(MAX(@memoire_dispo(0),@memoire_dispo(1)),taille%),tail%) IF l%>32767 l&=32767 ELSE l&=l% ENDIF IF l&=>50 SUB l&,30 ENDIF RETURN l& ENDFUNC > PROCEDURE lire_une_alerte(b%) LOCAL lig%,f!,cpt& CLR cpt& lig%=b% DO BGET #1,lig%,1 INC cpt& f!=EOF(#1) IF (BYTE{lig%}=13 OR BYTE{lig%}=10) AND cpt&=1 BYTE{lig%}=0 CLR cpt& ENDIF EXIT IF (BYTE{lig%}=13) OR (BYTE{lig%}=10) OR (f!=TRUE) IF cpt&>0 INC lig% ENDIF LOOP RETURN > FUNCTION test_touche_morte(sg!,sd!,ct!,al!) ' Toutes les combinaison des quatres touches morte sont g‚r‚es ici. ' Dans l'ordre : Shift Gauche, Shift Droit, Control et Alternate IF BTST(BIOS(&HB,-1),cl_shift_gauche&)=sg! IF BTST(BIOS(&HB,-1),cl_shift_droit&)=sd! IF BTST(BIOS(&HB,-1),cl_control&)=ct! IF BTST(BIOS(&HB,-1),cl_alternate&)=al! RETURN TRUE ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC > FUNCTION nouvelle_zone_source(anc_tail%,nd!) LOCAL nou_lum%,tail_lum% LOCAL adr_sr%,fin_s% ' IF source%=0 DO tail_lum%=MUL(taille_source&,nombre_de_source&) IF tail_lum%0 vider_les_sources bmove(source%,mem_src%,taille_source&) CLR source_active& IF nd! recupere_les_sources ENDIF RETURN TRUE ENDIF ENDIF DEC nombre_de_source& LOOP WHILE nombre_de_source&>0 ELSE DO tail_lum%=MUL(taille_source&,nombre_de_source&) IF tail_lum%0 vider_les_sources IF anc_tail%<=tail_lum% bmove(source%,nou_lum%,anc_tail%) ELSE bmove(source%,nou_lum%,tail_lum%) ENDIF libere(*source%) source%=nou_lum% IF nd! recupere_les_sources ENDIF IF source_active&>PRED(nombre_de_source&) source_active&=PRED(nombre_de_source&) bmove(@adresse_source(source_active&),mem_src%,taille_source&) ELSE bmove(mem_src%,@adresse_source(source_active&),taille_source&) ENDIF RETURN TRUE ENDIF ENDIF DEC nombre_de_source& LOOP WHILE nombre_de_source&>0 ENDIF RETURN FALSE ENDFUNC > FUNCTION image_de_fond_presente $S|,$S> SELECT dessin_3d| CASE vue_de_face|,vue_de_dos| RETURN (image_flg_face! OR image_flg_dos!) CASE vue_de_droite|,vue_de_gauche| RETURN (image_flg_droite! OR image_flg_gauche!) CASE vue_de_dessus|,vue_de_dessous| RETURN (image_flg_dessus! OR image_flg_dessous!) ENDSELECT RETURN FALSE ENDFUNC > PROCEDURE minuscule(nn%) IF multitache! CHAR{nn%}=CHAR{@lower(nn%)}+CHR$(0) ELSE CHAR{nn%}=UPPER$(CHAR{nn%})+CHR$(0) ENDIF RETURN > FUNCTION change_image_de_fond(VAR origx&,origy&) LOCAL mode|,retour! ' origx&=mix& origy&=miy& $S|,S> SELECT dessin_3d| CASE vue_de_face| ADD origx&,deplacement_en_x& ADD origy&,deplacement_en_y& mode|=1 CASE vue_de_dos| SUB origx&,deplacement_en_x& ADD origy&,deplacement_en_y& mode|=2 CASE vue_de_droite| ADD origx&,deplacement_en_z& ADD origy&,deplacement_en_y& mode|=3 CASE vue_de_gauche| SUB origx&,deplacement_en_z& ADD origy&,deplacement_en_y& mode|=4 CASE vue_de_dessus| ADD origx&,deplacement_en_x& ADD origy&,deplacement_en_z& mode|=5 CASE vue_de_dessous| ADD origx&,deplacement_en_x& SUB origy&,deplacement_en_z& mode|=6 ENDSELECT IF image_fond|=mode| RETURN FALSE ENDIF ' RETURN TRUE ' ENDFUNC ' ************************ Le selecteur de fichiers GEM ************************ > PROCEDURE definition_fichier(adr_arb%,obj&,sel%,ind!,sel!,liin%) LOCAL obspec% ' pdomain(1) ' IF obj&=chelangu& AND adr_arb%=adr_parametres% CHAR{disque%}=CHAR{disque_systeme%} CHAR{path%}=CHAR{path_systeme%}+"sys\rsc\"+CHR$(0) minuscule(disque%) minuscule(path%) ELSE IF adr_arb%<>-1 ' Extraire le disque du chemin sp‚cifi‚ CHAR{disque%}=LEFT$(CHAR{{OB_SPEC(adr_arb%,obj&)}},2)+CHR$(0) minuscule(disque%) ' Extraire le chemin proprement dit membfill(path%,272,0) obspec%=OB_SPEC(adr_arb%,obj&) CHAR{path%}=RIGHT$(LEFT$(CHAR{{obspec%}},RINSTR(CHAR{{obspec%}},"\")),SUB(LEN(LEFT$(CHAR{{obspec%}},RINSTR(CHAR{{obspec%}},"\"))),2))+CHR$(0) minuscule(path%) ' Si d‚sir‚, extraire le nom du fichier IF ind! IF LEN(CHAR{path%})>1 CHAR{sel%}=MID$(CHAR{{obspec%}},SUCC(RINSTR(CHAR{{obspec%}},"\")),LEN(LEFT$(CHAR{{obspec%}},RINSTR(CHAR{{obspec%}},"\"))))+CHR$(0) ELSE CHAR{sel%}=RIGHT$(CHAR{{obspec%}},SUB(LEN(CHAR{{obspec%}}),3))+CHR$(0) ENDIF IF INSTR(CHAR{sel%},".") CHAR{masque%}=RIGHT$(CHAR{sel%},SUB(LEN(CHAR{sel%}),INSTR(CHAR{sel%},".")))+CHR$(0) ENDIF ENDIF ENDIF minuscule(sel%) minuscule(masque%) minuscule(msq%) extend(sel%,masque%,sel%) IF sel! IF magic! AND (INSTR(CHAR{sel%},".")=0) ! Allez, les nom longs de MagiC! fslx_do(sel%,liin%) ELSE IF INT{ADD({ADD(GB,4)},0)}<&H140 ! Ancien GEM/TOS... @selecteur(sel%) ELSE ! Sinon le nouveau selecteur IF liin%<>-1 @xselecteur(sel%,liin%) ELSE @selecteur(sel%) ENDIF ENDIF IF CHAR{masque%}<>"*" extend(sel%,masque%,sel%) ENDIF ENDIF ENDIF minuscule(sel%) minuscule(masque%) minuscule(msq%) minuscule(disque%) minuscule(path%) RETURN > PROCEDURE selecteur(sel%) ' CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%}+CHR$(0) ' INT{ADD(GCONTRL,2)}=0 INT{ADD(GCONTRL,4)}=2 INT{ADD(GCONTRL,6)}=2 INT{ADD(GCONTRL,8)}=0 ' {ADDRIN}=mem_che% {ADD(ADDRIN,4)}=sel% ' GEMSYS 90 ' IF INT{ADD(GINTOUT,2)}=1 CHAR{disque%}=LEFT$(CHAR{mem_che%},2) CHAR{path%}=RIGHT$(LEFT$(CHAR{mem_che%},RINSTR(CHAR{mem_che%},"\")),SUB(LEN(LEFT$(CHAR{mem_che%},RINSTR(CHAR{mem_che%},"\"))),2))+CHR$(0) ELSE membfill(sel%,LEN(CHAR{sel%}),0) ENDIF ' RETURN > PROCEDURE xselecteur(sel%,liin%) ' CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+"*."+CHAR{masque%}+CHR$(0) ' INT{ADD(GCONTRL,2)}=0 INT{ADD(GCONTRL,4)}=2 INT{ADD(GCONTRL,6)}=3 INT{ADD(GCONTRL,8)}=0 ' {ADDRIN}=mem_che% ! Chemin {ADD(ADDRIN,4)}=sel% ! Nom du fichier {ADD(ADDRIN,8)}=liin% ! Texte d'information ' GEMSYS &H5B ' IF INT{ADD(GINTOUT,2)}=1 CHAR{disque%}=LEFT$(CHAR{mem_che%},2) CHAR{path%}=RIGHT$(LEFT$(CHAR{mem_che%},RINSTR(CHAR{mem_che%},"\")),SUB(LEN(LEFT$(CHAR{mem_che%},RINSTR(CHAR{mem_che%},"\"))),2))+CHR$(0) ELSE membfill(sel%,LEN(CHAR{sel%}),0) ENDIF ' RETURN > PROCEDURE fslx_do(sel%,liin%) LOCAL t%,fsd% ' Nouvelle fonction de s‚lecteur de fichier pour MagiC! et les noms longs ' tir‚ des travaux de Pierre THONTAT (Rajha LONE de QUEEN MEKA, merci … lui). ' IF CHAR{path%}="" CHAR{tr_tmp%}=CHAR{disque%}+"\"+CHR$(0) CHAR{mem_che%}=CHAR{disque%}+"\"+CHR$(0)+CHR$(0) ELSE CHAR{tr_tmp%}=CHAR{disque%}+CHAR{path%}+CHR$(0) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHR$(0)+CHR$(0) ENDIF IF CHAR{path_systeme%}="" CHAR{tr_tmp%}=CHAR{tr_tmp%}+CHR$(0)+CHAR{disque_systeme%}+"\"+CHR$(0) ELSE CHAR{tr_tmp%}=CHAR{tr_tmp%}+CHR$(0)+CHAR{disque_systeme%}+CHAR{path_systeme%}+CHR$(0) ENDIF CHAR{tr_tmp%}=CHAR{tr_tmp%}+CHR$(0)+"u:\"+CHR$(0)+CHR$(0) ' CHAR{tr_tmp%}=CHAR{tr_tmp%}+CHR$(0)+"u:\bin\"+CHR$(0) ' CHAR{tr_tmp%}=CHAR{tr_tmp%}+CHR$(0)+"u:\dev\"+CHR$(0) ' CHAR{tr_tmp%}=CHAR{tr_tmp%}+CHR$(0)+"c:\clipbrd\"+CHR$(0)+CHR$(0) ' CHAR{masque%}="*"+CHR$(0)+"*."+CHAR{masque%}+CHR$(0)+CHR$(0) ' ' tr_tmp% est une chaine se terminant par deux octets NULL. ' avec tout ses paramŠtres INT{ADD(GCONTRL,2)}=4 ! Nombre d'entr‚es dans GINTIN INT{ADD(GCONTRL,4)}=4 ! Nombre d'entr‚es dans GINTOUT INT{ADD(GCONTRL,6)}=6 ! Nombre d'entr‚es dans ADDRIN INT{ADD(GCONTRL,8)}=2 ! Nombre d'entr‚es dans ADDROUT ' INT{GINTIN}=128 ! longueur du chemin dans le s‚lecteur INT{ADD(GINTIN,2)}=33 ! longueur nom de fichier dans le du s‚lecteur INT{ADD(GINTIN,4)}=0 ! Type de tri (0 = par nom) INT{ADD(GINTIN,6)}=8 ! Flags (8 = GETMULTI) ' {ADDRIN}=liin% ! titre de la boite {ADD(ADDRIN,4)}=mem_che% ! nom du chemin {ADD(ADDRIN,8)}=sel% ! nom du fichier sans le chemin {ADD(ADDRIN,12)}=masque% ! masques possibles {ADD(ADDRIN,16)}=0 ! Filtre {ADD(ADDRIN,20)}=tr_tmp% ! chemins par d‚faut ' GEMSYS &HC2 ! L…, c'est en fait un fslx_do() ' fsd%={ADDROUT} ! on r‚cupŠre un identificateur qui ' pour fermer le s‚lecteur (c'est un handle) IF INT{ADD(GINTOUT,2)}=1 ! si l'appel a march‚ ' on r‚cupŠre le nom de fichier, le disque et le chemin CHAR{disque%}=LEFT$(CHAR{mem_che%},2)+CHR$(0) CHAR{path%}=RIGHT$(LEFT$(CHAR{mem_che%},RINSTR(CHAR{mem_che%},"\")),SUB(LEN(LEFT$(CHAR{mem_che%},RINSTR(CHAR{mem_che%},"\"))),2))+CHR$(0) ELSE ' Sinon, on vide le nom de fichier BYTE{sel%}=0 ENDIF ' IF INT{GINTOUT} ! on referme proprement l'appel INT{ADD(GCONTRL,2)}=0 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 ' {ADDRIN}=fsd% ' GEMSYS &HBF ! L…, c'est en fait un fslx_close() ENDIF ' RETURN > PROCEDURE mise_a_jour_des_chemins_et_nom_de_fichier CHAR{nom_mouvement%}=CHAR{nom_en_cours%} CHAR{masque%}="pov"+CHR$(0) definition_fichier(adr_parametres%,chepov&,nom_mouvement%,FALSE,FALSE,-1) IF INSTR(CHAR{nom_mouvement%},".") CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}}=LEFT$(CHAR{nom_mouvement%}+" ",12) ELSE CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}}=LEFT$(CHAR{nom_mouvement%}+SPACE$(43),43) ENDIF IF BTST(OB_STATE(adr_lanceur%,povtype0&),aes_selected&) CHAR{masque%}="TGA"+CHR$(0) ELSE IF BTST(OB_STATE(adr_lanceur%,SUCC(povtype0&)),aes_selected&) CHAR{masque%}="DIS"+CHR$(0) ELSE IF BTST(OB_STATE(adr_lanceur%,povtype1&),aes_selected&) CHAR{masque%}="RAW"+CHR$(0) ENDIF definition_fichier(adr_parametres%,cheimg&,nom_mouvement%,FALSE,FALSE,-1) IF INSTR(CHAR{nom_mouvement%},".") CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}=LEFT$(CHAR{nom_mouvement%}+" ",12) ELSE CHAR{{OB_SPEC(adr_lanceur%,povimage&)}}=LEFT$(CHAR{nom_mouvement%}+SPACE$(43),43) ENDIF CHAR{{OB_SPEC(adr_fenetre%,fenvue02&)}}=CHAR{titre_en_cours%} RETURN > PROCEDURE pdomain(pdomain&) IF multitache! ~GEMDOS(&H119,W:pdomain&) ENDIF RETURN ' ************ V‚rification des extensions et cr‚ation des backups ************* > PROCEDURE extend(pr%,ex%,VAR ps%) LOCAL nl%,dn%,i&,j& IF (INSTR(CHAR{pr%},".")=0 AND LEN(CHAR{pr%})<9) OR (INSTR(CHAR{pr%},".")<>0) dn%=@prendre(272,TRUE,3) IF INSTR(CHAR{pr%},".")=0 AND LEN(CHAR{pr%})>0 i&=LEN(CHAR{pr%}) BYTE{ADD(pr%,i&)}=ASC(".") FOR j&=SUCC(i&) TO ADD(i&,3) BYTE{ADD(pr%,j&)}=BYTE{ADD(ex%,SUB(j&,SUCC(i&)))} NEXT j& ENDIF IF RIGHT$(CHAR{pr%})<>"\" AND RIGHT$(CHAR{pr%},5)<>"\."+CHAR{ex%} AND CHAR{pr%}>"" FOR i&=LEN(CHAR{pr%}) DOWNTO 1 EXIT IF BYTE{ADD(pr%,i&)}=92 INC nl% NEXT i& CHAR{dn%}=RIGHT$(CHAR{pr%},nl%) IF INSTR(CHAR{dn%},".")=0 CHAR{ps%}=CHAR{pr%}+"."+CHAR{ex%}+CHR$(0) CHAR{dn%}=CHAR{dn%}+"."+CHAR{ex%}+CHR$(0) ENDIF IF RIGHT$(CHAR{dn%},4)<>"."+CHAR{ex%} IF LEFT$(CHAR{dn%},2)<>"\." CHAR{ps%}=LEFT$(CHAR{pr%},LEN(CHAR{pr%})-nl%)+LEFT$(CHAR{dn%},INSTR(CHAR{dn%},"."))+CHAR{ex%}+CHR$(0) ELSE membfill(ps%,LEN(CHAR{ps%}),0) ENDIF ELSE CHAR{ps%}=LEFT$(CHAR{pr%},LEN(CHAR{pr%})-nl%)+CHAR{dn%}+CHR$(0) ENDIF ELSE membfill(ps%,LEN(CHAR{ps%}),0) ENDIF libere(*dn%) ENDIF minuscule(ps%) RETURN > PROCEDURE backup(pr%) LOCAL xn% ' ---- On commence par cr‚er le masque de sauvegarde par remplacement de la ' ---- derniŠre lettre par un K... BMOVE masque%,msq%,4 BYTE{ADD(msq%,2)}=&H4B minuscule(msq%) ' xn%=@prendre(272,TRUE,3) IF @s_exist(pr%) AND backup!=TRUE extend(pr%,msq%,xn%) IF CHAR{xn%}<>"" IF @s_exist(xn%) ~GEMDOS(&H41,L:xn%) ENDIF ~GEMDOS(&H56,L:pr%,L:xn%) ENDIF ENDIF libere(*xn%) RETURN ' ****************************************************************************** ' **** **** ' **** Proc‚dures des fonctions VDI par appels r‚els de la VDI **** ' **** **** ' ****************************************************************************** ' ****************************************************************************** > PROCEDURE line(px&,py&,ox&,oy&) INT{emu_xten%}=px& INT{ADD(emu_xten%,2)}=py& INT{ADD(emu_xten%,4)}=ox& INT{ADD(emu_xten%,6)}=oy& polyline(1) RETURN > PROCEDURE box(px&,py&,ox&,oy&) INT{emu_xten%}=px& INT{ADD(emu_xten%,2)}=py& INT{ADD(emu_xten%,4)}=ox& INT{ADD(emu_xten%,6)}=py& INT{ADD(emu_xten%,8)}=ox& INT{ADD(emu_xten%,10)}=oy& INT{ADD(emu_xten%,12)}=px& INT{ADD(emu_xten%,14)}=oy& INT{ADD(emu_xten%,16)}=px& INT{ADD(emu_xten%,18)}=py& polyline(4) RETURN > PROCEDURE pbox(px&,py&,ox&,oy&) INT{emu_xten%}=px& INT{ADD(emu_xten%,2)}=py& INT{ADD(emu_xten%,4)}=ox& INT{ADD(emu_xten%,6)}=py& INT{ADD(emu_xten%,8)}=ox& INT{ADD(emu_xten%,10)}=oy& INT{ADD(emu_xten%,12)}=px& INT{ADD(emu_xten%,14)}=oy& INT{ADD(emu_xten%,16)}=px& INT{ADD(emu_xten%,18)}=py& filled_aera(4) RETURN ' ***************** Proc‚dure de paramŠtrage de trac‚ (lignes & motifs) ****** > PROCEDURE set_type_de_ligne(c&,e&,t&,sd&,sf&,user%) LOCAL r&,v&,b& IF true_color! inquire_color_representation(c&,r&,v&,b&,vdihandle%) set_color_representation(254,r&,v&,b&,vdihandle%) set_polyline_color_index(254) ELSE set_polyline_color_index(c&) ENDIF IF t&=7 set_user_defined_line_style_pattern(-user%) set_polyline_line_witdh(e&) set_polyline_type(t&) set_polyline_end_styles(sd&,sf&) ELSE set_polyline_line_witdh(e&) set_polyline_type(t&) set_polyline_end_styles(sd&,sf&) ENDIF RETURN > PROCEDURE set_remplissage(t&,m&,c&,adr%) LOCAL r&,v&,b& IF t&=4 AND adr%>0 set_fill_interior_style(t&) set_user_defined_fill_pattern(adr%) ELSE IF t&>-1 set_fill_interior_style(t&) ENDIF IF m&>-1 set_fill_style_index(m&) ENDIF ENDIF IF c&>-1 IF true_color! inquire_color_representation(c&,r&,v&,b&,vdihandle%) set_color_representation(254,r&,v&,b&,vdihandle%) set_fill_color_index(254) ELSE set_fill_color_index(c&) ENDIF ENDIF RETURN > PROCEDURE set_text_mode(col&,atr&,ang&,hau&,fon&,hand%) LOCAL r&,v&,b& IF true_color! inquire_color_representation(col&,r&,v&,b&,hand%) set_color_representation(254,r&,v&,b&,hand%) set_graphic_text_color_index(254,hand%) ELSE set_graphic_text_color_index(col&,hand%) ENDIF set_graphic_text_special_effects(atr&,hand%) set_character_baseline_vector(ang&) set_text_face(fon&,hand%) set_character_height(hau&,hand%) RETURN ' ************************ Sous proc‚dure utilisant la VDI ******************** > PROCEDURE clear_workstation ! VDI 3 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=vdihandle% VDISYS 3 RETURN > PROCEDURE update_workstation ! VDI 4 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=vdihandle% VDISYS 4 RETURN > PROCEDURE polyline(nb&) ! VDI 6 INT{ADD(CONTRL,2)}=SUCC(nb&) INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=vdihandle% bmove(emu_xten%,PTSIN,SHL(SUCC(nb&),2)) VDISYS 6 RETURN > PROCEDURE polymarker(nb&) ! VDI 7 INT{ADD(CONTRL,2)}=SUCC(nb&) INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=vdihandle% bmove(emu_xten%,PTSIN,SHL(SUCC(nb&),2)) VDISYS 7 RETURN > PROCEDURE text(px%,py%,t%) ! VDI 8 LOCAL i& INT{ADD(CONTRL,2)}=1 INT{ADD(CONTRL,6)}=LEN(CHAR{t%}) INT{ADD(CONTRL,12)}=vdihandle% INT{PTSIN}=px% INT{ADD(PTSIN,2)}=py% CLR i& DO INT{ADD(INTIN,SHL(i&,1))}=BYTE{ADD(t%,i&)} INC i& LOOP WHILE i& PROCEDURE filled_aera(nb&) ! VDI 9 INT{ADD(CONTRL,2)}=SUCC(nb&) INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=vdihandle% bmove(emu_xten%,PTSIN,SHL(SUCC(nb&),2)) VDISYS 9 RETURN > PROCEDURE vdi_11(fnct|,cx&,cy&,ox&,oy&,rayx&,rayy&,ang0&,ang1&) ! VDI 11 INT{ADD(CONTRL,2)}=2 INT{ADD(CONTRL,10)}=fnct| INT{ADD(CONTRL,12)}=vdihandle% $S|,$S> SELECT fnct| CASE 1,8,9 ! Bar, Rounded rectangle, Filled rounded rectangle INT{ADD(CONTRL,6)}=0 INT{PTSIN}=cx& INT{ADD(PTSIN,2)}=cy& INT{ADD(PTSIN,4)}=ox& INT{ADD(PTSIN,6)}=oy& CASE 5 ! Ellipse INT{ADD(CONTRL,6)}=0 INT{PTSIN}=cx& INT{ADD(PTSIN,2)}=cy& INT{ADD(PTSIN,4)}=rayx& INT{ADD(PTSIN,6)}=rayy& CASE 6,7 ! Elliptical arc, Elliptical pie INT{ADD(CONTRL,6)}=2 INT{INTIN}=ang0& INT{ADD(INTIN,2)}=ang1& INT{PTSIN}=cx& INT{ADD(PTSIN,2)}=cy& INT{ADD(PTSIN,4)}=rayx& INT{ADD(PTSIN,6)}=rayy& ENDSELECT VDISYS 11 RETURN > PROCEDURE set_character_height(h_d_t&,hand%) ! VDI 12 INT{ADD(CONTRL,2)}=1 INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=hand% INT{PTSIN}=0 INT{ADD(PTSIN,2)}=h_d_t& VDISYS 12 RETURN > PROCEDURE set_character_baseline_vector(a_d_t&) ! VDI 13 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=a_d_t& VDISYS 13 RETURN > PROCEDURE set_color_representation(index&,r&,v&,b&,hand%) ! VDI 14 ' set_color_representation Fonction 14 de la VDI INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=4 INT{ADD(CONTRL,12)}=hand% INT{INTIN}=index& INT{ADD(INTIN,2)}=r& INT{ADD(INTIN,4)}=v& INT{ADD(INTIN,6)}=b& VDISYS 14 RETURN > PROCEDURE set_polyline_type(t_d_l%) ! VDI 15 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=t_d_l% VDISYS 15 RETURN > PROCEDURE set_polyline_line_witdh(l_d_l&) ! VDI 16 INT{ADD(CONTRL,2)}=1 INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=vdihandle% INT{PTSIN}=l_d_l& INT{ADD(PTSIN,2)}=0 VDISYS 16 RETURN > PROCEDURE set_polyline_color_index(c_d_l&) ! VDI 17 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=c_d_l& VDISYS 17 RETURN > PROCEDURE set_polymarker_type(c_d_m&) ! VDI 18 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=c_d_m& VDISYS 18 RETURN > PROCEDURE set_polymarker_height(c_d_m&) ! VDI 19 INT{ADD(CONTRL,2)}=1 INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=vdihandle% INT{PTSIN}=0 INT{ADD(PTSIN,2)}=c_d_m& VDISYS 19 RETURN > PROCEDURE set_polymarker_color_index(c_d_m&) ! VDI 20 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=c_d_m& VDISYS 20 RETURN > PROCEDURE set_text_face(f_d_t&,hand%) ! VDI 21 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=hand% INT{INTIN}=f_d_t& VDISYS 21 RETURN > PROCEDURE set_graphic_text_color_index(c_d_t&,hand%) ! VDI 22 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=hand% INT{INTIN}=c_d_t& VDISYS 22 RETURN > PROCEDURE set_fill_interior_style(s_d_r|) ! VDI 23 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=s_d_r| VDISYS 23 RETURN > PROCEDURE set_fill_style_index(i_d_r|) ! VDI 24 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=i_d_r| VDISYS 24 RETURN > PROCEDURE set_fill_color_index(c_d_r&) ! VDI 25 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=c_d_r& VDISYS 25 RETURN > PROCEDURE inquire_color_representation(index&,VAR r&,v&,b&,hand%) ! VDI 26 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=2 INT{ADD(CONTRL,12)}=hand% INT{INTIN}=index& INT{ADD(INTIN,2)}=0 ! 0=couleurs d‚finies 1=composition physique ' effectivement r‚alis‚ VDISYS 26 r&=INT{ADD(INTOUT,2)} v&=INT{ADD(INTOUT,4)} b&=INT{ADD(INTOUT,6)} RETURN > PROCEDURE input_locator(soux&,souy&) ! VDI 28 INT{ADD(CONTRL,2)}=1 INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=vdihandle% INT{PTSIN}=soux& INT{ADD(PTSIN,2)}=souy& VDISYS 28 RETURN > PROCEDURE set_writing_mode(mode_de_dessin|) ! VDI 32 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=mode_de_dessin| VDISYS 32 RETURN > PROCEDURE set_input_mode(mode&) ! VDI 33 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=2 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=1 ! Mode 'LOCATOR' (la souris quoi !) INT{ADD(INTIN,2)}=mode& VDISYS 33 RETURN > PROCEDURE set_graphic_text_alignment(p_h&,p_v&,hand%) ! VDI 39 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=2 INT{ADD(CONTRL,12)}=hand% INT{INTIN}=p_h& INT{ADD(INTIN,2)}=p_v& VDISYS 39 RETURN > PROCEDURE open_virtuel_screen_workstation(ncndc|) ! VDI 100 LOCAL nb&,i& INT{ADD(CONTRL,2)}=0 ! Longueur du tableau PTSIN INT{ADD(CONTRL,6)}=11 ! Longueur du tableau INTIN ' Ren‚ DEPEINT … cherch‚ sur son TT pourquoi cela ne fonctionnait pas ' avec sa carte MATRIX. AprŠs pas mal de temps, il a fini par d‚couvrir ' que le driver de la carte avait besoin d'une valeur dans CONTRL(6) ' Pour ˆtre propre, nous allons donc y placer l'AP_ID de l'application. ' Et ben non. Pierre THONTAT … trouv‚ dans le COMPENDIUM ce qu'il fallait ' mettre … cet endroit. C'est en fait la valeur retourn‚e par GRAF_HANDLE; INT{ADD(CONTRL,12)}=@graf_handle(i&,i&,i&,i&) ' Merci … Ren‚ et … Pierre... INT{INTIN}=1 ! Num‚ro ID du p‚riph‚rique physique (‚cran) INT{ADD(INTIN,2)}=1 ! Type de ligne INT{ADD(INTIN,4)}=1 ! Index de couleur Polyline INT{ADD(INTIN,6)}=1 ! Type de marqueur INT{ADD(INTIN,8)}=1 ! Index de couleur Polymarker INT{ADD(INTIN,10)}=1 ! Fonte de caractŠres INT{ADD(INTIN,12)}=1 ! Index couleur texte INT{ADD(INTIN,14)}=1 ! Fill interior Style INT{ADD(INTIN,16)}=1 ! Fill style index INT{ADD(INTIN,18)}=1 ! Fill index couleur INT{ADD(INTIN,20)}=ncndc| ! Flag coordonn‚es NDC ou RC VDISYS 100 nb&=INT{ADD(CONTRL,8)} vdihandle%=INT{ADD(CONTRL,12)} station%=@prendre(SHL(nb&,1),FALSE,3) CLR i& DO INT{ADD(station%,SHL(i&,1))}=INT{ADD(INTOUT,MUL(i&,2))} INC i& LOOP WHILE i& FUNCTION open_virtuel_screen_workstation(ncndc|) ! VDI 100 INT{ADD(CONTRL,2)}=0 ! Longueur du tableau PTSIN INT{ADD(CONTRL,6)}=11 ! Longueur du tableau INTIN INT{ADD(CONTRL,12)}=@graf_handle(i&,i&,i&,i&) INT{INTIN}=1 ! Num‚ro ID du p‚riph‚rique physique (‚cran) INT{ADD(INTIN,2)}=1 ! Type de ligne INT{ADD(INTIN,4)}=1 ! Index de couleur Polyline INT{ADD(INTIN,6)}=1 ! Type de marqueur INT{ADD(INTIN,8)}=1 ! Index de couleur Polymarker INT{ADD(INTIN,10)}=1 ! Fonte de caractŠres INT{ADD(INTIN,12)}=1 ! Index couleur texte INT{ADD(INTIN,14)}=1 ! Fill interior Style INT{ADD(INTIN,16)}=1 ! Fill style index INT{ADD(INTIN,18)}=1 ! Fill index couleur INT{ADD(INTIN,20)}=ncndc| ! Flag coordonn‚es NDC ou RC VDISYS 100 RETURN INT{ADD(CONTRL,12)} ENDFUNC > PROCEDURE close_virtual_screen_workstation(hand%) ! VDI 101 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=hand% VDISYS 101 RETURN > PROCEDURE extended_inquire_function ! VDI 102 LOCAL nb&,i& INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=1 ! Information ‚tendues sur la station VDISYS 102 nb&=INT{ADD(CONTRL,8)} etendue%=@prendre(SHL(nb&,1),FALSE,3) CLR i& DO INT{ADD(etendue%,SHL(i&,1))}=INT{ADD(INTOUT,SHL(i&,1))} INC i& LOOP WHILE i& PROCEDURE contour_fill(px%,py%) ! VDI 103 INT{ADD(CONTRL,2)}=1 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=-1 INT{PTSIN}=px% INT{ADD(PTSIN,2)}=py% VDISYS 103 RETURN > PROCEDURE set_fill_perimeter_visibility(p_v&) ! VDI 104 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=p_v& VDISYS 104 RETURN > PROCEDURE get_pixel(cx&,cy&,VAR pixel&,index&) ! VDI 105 INT{ADD(CONTRL,2)}=1 INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=vdihandle% INT{PTSIN}=cx& INT{ADD(PTSIN,2)}=cy& VDISYS 105 pixel&=INT{INTOUT} index&=INT{ADD(INTOUT,2)} RETURN > PROCEDURE set_graphic_text_special_effects(e_d_t&,hand%) ! VDI 106 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=hand% INT{INTIN}=e_d_t& VDISYS 106 RETURN > PROCEDURE set_character_cell_height_point_mode(e_d_t&) ! VDI 107 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=e_d_t& VDISYS 107 RETURN > PROCEDURE set_polyline_end_styles(d_d_l&,f_d_l&) ! VDI 108 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=2 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=d_d_l& INT{ADD(INTIN,2)}=f_d_l& VDISYS 108 RETURN ' VDI 109 > PROCEDURE copy_raster_opaque(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x11&,y11&,x12&,y12&,x21&,y21&,x22&,y22&,mod|) ' Fonction VDI Nø 109 (COPY RASTER, OPAQUE) ' Copie de raster de mˆme nombre de plans ' D‚finition du bloc raster source (MFDB): graf_mouse(m_off&,0) {mfdb%}=s% ! Adresse de la m‚moire SOURCE IF s%<>0 ! L'‚cran, C'est au GEM de bosser INT{ADD(mfdb%,4)}=sl& ! Largeur en points du raster entier INT{ADD(mfdb%,6)}=sh& ! Hauteur en points du raster entier INT{ADD(mfdb%,8)}=SHR(ADD(sl&,15),4) ! Largeur en mots du raster entier IF mode_entrelace! INT{ADD(mfdb%,10)}=1 ! flag standart (cons‚cutif) ELSE INT{ADD(mfdb%,10)}=-1*(sp&=1) ! flag standart (cons‚qutif en mono) ENDIF ! ou sp‚cifique (entrelac‚ en couleur) INT{ADD(mfdb%,12)}=sp& ! Nombre de niveaux de couleurs ENDIF ' ' D‚finition du bloc raster cible (MFBD): {mfbd%}=d% ! Adresse de la m‚moire SOURCE IF d%<>0 ! L'‚cran, C'est au GEM de bosser INT{ADD(mfbd%,4)}=dl& ! Largeur en points du raster entier INT{ADD(mfbd%,6)}=dh& ! Hauteur en points du raster entier INT{ADD(mfbd%,8)}=SHR(ADD(dl&,15),4) ! Largeur en mots du raster entier IF mode_entrelace! INT{ADD(mfbd%,10)}=1 ! flag standart (cons‚cutif) ELSE INT{ADD(mfbd%,10)}=-1*(dp&=1) ! flag standart (cons‚qutif en mono) ENDIF ! ou sp‚cifique (entrelac‚ en couleur) INT{ADD(mfbd%,12)}=dp& ! Nombre de niveaux de couleurs ENDIF ' INT{ADD(CONTRL,2)}=4 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% {ADD(CONTRL,14)}=mfdb% {ADD(CONTRL,18)}=mfbd% INT{INTIN}=mod| ! Mode de copie de 0 … 15 ' INT{PTSIN}=x11& ! X en haut … gauche source INT{ADD(PTSIN,2)}=y11& ! Y en haut … gauche source INT{ADD(PTSIN,4)}=x12& ! X en bas … droite source INT{ADD(PTSIN,6)}=y12& ! Y en bas … droite source INT{ADD(PTSIN,8)}=x21& ! X en haut … gauche destination INT{ADD(PTSIN,10)}=y21& ! Y en haut … gauche destination INT{ADD(PTSIN,12)}=x22& ! X en bas … droite destination INT{ADD(PTSIN,14)}=y22& ! Y en bas … droite destination VDISYS 109 graf_mouse(m_on&,0) ' RETURN > PROCEDURE transform_form(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&) ! VDI 110 ' Fonction VDI Nø 110 (TRANSFORM FORM) ' Copie de raster standard vers raster sp‚cifique ' D‚finition du bloc raster source (MFDB): {mfdb%}=s% ! Adresse de la m‚moire SOURCE IF s%<>0 ! L'‚cran, C'est au GEM de bosser INT{ADD(mfdb%,4)}=sl& ! Largeur en points du raster entier INT{ADD(mfdb%,6)}=sh& ! Hauteur en points du raster entier INT{ADD(mfdb%,8)}=SHR(ADD(sl&,15),4) ! Largeur en mots du raster entier IF mode_entrelace! INT{ADD(mfdb%,10)}=1 ! flag standart (cons‚cutif) ELSE INT{ADD(mfdb%,10)}=-1*(sp&=1) ! flag standart (cons‚qutif en mono) ENDIF INT{ADD(mfdb%,12)}=sp& ! Nombre de niveaux de couleurs ENDIF ' ' D‚finition du bloc raster cible (MFBD): {mfbd%}=d% ! Adresse de la m‚moire SOURCE IF d%<>0 ! L'‚cran, C'est au GEM de bosser INT{ADD(mfbd%,4)}=dl& ! Largeur en points du raster entier INT{ADD(mfbd%,6)}=dh& ! Hauteur en points du raster entier INT{ADD(mfbd%,8)}=SHR(ADD(dl&,15),4) ! Largeur en mots du raster entier IF mode_entrelace! INT{ADD(mfbd%,10)}=1 ! flag standart (cons‚cutif) ELSE INT{ADD(mfbd%,10)}=-1*(dp&=1) ! flag standart (cons‚qutif en mono) ENDIF INT{ADD(mfbd%,12)}=dp& ! Nombre de niveaux de couleurs ENDIF ' INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=vdihandle% {ADD(CONTRL,14)}=mfdb% {ADD(CONTRL,18)}=mfbd% VDISYS 110 ' RETURN > PROCEDURE set_mouse_form(p_h&) ! VDI 111 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=37 INT{ADD(CONTRL,12)}=vdihandle% bmove(ADD(form_mouse%,MUL(p_h&,74)),INTIN,74) VDISYS 111 RETURN > PROCEDURE set_user_defined_fill_pattern(adr%) ! VDI 112 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=16 INT{ADD(CONTRL,12)}=vdihandle% bmove(adr%,INTIN,32) VDISYS 112 RETURN > PROCEDURE set_user_defined_line_style_pattern(e_d_l%) ! VDI 113 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=e_d_l% VDISYS 113 RETURN ' ! VDI 116 > PROCEDURE inquire_text_extend(t%,hand%,VAR x1&,y1&,x2&,y2&,x3&,y3&,x4&,y4&) LOCAL i& INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,4)}=4 INT{ADD(CONTRL,6)}=LEN(CHAR{t%}) INT{ADD(CONTRL,8)}=0 INT{ADD(CONTRL,12)}=hand% CLR i& DO INT{ADD(INTIN,SHL(i&,1))}=BYTE{ADD(t%,i&)} INC i& LOOP WHILE i& PROCEDURE load_fonts ! VDI 119 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=0 VDISYS 119 nombre_de_fontes%=INT{INTOUT} IF nombre_de_fontes%<1 nombre_de_fontes%=1 ENDIF RETURN > PROCEDURE unload_fonts ! VDI 120 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=0 VDISYS 120 RETURN ' ! VDI 121 > PROCEDURE copy_raster_transparent(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x11&,y11&,x12&,y12&,x21&,y21&,x22&,y22&) ' Fonction VDI Nø 121 (COPY RASTER, TRANSPARENT) ' Copie de raster monochrome vers raster couleur ' D‚finition du bloc raster source (MFDB): graf_mouse(m_off&,0) {mfdb%}=s% ! Adresse de la m‚moire SOURCE IF s%<>0 ! L'‚cran, C'est au GEM de bosser INT{ADD(mfdb%,4)}=sl& ! Largeur en points du raster entier INT{ADD(mfdb%,6)}=sh& ! Hauteur en points du raster entier INT{ADD(mfdb%,8)}=SHR(ADD(sl&,15),4) ! Largeur en mots du raster entier IF mode_entrelace! INT{ADD(mfdb%,10)}=1 ! flag standart (cons‚cutif) ELSE INT{ADD(mfdb%,10)}=-1*(sp&=1) ! flag standart (cons‚qutif en mono) ENDIF INT{ADD(mfdb%,12)}=sp& ! Nombre de niveaux de couleurs ENDIF ' ' D‚finition du bloc raster cible (MFBD): {mfbd%}=d% ! Adresse de la m‚moire SOURCE IF d%<>0 ! L'‚cran, C'est au GEM de bosser INT{ADD(mfbd%,4)}=dl& ! Largeur en points du raster entier INT{ADD(mfbd%,6)}=dh& ! Hauteur en points du raster entier INT{ADD(mfbd%,8)}=SHR(ADD(dl&,15),4) ! Largeur en mots du raster entier IF mode_entrelace! INT{ADD(mfbd%,10)}=1 ! flag standart (cons‚cutif) ELSE INT{ADD(mfbd%,10)}=-1*(dp&=1) ! flag standart (cons‚qutif en mono) ENDIF INT{ADD(mfbd%,12)}=dp& ! Nombre de niveaux de couleurs ENDIF ' INT{ADD(CONTRL,2)}=4 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% {ADD(CONTRL,14)}=mfdb% {ADD(CONTRL,18)}=mfbd% INT{INTIN}=3 ! Mode REMPLACE ' INT{PTSIN}=x11& ! X en haut … gauche source INT{ADD(PTSIN,2)}=y11& ! Y en haut … gauche source INT{ADD(PTSIN,4)}=x12& ! X en bas … droite source INT{ADD(PTSIN,6)}=y12& ! Y en bas … droite source INT{ADD(PTSIN,8)}=x21& ! X en haut … gauche destination INT{ADD(PTSIN,10)}=y21& ! Y en haut … gauche destination INT{ADD(PTSIN,12)}=x22& ! X en bas … droite destination INT{ADD(PTSIN,14)}=y22& ! Y en bas … droite destination VDISYS 121 graf_mouse(m_on&,0) ' RETURN > PROCEDURE sample_mouse_button_state(VAR global_mx&,global_my&,global_mk&) ! VDI 124 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=0 INT{ADD(CONTRL,12)}=vdihandle% VDISYS 124 global_mk&=INT{INTOUT} global_mx&=INT{PTSOUT} global_my&=INT{ADD(PTSOUT,2)} RETURN > PROCEDURE set_clipping_rectangle(flags|,cx&,cy&,ox&,oy&,fx&,fy&) ! VDI 129 cx&=MAX(cx&,fx&) cy&=MAX(cy&,fy&) INT{ADD(CONTRL,2)}=2 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=flags| INT{PTSIN}=cx& INT{ADD(PTSIN,2)}=cy& INT{ADD(PTSIN,4)}=ox& INT{ADD(PTSIN,6)}=oy& VDISYS 129 RETURN > PROCEDURE inquire_face_name_and_index(num&) ! VDI 130 LOCAL i&,adr% INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=num& VDISYS 130 adr%=ADD(nom_des_fontes%,MUL(PRED(num&),36)) INT{adr%}=INT{ADD(INTOUT,66)} INT{ADD(adr%,2)}=INT{INTOUT} CLR i& DO BYTE{ADD(ADD(adr%,4),i&)}=INT{ADD(ADD(INTOUT,2),SHL(i&,1))} INC i& LOOP WHILE i&<32 RETURN > PROCEDURE set_outline_fonte_fkew(ang%) ! VDI 253 INT{ADD(CONTRL,2)}=0 INT{ADD(CONTRL,6)}=1 INT{ADD(CONTRL,12)}=vdihandle% INT{INTIN}=ang% VDISYS 253 RETURN ' ****************************************************************************** ' **** **** ' **** Proc‚dures des fonctions AES par appels r‚els de l'AES **** ' **** **** ' ****************************************************************************** ' ************************ Sous proc‚dure utilisant l'AES ********************** > FUNCTION appl_init ! 10 RETURN WORD{ADD({ADD(GB,4)},4)} ENDFUNC > FUNCTION appl_read(ap_rid&,ap_rlength&,ap_rpbuff%) ! 11 INT{ADD(GCONTRL,2)}=2 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=ap_rid& INT{ADD(GINTIN,2)}=ap_rlength& {ADDRIN}=ap_rpbuff% GEMSYS 11 RETURN INT{GINTOUT} ENDFUNC > PROCEDURE appl_write(ap_wid&,ap_wlength&,ap_wpbuff%) ! 12 INT{ADD(GCONTRL,2)}=2 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=ap_wid& INT{ADD(GINTIN,2)}=ap_wlength& {ADDRIN}=ap_wpbuff% GEMSYS 12 RETURN > FUNCTION appl_find(ap_fpname%) ! 13 INT{ADD(GCONTRL,2)}=0 ! 2 sous TOS | 0 sous MAGIC INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 {ADDRIN}=ap_fpname% GEMSYS 13 RETURN INT{GINTOUT} ENDFUNC > PROCEDURE appl_exit ! 19 ' GEMSYS 19 RETURN > PROCEDURE appl_startprog(prg%,cmd%) ! Gregor ' INT{buf%}=av_startprog& ! Num‚ro du message INT{ADD(buf%,2)}=ap_id& ! Indentificateur exp‚diteur du message INT{ADD(buf%,4)}=0 ! Pas d'exc‚dent au message {ADD(buf%,6)}=prg% ! Adresse de la chaine "nom du programme" {ADD(buf%,10)}=cmd% ! Adresse de la chaine de commande INT{ADD(buf%,14)}=0 ! Ici, c'est vide ' appl_write(ap_id&,16,buf%) ! Envoi du message ' RETURN > PROCEDURE appl_auftauen(child_id&) ! Gregor ' INT{buf%}=sm_m_special& ! 0 Message Identificateur INT{ADD(buf%,2)}=ap_id& ! 1 Application appelante INT{ADD(buf%,4)}=0 ! 2 Ici, c'est vide INT{ADD(buf%,6)}=0 ! 3 INT{ADD(buf%,8)}=CVI("MA") ! 4 INT{ADD(buf%,10)}=CVI("GX") ! 5 INT{ADD(buf%,12)}=smc_unfreeze& ! 6 INT{ADD(buf%,14)}=child_id& ! 7 ' appl_write(screnmgr&,16,buf%) ! Envoie par APPL_WRITE ' RETURN > FUNCTION evnt_multi(flags&,cl&,ma&,st&,f1&,x1&,y1&,w1&,h1&,f2&,x2&,y2&,w2&,h2&,buf%,ct%,VAR global_mx&,global_my&,global_mk&,kbd&,key&,click&) ' Fonction AES Nø 25 (EVNT_MULTI) INT{ADD(GCONTRL,2)}=16 INT{ADD(GCONTRL,4)}=7 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=flags& INT{ADD(GINTIN,2)}=cl& INT{ADD(GINTIN,4)}=ma& INT{ADD(GINTIN,6)}=st& INT{ADD(GINTIN,8)}=f1& INT{ADD(GINTIN,10)}=x1& INT{ADD(GINTIN,12)}=y1& INT{ADD(GINTIN,14)}=w1& INT{ADD(GINTIN,16)}=h1& INT{ADD(GINTIN,18)}=f2& INT{ADD(GINTIN,20)}=x2& INT{ADD(GINTIN,22)}=y2& INT{ADD(GINTIN,24)}=w2& INT{ADD(GINTIN,26)}=h2& INT{ADD(GINTIN,28)}=WORD(ct%) INT{ADD(GINTIN,30)}=WORD(SWAP(ct%)) {ADDRIN}=buf% GEMSYS 25 global_mx&=INT{ADD(GINTOUT,2)} global_my&=INT{ADD(GINTOUT,4)} global_mk&=INT{ADD(GINTOUT,6)} kbd&=INT{ADD(GINTOUT,8)} key&=INT{ADD(GINTOUT,10)} click&=INT{ADD(GINTOUT,12)} RETURN INT{GINTOUT} ENDFUNC > PROCEDURE menu_bar(me_btree%,me_bshow&) ! 30 INT{ADD(GCONTRL,2)}=1 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=0 INT{GINTIN}=me_bshow& {ADDRIN}=me_btree% GEMSYS 30 RETURN > PROCEDURE menu_icheck(me_ctree%,me_citem&,me_ccheck&) ! 31 INT{ADD(GCONTRL,2)}=2 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=me_citem& INT{ADD(GINTIN,2)}=me_ccheck& {ADDRIN}=me_ctree% GEMSYS 31 RETURN > PROCEDURE menu_ienable(me_ctree%,me_citem&,me_eenable&) ! 32 INT{ADD(GCONTRL,2)}=2 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=me_citem& INT{ADD(GINTIN,2)}=me_eenable& {ADDRIN}=me_ctree% GEMSYS 32 RETURN > PROCEDURE menu_tnormal(me_ctree%,me_citem&,me_nnormal&) ! 33 INT{ADD(GCONTRL,2)}=2 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=me_citem& INT{ADD(GINTIN,2)}=me_nnormal& {ADDRIN}=me_ctree% GEMSYS 33 RETURN ' ! 42 > PROCEDURE objc_draw(tree%,startob&,depth&,xclip&,yclip&,wclip&,hclip&,deb&) LOCAL axclip&,ayclip&,awclip&,ahclip& LOCAL ex&,ey&,ew&,eh&,i_& LOCAL s%,sl&,sh&,sp&,d%,dl&,dh&,dp& IF wclip&>0 AND hclip&>0 IF startob&=0 AND fond_img! AND fond%<>0 ' ************************* D‚finition du raster source s%=fond% ! L'image de fond (marbre ou autre) sl&=largeur_fond% ! Largeur sh&=hauteur_fond% ! Hauteur sp&=plan_systeme& ' ************************* D‚finition du raster destination d%=0 ! C'est le GEM qui s'occupe de tout ' ************************* Definition de la partie … d‚placer objc_draw_one(tree%,0,0,xclip&,yclip&,wclip&,hclip&) ex&=xclip& ey&=yclip& ew&=wclip& eh&=hclip& clip_raster(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,ex&,ey&,ex&,ey&,ex&,ey&,ew&,eh&,3) IF deb&>-1 objc_draw_one(tree%,deb&,depth&,xclip&,yclip&,wclip&,hclip&) ELSE objc_draw_one(tree%,1,depth&,xclip&,yclip&,wclip&,hclip&) ENDIF ELSE objc_draw_one(tree%,startob&,depth&,xclip&,yclip&,wclip&,hclip&) ENDIF ENDIF RETURN > PROCEDURE objc_draw_one(tree%,startob&,depth&,xclip&,yclip&,wclip&,hclip&) graf_mouse(m_off&,0) INT{ADD(GCONTRL,2)}=6 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=startob& INT{ADD(GINTIN,2)}=depth& INT{ADD(GINTIN,4)}=xclip& INT{ADD(GINTIN,6)}=yclip& INT{ADD(GINTIN,8)}=wclip& INT{ADD(GINTIN,10)}=hclip& {ADDRIN}=tree% GEMSYS 42 graf_mouse(m_on&,0) RETURN > FUNCTION objc_find(tree%,startob&,depth&,soux&,souy&) ! 43 INT{ADD(GCONTRL,2)}=4 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=startob& INT{ADD(GINTIN,2)}=depth& INT{ADD(GINTIN,4)}=soux& INT{ADD(GINTIN,6)}=souy& {ADDRIN}=tree% GEMSYS 43 RETURN INT{GINTOUT} ENDFUNC > PROCEDURE objc_offset(tree%,obj&,VAR x&,y&) ! 44 INT{ADD(GCONTRL,2)}=1 INT{ADD(GCONTRL,4)}=3 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=obj& {ADDRIN}=tree% GEMSYS 44 x&=INT{ADD(GINTOUT,2)} y&=INT{ADD(GINTOUT,4)} RETURN > PROCEDURE objc_edit(tree%,obj&,char&,idx&,kind&,VAR pos&) ! 46 INT{ADD(GCONTRL,2)}=4 INT{ADD(GCONTRL,4)}=2 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=obj& INT{ADD(GINTIN,2)}=char& INT{ADD(GINTIN,4)}=idx& INT{ADD(GINTIN,6)}=kind& {ADDRIN}=tree% GEMSYS 46 pos&=INT{ADD(GINTOUT,2)} RETURN > PROCEDURE objc_change(adr%,ob&) ! 47 ob_state(adr%,ob&,aes_selected&,NOT BTST(OB_STATE(adr%,ob&),aes_selected&)) redraw_elem(adr%,ob&) RETURN > PROCEDURE objc_change2(adr%,ob&) ! 47 ob_state(adr%,ob&,aes_selected&,NOT BTST(OB_STATE(adr%,ob&),aes_selected&)) redraw_element_fenetre(2,adr%,ob&) RETURN > FUNCTION form_do(fo_dotree%,fo_dostartob&) ! 50 INT{ADD(GCONTRL,2)}=1 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=fo_dostartob& {ADDRIN}=fo_dotree% GEMSYS 50 RETURN INT{GINTOUT} ENDFUNC > PROCEDURE form_dial(flag&,tlx&,tly&,tlw&,tlh&,bigx&,bigy&,bigw&,bigh&) ! 51 INT{ADD(GCONTRL,2)}=9 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=flag& INT{ADD(GINTIN,2)}=tlx& INT{ADD(GINTIN,4)}=tly& INT{ADD(GINTIN,6)}=tlw& INT{ADD(GINTIN,8)}=tlh& INT{ADD(GINTIN,10)}=bigx& INT{ADD(GINTIN,12)}=bigy& INT{ADD(GINTIN,14)}=bigw& INT{ADD(GINTIN,16)}=bigh& GEMSYS 51 RETURN > FUNCTION form_alert(defbttn&,string%) ! 52 INT{ADD(GCONTRL,2)}=1 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=defbttn& {ADDRIN}=string% GEMSYS 52 RETURN INT{GINTOUT} ENDFUNC > FUNCTION form_error(fo_enum&) ! 53 INT{ADD(GCONTRL,2)}=1 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=fo_enum& GEMSYS 53 RETURN 0 ENDFUNC > PROCEDURE form_center(tree%,VAR x&,y&,w&,h&) ! 54 INT{ADD(GCONTRL,2)}=0 INT{ADD(GCONTRL,4)}=5 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 {ADDRIN}=tree% GEMSYS 54 x&=INT{ADD(GINTOUT,2)} y&=INT{ADD(GINTOUT,4)} w&=INT{ADD(GINTOUT,6)} h&=INT{ADD(GINTOUT,8)} RETURN > PROCEDURE graf_rubberbox(rx&,ry&,rminw&,rminh&,VAR ret&,ww&,hh&) ! 70 INT{ADD(GCONTRL,2)}=4 INT{ADD(GCONTRL,4)}=3 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=rx& INT{ADD(GINTIN,2)}=ry& INT{ADD(GINTIN,4)}=rminw& INT{ADD(GINTIN,6)}=rminh& GEMSYS 70 ret&=INT{GINTOUT} ww&=INT{ADD(GINTOUT,2)} hh&=INT{ADD(GINTOUT,4)} RETURN > PROCEDURE graf_dragbox(dw&,dh&,dx&,dy&,dbx&,dby&,dbw&,dbh&,VAR nx&,ny&) ! 71 INT{ADD(GCONTRL,2)}=8 INT{ADD(GCONTRL,4)}=3 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=dw& INT{ADD(GINTIN,2)}=dh& INT{ADD(GINTIN,4)}=dx& INT{ADD(GINTIN,6)}=dy& INT{ADD(GINTIN,8)}=dbx& INT{ADD(GINTIN,10)}=dby& INT{ADD(GINTIN,12)}=dbw& INT{ADD(GINTIN,14)}=dbh& GEMSYS 71 nx&=INT{ADD(GINTOUT,2)} ny&=INT{ADD(GINTOUT,4)} RETURN > PROCEDURE graf_slidebox(slptree%,slparent&,slobject&,slvh&,VAR pos&) ! 76 INT{ADD(GCONTRL,2)}=3 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=slparent& INT{ADD(GINTIN,2)}=slobject& INT{ADD(GINTIN,4)}=slvh& {ADDRIN}=slptree% GEMSYS 76 pos&=INT{GINTOUT} RETURN > FUNCTION graf_handle(VAR wc&,hc&,cw&,ch&) ! 77 INT{ADD(GCONTRL,2)}=0 INT{ADD(GCONTRL,4)}=5 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 GEMSYS 77 wc&=INT{ADD(GINTOUT,2)} hc&=INT{ADD(GINTOUT,4)} cw&=INT{ADD(GINTOUT,6)} ch&=INT{ADD(GINTOUT,8)} RETURN INT{GINTOUT} ENDFUNC > PROCEDURE graf_mouse(gr_monumber&,gr_mofaddr%) ! 78 LOCAL ok! ok!=TRUE IF ((gr_monumber&=m_on&) OR (gr_monumber&=m_off&)) AND magic! ok!=FALSE ENDIF IF ok! INT{ADD(GCONTRL,2)}=1 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=gr_monumber& {ADDRIN}=gr_mofaddr% GEMSYS 78 ENDIF RETURN > PROCEDURE graf_mkstate(VAR global_mx&,global_my&,global_mk&,kbd&) ! 79 INT{ADD(GCONTRL,2)}=0 INT{ADD(GCONTRL,4)}=5 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 GEMSYS 79 global_mx&=INT{ADD(GINTOUT,2)} global_my&=INT{ADD(GINTOUT,4)} global_mk&=INT{ADD(GINTOUT,6)} kbd&=INT{ADD(GINTOUT,8)} RETURN > FUNCTION wind_create(code&,wx&,wy&,ww&,wh&) ! 100 INT{ADD(GCONTRL,2)}=5 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=code& INT{ADD(GINTIN,2)}=wx& INT{ADD(GINTIN,4)}=wy& INT{ADD(GINTIN,6)}=ww& INT{ADD(GINTIN,8)}=wh& GEMSYS 100 RETURN INT{GINTOUT} ENDFUNC > PROCEDURE wind_open(fen&,wx&,wy&,ww&,wh&) ! 101 graf_mouse(m_off&,0) INT{ADD(GCONTRL,2)}=5 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=fen& INT{ADD(GINTIN,2)}=wx& INT{ADD(GINTIN,4)}=wy& INT{ADD(GINTIN,6)}=ww& INT{ADD(GINTIN,8)}=wh& GEMSYS 101 graf_mouse(m_on&,0) RETURN > PROCEDURE wind_close(fen&) ! 102 graf_mouse(m_off&,0) INT{ADD(GCONTRL,2)}=1 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=fen& GEMSYS 102 graf_mouse(m_on&,0) RETURN > PROCEDURE wind_delete(fen&) ! 103 INT{ADD(GCONTRL,2)}=1 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=fen& GEMSYS 103 RETURN > FUNCTION wind_get(fen&,code&,VAR wx&,wy&,ww&,wh&) ! 104 INT{ADD(GCONTRL,2)}=2 INT{ADD(GCONTRL,4)}=5 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=fen& INT{ADD(GINTIN,2)}=code& ' Merci … Fran‡ois LE COAT pour le truc de remplir les deux mots suivants ' avec 0 pour ‚viter les problŠmes sous MiNT INT{ADD(GINTOUT,6)}=0 INT{ADD(GINTOUT,8)}=0 GEMSYS 104 $S&,$S> SELECT code& CASE wf_workxywh&,wf_currxywh&,wf_prevxywh&,wf_fullxywh&,wf_firstxywh&,wf_nextxywh& wx&=INT{ADD(GINTOUT,2)} wy&=INT{ADD(GINTOUT,4)} ww&=INT{ADD(GINTOUT,6)} wh&=INT{ADD(GINTOUT,8)} CASE wf_hslide&,wf_vslide&,wf_top&,wf_hslsize&,wf_vslsize&,wf_winx& wx&=INT{ADD(GINTOUT,2)} ENDSELECT RETURN INT{GINTOUT} ENDFUNC > PROCEDURE wind_set(fen&,code&,wx&,wy&,ww&,wh&) ! 105 IF mode_winx! ~WIND_GET(fen&,code&,wx&,wy&,ww&,wh&) ELSE INT{ADD(GCONTRL,2)}=6 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=fen& INT{ADD(GINTIN,2)}=code& INT{ADD(GINTIN,4)}=wx& INT{ADD(GINTIN,6)}=wy& INT{ADD(GINTIN,8)}=ww& INT{ADD(GINTIN,10)}=wh& GEMSYS 105 ENDIF RETURN > FUNCTION wind_find(soux&,souy&) ! 106 INT{ADD(GCONTRL,2)}=2 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=soux& INT{ADD(GINTIN,2)}=souy& GEMSYS 106 RETURN INT{GINTOUT} ENDFUNC ' > PROCEDURE aes_beg_mctrl IF NOT flag_aes_mctrl! wind_update(beg_mctrl&) flag_aes_mctrl&=TRUE ENDIF RETURN > PROCEDURE aes_end_mctrl IF flag_aes_mctrl! wind_update(end_mctrl&) flag_aes_mctrl!=FALSE ENDIF RETURN > PROCEDURE aes_beg_update IF NOT flag_aes_update! wind_update(beg_update&) flag_aes_update!=TRUE ENDIF RETURN > PROCEDURE aes_end_update IF flag_aes_update! wind_update(end_update&) flag_aes_update!=FALSE ENDIF RETURN > PROCEDURE wind_update(flag&) ! 107 IF mode_winx! ~WIND_UPDATE(flag&) ELSE INT{ADD(GCONTRL,2)}=1 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=flag& GEMSYS 107 ENDIF RETURN ' > PROCEDURE wind_calc(flag&,wk&,wx&,wy&,ww&,wh&,VAR wx1&,wy1&,ww1&,wh1&) ! 108 INT{ADD(GCONTRL,2)}=6 INT{ADD(GCONTRL,4)}=5 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=flag& INT{ADD(GINTIN,2)}=wk& INT{ADD(GINTIN,4)}=wx& INT{ADD(GINTIN,6)}=wy& INT{ADD(GINTIN,8)}=ww& INT{ADD(GINTIN,10)}=wh& GEMSYS 108 wx1&=INT{ADD(GINTOUT,2)} wy1&=INT{ADD(GINTOUT,4)} ww1&=INT{ADD(GINTOUT,6)} wh1&=INT{ADD(GINTOUT,8)} RETURN > FUNCTION rsrc_load(n%) ! 110 INT{ADD(GCONTRL,2)}=0 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=ap_id& {ADDRIN}=n% GEMSYS 110 RETURN INT{GINTOUT} ENDFUNC > FUNCTION rsrc_free ! 111 INT{ADD(GCONTRL,2)}=0 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=ap_id& GEMSYS 111 RETURN INT{GINTOUT} ENDFUNC > FUNCTION rsrc_gaddr(re_gtype&,re_gindex&,VAR re_gaddr%) ! 112 INT{ADD(GCONTRL,2)}=2 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=0 INT{ADD(GCONTRL,8)}=1 INT{GINTIN}=re_gtype& INT{ADD(GINTIN,2)}=re_gindex& GEMSYS 112 re_gaddr%={ADDROUT} RETURN INT{GINTOUT} ENDFUNC > FUNCTION rsrc_saddr(re_gtype&,re_gindex&,VAR re_gaddr%) ! 113 INT{ADD(GCONTRL,2)}=2 INT{ADD(GCONTRL,4)}=1 INT{ADD(GCONTRL,6)}=1 INT{ADD(GCONTRL,8)}=0 INT{GINTIN}=re_gtype& INT{ADD(GINTIN,2)}=re_gindex& GEMSYS 113 re_gaddr%={ADDROUT} RETURN INT{GINTOUT} ENDFUNC > FUNCTION rsrc_obfix(re_obj&,re_gaddr%) ! 114 INT{GINTIN}=re_obj& {ADDRIN}=re_gaddr% GEMSYS 114 RETURN {ADDROUT} ENDFUNC > FUNCTION shel_read(sh_rpcmd%,sh_rptail%) ! 120 {ADDRIN}=sh_rpcmd% {ADD(ADDRIN,4)}=sh_rptail% GEMSYS 120 RETURN {ADDROUT} ENDFUNC > FUNCTION shel_write(sh_wdoex&,sh_wisgr&,sh_wiscr&,sh_wpcmd%,sh_wptail%) ! 121 INT{GINTIN}=sh_wdoex& INT{ADD(GINTIN,2)}=sh_wisgr& INT{ADD(GINTIN,4)}=sh_wiscr& {ADDRIN}=sh_wpcmd% {ADD(ADDRIN,4)}=sh_wptail% GEMSYS 121 RETURN {ADDROUT} ENDFUNC > FUNCTION shel_find(sh_fpbuff%) ! 124 {ADDRIN}=sh_fpbuff% GEMSYS 124 RETURN INT{GINTOUT} ENDFUNC ' ****************************************************************************** > PROCEDURE ob_state(arb%,obj&,bit&,ind!) IF ind! OB_STATE(arb%,obj&)=BSET(OB_STATE(arb%,obj&),bit&) IF bit&=aes_selected& AND BTST(OB_STATE(arb%,obj&),wm_xcrossed&) ob_state(arb%,SUB(obj&,1),aes_crossed&,TRUE) ENDIF ELSE OB_STATE(arb%,obj&)=BCLR(OB_STATE(arb%,obj&),bit&) IF bit&=aes_selected& AND BTST(OB_STATE(arb%,obj&),wm_xcrossed&) ob_state(arb%,SUB(obj&,1),aes_crossed&,FALSE) ENDIF ENDIF RETURN > PROCEDURE ob_flags(arb%,obj&,bit&,ind!) IF ind! OB_FLAGS(arb%,obj&)=BSET(OB_FLAGS(arb%,obj&),bit&) ELSE OB_FLAGS(arb%,obj&)=BCLR(OB_FLAGS(arb%,obj&),bit&) ENDIF RETURN ' ******************* Calcul manuel du clipping pour COPY RASTER *************** > PROCEDURE clip_raster(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x11&,y11&,x21&,y21&,ex&,ey&,ew&,eh&,mod|) LOCAL x12&,y12&,x22&,y22& ' ********* Bien, alors la on r‚alise un CLIPPING … la main, parce-que les ' ********* COPY RASTER se moque totalement des CLIPPINGs VDIs. ' x11&,y11& (Position dans la zone source) ' x12&,y12& (Calculer dans cette proc‚dure) ' x21&,y21& (Position dans la zone destination) ' x22&,y22& (Calculer dans cette proc‚dure) ' ex&,ey&,ew&,eh& (Rectangle d‚limitant la zone copi‚e sur l'‚cran) ' 0,0,xmax&,ymax& (Rectangle zone d‚limitant l'‚cran) ' PremiŠrement, testont si l'ont est dansl'‚cran IF ex&0 AND PRED(ADD(ey&,eh&))>0 IF ex&<0 ADD x11&,-ex& CLR x21& SUB ew&,-ex& ENDIF IF PRED(ADD(ex&,ew&))>xmax& ! ATTENTION on sort de l'‚cran en X … droite x12&=ADD(x11&,SUB(xmax&,ex&)) ! X2 du raster source x22&=xmax& ! X2 du raster destination ELSE ! Ah ! l… tout va bien x12&=PRED(ADD(x11&,ew&)) ! X2 du raster source x22&=PRED(ADD(x21&,ew&)) ! X2 du raster destination ENDIF IF ey&<0 ADD y11&,-ey& CLR y21& SUB eh&,-ey& ENDIF IF PRED(ADD(ey&,eh&))>ymax& ! ATTENTION on sort de l'‚cran en Y en bas y12&=ADD(y11&,SUB(ymax&,ey&)) ! Y2 du raster source y22&=ymax& ! Y2 du raster destination ELSE ! Ah ! l… tout va bien y12&=PRED(ADD(y11&,eh&)) ! Y2 du raster source y22&=PRED(ADD(y21&,eh&)) ! Y2 du raster destination ENDIF $S|,$S> SELECT mod| CASE 0 TO 15 copy_raster_opaque(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x11&,y11&,x12&,y12&,x21&,y21&,x22&,y22&,mod|) CASE 255 copy_raster_transparent(s%,sl&,sh&,sp&,d%,dl&,dh&,dp&,x11&,y11&,x12&,y12&,x21&,y21&,x22&,y22&) ENDSELECT ENDIF RETURN ' ****************************************************************************** ' **** Routine de gestion des fichiers ressouces ‚tendus d'INTERFACE II **** ' ****************************************************************************** > FUNCTION s_exist(n_n%) LOCAL ok& ' Nouvelle fonction de test d'existance d'un fichier d'aprŠs les travaux ' de Pierre THONTAT (Rajha LONE de QUEEN MEKA, merci … lui) et permettant ' la gestion des noms longs des systŠmes multitƒches. $F% ' minuscule(n_n%) ' IF (LEN(CHAR{n_n%})=0) OR (BYTE{n_n%}=0) ! Ligne vide, on repart. RETURN FALSE ELSE ok&=GEMDOS(&H3D,L:n_n%,W:0) ! On ouvre le fichier IF ok&>0 ! si c'est positif ~GEMDOS(&H3E,W:ok&) ! on renferme RETURN TRUE ! et on dit que c'est bon ELSE ! sinon, il y a un problŠme RETURN FALSE ! on dit qu'il n'y a rien ENDIF ENDIF ENDFUNC ' ****************************************************************************** ' ****************** Gestion des modules Import/Export ********************* ' ****************************************************************************** > FUNCTION gestion_des_modules(mode|) LOCAL deb_lis&,lim_lis&,pr_f& LOCAL adr_lis%,i&,mod_sel& LOCAL x&,y&,w&,h&,fin!,evnt&,an! LOCAL mvtx&,mvty& form_center(adr_modules%,x&,y&,w&,h&) form_dial(0,x&,y&,w&,h&,x&,y&,w&,h&) ' videsouris ' pdomain(1) ' pr_f&=@wind_create(0,x&,y&,w&,h&) IF pr_f&>-1 wind_open(pr_f&,x&,y&,w&,h&) ENDIF ' objc_draw(adr_modules%,0,12,x&,y&,w&,h&,-1) graf_mouse(fleche&,0) $S|,$S> SELECT mode| CASE 0 adr_lis%=les_modules% lim_lis&=modules_de_sauvegarde& ABSOLUTE deb_lis&,*debut_liste_module& ABSOLUTE mod_sel&,*select_module& CASE 1 adr_lis%=les_imports% lim_lis&=modules_d_importation& ABSOLUTE deb_lis&,*debut_liste_import& ABSOLUTE mod_sel&,*select_import& CASE 2 adr_lis%=les_outils% lim_lis&=modules_outils& ABSOLUTE deb_lis&,*debut_liste_outils& ABSOLUTE mod_sel&,*select_outils& ENDSELECT fin!=FALSE an!=FALSE DO evnt&=@xform_do(&X110011,adr_modules%,0) IF BTST(evnt&,1) ! EVENEMENT DE CLIC SOURIS $S&,$S> SELECT objet& CASE drivzero& IF NOT BTST(OB_STATE(adr_modules%,objet&),aes_disable&) objc_change(adr_modules%,objet&) CLR deb_lis& ecrire_les_modules(TRUE,adr_lis%,deb_lis&,lim_lis&) position_curseur_popup(adr_modules%,drivpere&,drivfils&,deb_lis&,lim_lis&,TRUE) videsouris ENDIF CASE drivhaut& IF NOT (BTST(OB_STATE(adr_modules%,objet&),aes_disable&)) objc_change(adr_modules%,objet&) IF deb_lis&>0 DEC deb_lis& position_curseur_popup(adr_modules%,drivpere&,drivfils&,deb_lis&,lim_lis&,TRUE) ecrire_les_modules(TRUE,adr_lis%,deb_lis&,lim_lis&) ENDIF ENDIF CASE drivbas& IF NOT (BTST(OB_STATE(adr_modules%,objet&),aes_disable&)) objc_change(adr_modules%,objet&) IF deb_lis&mvty&) deb_lis&=-deb_lis&*(deb_lis&=>0 AND deb_lis&<=SUB(lim_lis&,10))+0*(deb_lis&<0)-SUB(lim_lis&,10)*(deb_lis&>SUB(lim_lis&,10)) ecrire_les_modules(TRUE,adr_lis%,deb_lis&,lim_lis&) position_curseur_popup(adr_modules%,drivpere&,drivfils&,deb_lis&,lim_lis&,TRUE) videsouris CASE bdrivfil& IF NOT BTST(OB_STATE(adr_modules%,objet&),aes_disable&) deplace_curseur_popup(adr_modules%,drivpere&,drivfils&,mode|) objc_change(adr_modules%,objet&) ENDIF CASE drivannu& videsouris objc_change(adr_modules%,objet&) an!=TRUE FOR i&=driv0& TO driv1& IF BTST(OB_STATE(adr_modules%,i&),aes_selected&) ob_state(adr_modules%,i&,aes_selected&,FALSE) mod_sel&=i& i&=driv1& ENDIF NEXT i& fin!=TRUE CASE drivok& videsouris objc_change(adr_modules%,objet&) FOR i&=driv0& TO driv1& IF BTST(OB_STATE(adr_modules%,i&),aes_selected&) ob_state(adr_modules%,i&,aes_selected&,FALSE) mod_sel&=i& i&=driv1& ENDIF NEXT i& fin!=TRUE ENDSELECT CLR evnt& ENDIF IF BTST(evnt&,0) ! EVENEMENT CLAVIER FOR i&=driv0& TO driv1& IF BTST(OB_STATE(adr_modules%,i&),aes_selected&) apoi&=i& i&=driv1& ENDIF NEXT i& IF key&=&H720D OR key&=&H1C0D ' RETRUN ou ENTER videsouris ob_state(adr_modules%,drivok&,aes_selected&,FALSE) FOR i&=driv0& TO driv1& IF BTST(OB_STATE(adr_modules%,i&),aes_selected&) ob_state(adr_modules%,i&,aes_selected&,FALSE) mod_sel&=i& i&=driv1& ENDIF NEXT i& fin!=TRUE ELSE IF key&=&H11B ' ESC videsouris ob_state(adr_modules%,drivannu&,aes_selected&,FALSE) an!=TRUE FOR i&=driv0& TO driv1& IF BTST(OB_STATE(adr_modules%,i&),aes_selected&) ob_state(adr_modules%,i&,aes_selected&,FALSE) mod_sel&=i& i&=driv1& ENDIF NEXT i& fin!=TRUE ELSE IF SHR&(key&,8)=&H50 ' Curseur vers le bas IF apoi&driv0& ob_state(adr_modules%,apoi&,aes_selected&,FALSE) redraw_elem(adr_modules%,apoi&) DEC apoi& ob_state(adr_modules%,apoi&,aes_selected&,TRUE) redraw_elem(adr_modules%,apoi&) ELSE IF deb_lis&>0 objc_change(adr_modules%,drivhaut&) DEC deb_lis& position_curseur_popup(adr_modules%,drivpere&,drivfils&,deb_lis&,lim_lis&,TRUE) ecrire_les_modules(TRUE,adr_lis%,deb_lis&,lim_lis&) objc_change(adr_modules%,drivhaut&) ENDIF ENDIF CLR evnt& ENDIF LOOP UNTIL fin! videsouris form_dial(3,x&,y&,w&,h&,x&,y&,w&,h&) ' IF pr_f&>-1 wind_close(pr_f&) wind_delete(pr_f&) ENDIF ' RETURN an! ' ENDFUNC ' Importation d'objets 3D / 2D > PROCEDURE importation_d_objets LOCAL objet&,ann!,ret% LOCAL anc_obj&,anc_pri& LOCAL anc_obj2&,anc_pri2& ' position_curseur_popup(adr_modules%,drivpere&,drivfils&,debut_liste_import&,modules_d_importation&,FALSE) ecrire_les_modules(FALSE,les_imports%,debut_liste_import&,modules_d_importation&) ob_state(adr_modules%,select_import&,aes_selected&,TRUE) ann!=@gestion_des_modules(1) IF NOT ann! videsouris objet&=select_import& ' ********** Forcer le chemin systŠme des modules import/export ************ CHAR{disque%}=CHAR{disque_systeme%}+CHR$(0) CHAR{path%}=CHAR{path_systeme%}+"modules\"+CHR$(0) chemin_en_cours(disque%,path%) ' ecrire_transfert(FALSE) CHAR{commande%}=CHAR{disque%}+CHAR{path%}+CHAR{{OB_SPEC(adr_modules%,objet&)}}+".drv"+CHR$(0) minuscule(commande%) ' ************* Premier lancement du module pour annalyser le fichier CHAR{mem_num%}=CHR$(0) ret%=GEMDOS(&H4B,shw_load_go&,L:commande%,L:mem_num%,L:mem_num%) garbage_collector ' IF ret%<>0 les_messages_d_erreur(ret%) ELSE anc_obj&=nombre_d_objets& anc_pri&=primitive& IF @lire_transfert_retour ! Analyse de la r‚ponse anc_obj2&=nombre_d_objets& anc_pri2&=primitive& nombre_d_objets&=anc_obj& primitive&=anc_pri& ecrire_transfert(TRUE) nombre_d_objets&=anc_obj2& primitive&=anc_pri2& CHAR{commande%}=CHAR{disque%}+CHAR{path%}+CHAR{{OB_SPEC(adr_modules%,objet&)}}+".drv"+CHR$(0) minuscule(commande%) ' ************* deuxiŠme lancement du module pour charger le fichier CHAR{mem_num%}=CHR$(0) ret%=GEMDOS(&H4B,shw_load_go&,L:commande%,L:mem_num%,L:mem_num%) garbage_collector ' objet_actif&=PRED(nombre_d_objets&) redimention!=FALSE tri_3d!=FALSE trace_3d_plein!=FALSE tri_2d!=FALSE tri_fi!=FALSE CLR debut_texture&,debut_couleur& scene_remplie refaire_toutes_les_normales(anc_nbo&,PRED(nombre_d_objets&),TRUE,TRUE) ENDIF ENDIF redessin_deja_fait!=FALSE elimination_des_temporaires ' ************* Retrouver le chemin systŠme de EB Model 3 ****************** chemin_systeme ENDIF ' redraw_force(idx_info&,idx_animation&) RETURN ' G‚n‚ration de scripts ASCII > PROCEDURE generation_de_scripts(ind!) LOCAL x&,y&,w&,h&,objet&,fin!,ann!,apoi&,i&,ret%,base%,l% ' redimention!=FALSE changement_de_taille_transfert_et_ttf IF ind! ann!=FALSE ELSE position_curseur_popup(adr_modules%,drivpere&,drivfils&,debut_liste_module&,modules_de_sauvegarde&,FALSE) ecrire_les_modules(FALSE,les_modules%,debut_liste_module&,modules_de_sauvegarde&) ob_state(adr_modules%,select_module&,aes_selected&,TRUE) ann!=@gestion_des_modules(0) ENDIF IF NOT ann! videsouris objet&=select_module& ' ********** Forcer le chemin systŠme des modules import/export ************ CHAR{disque%}=CHAR{disque_systeme%}+CHR$(0) CHAR{path%}=CHAR{path_systeme%}+"modules\"+CHR$(0) chemin_en_cours(disque%,path%) ' ecrire_transfert(ind!) IF ind! CHAR{commande%}=CHAR{disque%}+CHAR{path%}+"sauvpov3.drv"+CHR$(0) IF NOT @s_exist(commande%) CHAR{commande%}=CHAR{disque%}+CHAR{path%}+"sauvshar.drv"+CHR$(0) ENDIF ELSE CHAR{commande%}=CHAR{disque%}+CHAR{path%}+CHAR{{OB_SPEC(adr_modules%,objet&)}}+".drv"+CHR$(0) ENDIF minuscule(commande%) CHAR{mem_num%}=CHR$(0) ret%=GEMDOS(&H4B,shw_load_go&,L:commande%,L:mem_num%,L:mem_num%) garbage_collector ' IF ret%<>0 les_messages_d_erreur(ret%) ELSE ' ************************************************************************** CHAR{nom_divers%}=LEFT$(CHAR{nom_divers%},INSTR(CHAR{nom_divers%},"."))+"pov"+CHR$(0) minuscule(nom_divers%) CHAR{{OB_SPEC(adr_lanceur%,povscrip&)}}=LEFT$(CHAR{nom_divers%}+" ",12) CHAR{masque%}="ebs"+CHR$(0) extend(nom_divers%,masque%,nom_divers%) CHAR{nom_en_cours%}=CHAR{nom_divers%} minuscule(nom_en_cours%) CHAR{titre_en_cours%}=LEFT$(CHAR{{OB_SPEC(adr_parametres%,cheebs&)}},SUB(LEN(CHAR{{OB_SPEC(adr_parametres%,cheebs&)}}),5))+CHAR{nom_divers%}+CHR$(0) minuscule(titre_en_cours%) CHAR{{OB_SPEC(adr_fenetre%,fenvue02&)}}=CHAR{titre_en_cours%} redraw_element_fenetre(48,adr_fenetre%,fenvue02&) ENDIF elimination_des_temporaires ' ************* Retrouver le chemin systŠme de EB Model 3 ****************** chemin_systeme ' ENDIF redraw_force(idx_info&,idx_animation&) RETURN ' Gestion des outils en modules externes > PROCEDURE gestion_des_outils_externes LOCAL x&,y&,w&,h&,objet&,fin!,ann!,apoi&,i&,tail% LOCAL nbobje&,nbprim&,ret%,redessin_force! fermeture_des_fenetres_temporaire redimention!=FALSE changement_de_taille_transfert_et_ttf position_curseur_popup(adr_modules%,drivpere&,drivfils&,debut_liste_outils&,modules_outils&,FALSE) ecrire_les_modules(FALSE,les_outils%,debut_liste_outils&,modules_outils&) ob_state(adr_modules%,select_outils&,aes_selected&,TRUE) apoi&=select_outils& ann!=@gestion_des_modules(2) IF NOT ann! griser_barre_de_menu(TRUE) videsouris objet&=select_outils& ' ************* Forcer le chemin systŠme des outils externes *************** CHAR{disque%}=CHAR{disque_systeme%}+CHR$(0) CHAR{path%}=CHAR{path_systeme%}+"outils\"+CHR$(0) chemin_en_cours(disque%,path%) ' ecrire_transfert(FALSE) CHAR{commande%}=CHAR{disque%}+CHAR{path%}+CHAR{{OB_SPEC(adr_modules%,objet&)}}+".drv"+CHR$(0) minuscule(commande%) ' ************* Lancement du module d'outil externe ************************ CHAR{mem_num%}=CHR$(0) ret%=GEMDOS(&H4B,shw_load_go&,L:commande%,L:mem_num%,L:mem_num%) garbage_collector ' IF ret%<>0 les_messages_d_erreur(ret%) ELSE ' CHAR{mem_che%}=CHAR{eb_temp%}+"\eb_model.shm"+CHR$(0) IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} INPUT #1,redessin_force! CLOSE #1 ELSE redessin_force!=TRUE ENDIF CLR debut_texture&,debut_couleur& IF redessin_force! redimention!=FALSE tri_3d!=FALSE trace_3d_plein!=FALSE tri_2d!=FALSE tri_fi!=FALSE scene_remplie redessin_deja_fait!=FALSE ENDIF ENDIF elimination_des_temporaires ' ************* Retrouver le chemin systŠme de EB Model 3 **************** chemin_systeme ' griser_barre_de_menu(FALSE) ENDIF reouverture_des_fenetres redraw_force(idx_info&,idx_animation&) RETURN ' Lancer les modules externes > PROCEDURE generateur_exterieur(t|) ! (EB_MONTS/EB_TOURS) LOCAL x&,y&,w&,h&,objet&,fin!,ann!,apoi&,i&,tail% LOCAL nbobje&,nbprim&,ret%,uni%,base% LOCAL anc_nbo&,anc_pri&,page% LOCAL nbp_courbe%,num_ext%,taille%,extr! LOCAL termine!,chunk&,retour_ok! ' fermeture_des_fenetres_temporaire griser_barre_de_menu(TRUE) redimention!=FALSE changement_de_taille_transfert_et_ttf videsouris ' ************* Forcer le chemin systŠme des modules externes **************** CHAR{disque%}=CHAR{disque_systeme%}+CHR$(0) CHAR{path%}=CHAR{path_systeme%}+"externes\"+CHR$(0) chemin_en_cours(disque%,path%) ' ecrire_transfert(FALSE) $S|,$S< SELECT t| CASE 0 CHAR{commande%}=CHAR{disque%}+CHAR{path%}+"eb_monts.prg"+CHR$(0) CASE 1 CHAR{commande%}=CHAR{disque%}+CHAR{path%}+"eb_tours.prg"+CHR$(0) ENDSELECT minuscule(commande%) ' ************* Premier lancement du module pour annalyser le fichier CHAR{mem_num%}=CHR$(0) ret%=GEMDOS(&H4B,shw_load_go&,L:commande%,L:mem_num%,L:mem_num%) ' ' ************* Forcer le chemin systŠme des modules externes **************** CHAR{disque%}=CHAR{disque_systeme%}+CHR$(0) CHAR{path%}=CHAR{path_systeme%}+"externes\"+CHR$(0) chemin_en_cours(disque%,path%) garbage_collector ' IF ret%<>0 les_messages_d_erreur(ret%) ELSE ' ************************* Analyse de la reponse ************************* CLR nbobje&,nbprim& retour_ok!=FALSE CHAR{mem_che%}=CHAR{eb_temp%}+"\eb_model.shm"+CHR$(0) minuscule(mem_che%) IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} IF LOF(#1) DO membfill(mem_che%,512,0) termine!=@lire_une_ligne(mem_che%) EXIT IF LEFT$(CHAR{mem_che%},3)="EOF" IF LEN(CHAR{mem_che%})>1 chunk&=VAL(LEFT$(CHAR{mem_che%},3)) SELECT chunk& CASE 0 enleve_code(mem_che%) nbobje&=VAL(CHAR{mem_che%}) CASE 1 enleve_code(mem_che%) nbprim&=VAL(CHAR{mem_che%}) CASE 2 IF (nbprim&>0) OR (nbobje&=-2) enleve_code(mem_che%) tail%=VAL(CHAR{mem_che%}) IF nbobje&=-2 uni%=@adresse_objet(objet_actif&) libere(ADD(objet%,SHL(INT{uni%},2))) {ADD(objet%,SHL(INT{uni%},2))}=@prendre(tail%,TRUE,3) ELSE {ADD(objet%,SHL(primitive&,2))}=@prendre(tail%,TRUE,3) ENDIF retour_ok!=TRUE ENDIF CASE 3 retour_ok!=FALSE IF (nbprim&>0) OR (nbobje&=-2) enleve_code(mem_che%) nbp_courbe%=VAL(CHAR{mem_che%}) extr!=FALSE IF nbobje&=-2 uni%=@adresse_objet(objet_actif&) num_ext%=CARD{ADD(uni%,offset_force_blob&)} libere(ADD(courbe_extrude%,SHL(num_ext%,2))) ELSE num_ext%=nombre_extrude% extr!=TRUE ENDIF taille%=ADD(ADD(2,SHL(nbp_courbe%,2)),4) {ADD(courbe_extrude%,SHL(num_ext%,2))}=@prendre(taille%,TRUE,3) retour_ok!=TRUE ENDIF ENDSELECT ENDIF EXIT IF termine! LOOP ENDIF CLOSE #1 ENDIF ' IF retour_ok! ecrire_transfert(TRUE) anc_nbo&=nombre_d_objets& anc_pri&=primitive& IF nbobje&<>-2 ! Si l'on ne modifie pas un contour existant ADD primitive&,nbprim& ADD nombre_d_objets&,nbprim& ENDIF IF nombre_d_objets&=>limite_des_objets& ~@afficher_alerte(adr_depasse%) CHAR{coord_polygon%}="[1][ "+STR$(nombre_d_objets&)+" objets demand‚s | "+STR$(nombre_d_objets&)+" objects need ][ Ok ]"+CHR$(0) ~@afficher_alerte(coord_polygon%) nombre_d_objets&=anc_nbo& primitive&=anc_pri& ELSE ' ************* Forcer le chemin systŠme des modules externes **************** CHAR{disque%}=CHAR{disque_systeme%}+CHR$(0) CHAR{path%}=CHAR{path_systeme%}+"externes\"+CHR$(0) chemin_en_cours(disque%,path%) ' $S|,$S< SELECT t| CASE 0 CHAR{commande%}=CHAR{disque%}+CHAR{path%}+"eb_monts.prg"+CHR$(0) CASE 1 CHAR{commande%}=CHAR{disque%}+CHAR{path%}+"eb_tours.prg"+CHR$(0) ENDSELECT minuscule(commande%) ' ************* deuxiŠme lancement du module pour charger le fichier CHAR{mem_num%}=CHR$(0) ret%=GEMDOS(&H4B,shw_load_go&,L:commande%,L:mem_num%,L:mem_num%) ' ' ************* Forcer le chemin systŠme des modules externes **************** CHAR{disque%}=CHAR{disque_systeme%}+CHR$(0) CHAR{path%}=CHAR{path_systeme%}+"externes\"+CHR$(0) chemin_en_cours(disque%,path%) garbage_collector ' IF extr! INC nombre_extrude% ENDIF ' IF nbobje&<>-2 ! Si l'on ne modifie pas un contour existant objet_actif&=PRED(nombre_d_objets&) CLR debut_texture&,debut_couleur& scene_remplie ENDIF redimention!=FALSE tri_3d!=FALSE trace_3d_plein!=FALSE tri_2d!=FALSE tri_fi!=FALSE redessin_deja_fait!=FALSE refaire_toutes_les_normales(objet_actif&,objet_actif&,TRUE,TRUE) ENDIF ELSE CLOSE #1 ENDIF ENDIF elimination_des_temporaires ' ************* Retrouver le chemin systŠme de EB Model 3 ******************** chemin_systeme ' griser_barre_de_menu(FALSE) reouverture_des_fenetres IF nbobje&<>-2 redessin_deja_fait!=FALSE ENDIF RETURN ' ------------------------------------------------------------------------------ ' ---- Pour gagner de la place, la gestion des textures en OVL ---- ' ------------------------------------------------------------------------------ > PROCEDURE lancement_gestion_texture LOCAL ret%,errovl& ' fermeture_des_fenetres_temporaire griser_barre_de_menu(TRUE) redimention!=FALSE changement_de_taille_transfert_et_ttf videsouris ' ************* Forcer le chemin systŠme au cas ou... *********************** chemin_systeme ' ecrire_transfert(FALSE) ' IF haute_resolution! CHAR{commande%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"texbasse.ovl"+CHR$(0) errovl&=997 ' CHAR{commande%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"texhaute.ovl"+CHR$(0) ' errovl&=996 ELSE CHAR{commande%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"texbasse.ovl"+CHR$(0) errovl&=997 ENDIF minuscule(commande%) IF @s_exist(commande%) ' ************* Premier lancement du module pour annalyser le fichier CHAR{mem_num%}=CHR$(0) ret%=GEMDOS(&H4B,shw_load_go&,L:commande%,L:mem_num%,L:mem_num%) ELSE les_messages_d_erreur(errovl&) ENDIF ' garbage_collector ' ************* Retrouver le chemin systŠme de EB Model 3 ******************** chemin_systeme ' griser_barre_de_menu(FALSE) reouverture_des_fenetres ' RETURN ' ------------------------------------------------------------------------------ > PROCEDURE modification_d_un_contour CHAR{mem_che%}=CHAR{disque_systeme%}+CHAR{path_systeme%}+"externes\a_faire.mvt"+CHR$(0) minuscule(mem_che%) OPEN "o",#1,CHAR{mem_che%} PRINT #1,objet_actif& CLOSE #1 generateur_exterieur(1) RETURN ' ------------------------------------------------------------------------------ > PROCEDURE griser_barre_de_menu(oui!) ob_state(adr_menu%,minfo&,aes_disable&,oui!) ob_state(adr_menu%,mentitr1&,aes_disable&,oui!) ob_state(adr_menu%,mentitr2&,aes_disable&,oui!) ob_state(adr_menu%,mentitr3&,aes_disable&,oui!) ob_state(adr_menu%,mentitr4&,aes_disable&,oui!) ob_state(adr_menu%,mentitr5&,aes_disable&,oui!) menu_bar(adr_menu%,1) ! R‚afficher de la barre de menu RETURN > PROCEDURE ecrire_transfert(dial!) ' charger_langage ' OPEN "o",#1,CHAR{eb_temp%}+"\eb_model.shm" PRINT #1,"# -----------------------------------------------------------------" PRINT #1,"# EB_MODEL de BARANGER Emmanuel Version "+CHAR{version%} PRINT #1,"# -----------------------------------------------------------------" PRINT #1,"# -- Protocole de dialogue entre EB Model 3 et les modules. --" PRINT #1,"# -- Ce fichier ne doit jamais ˆtre pr‚sent car effac‚ par --" PRINT #1,"# -- EB Model 3 aprŠs cr‚ation et utilisation --" PRINT #1,"# -----------------------------------------------------------------" PRINT #1,"# --------- Num‚ro de station GEM/VDI -----------------------------" PRINT #1,"000 ";vdihandle% PRINT #1,"# --------- Station GEM/VDI ---------------------------------------" PRINT #1,"001 ";station% PRINT #1,"002 ";etendue% PRINT #1,"# --------- Quelques infos sur la machine de travail --------------" PRINT #1,"003 ";machine| PRINT #1,"004 ";pro| PRINT #1,"005 ";copro| PRINT #1,"006 ";video| PRINT #1,"# --------- Les drapeaux ------------------------------------------" PRINT #1,"007 ";dial! PRINT #1,"008 ";backup! PRINT #1,"009 ";texture_avant! PRINT #1,"010 ";preview_texture! PRINT #1,"011 ";camera_visible! PRINT #1,"# --------- Nombre de primitives secondaire+13 --------------------" PRINT #1,"012 ";primitive& PRINT #1,"# --------- Nombre d'objets de la scŠne ---------------------------" PRINT #1,"013 ";nombre_d_objets& PRINT #1,"014 ";limite_des_objets& PRINT #1,"015 ";lecteur% PRINT #1,"# --------- Les zones de m‚moire pour les arbres utiles -----------" PRINT #1,"016 ";ress% PRINT #1,"017 ";les_alertes% PRINT #1,"# --------- Zone de m‚moire de d‚finition des textures et couleurs " PRINT #1,"018 ";include_texture% PRINT #1,"019 ";include_pigment% PRINT #1,"020 ";include_normal% PRINT #1,"021 ";include_finish% PRINT #1,"022 ";include_couleur% PRINT #1,"023 ";include_interior% PRINT #1,"024 ";include_color_map% PRINT #1,"025 ";include_texture_map% PRINT #1,"026 ";include_pigment_map% PRINT #1,"027 ";include_normal_map% PRINT #1,"028 ";include_warps% PRINT #1,"029 ";include_projection% PRINT #1,"030 ";zone_color_map% PRINT #1,"031 ";zone_slop_map% PRINT #1,"032 ";zone_projection% PRINT #1,"# --------- Et le nombre total d'‚l‚ments de chaque zone ----------" PRINT #1,"033 ";total_texture& PRINT #1,"034 ";total_pigment& PRINT #1,"035 ";total_normal& PRINT #1,"036 ";total_finish& PRINT #1,"037 ";total_couleur& PRINT #1,"038 ";total_interior& PRINT #1,"039 ";total_texture_map& PRINT #1,"040 ";total_pigment_map& PRINT #1,"041 ";total_normal_map& PRINT #1,"042 ";total_warps& PRINT #1,"043 ";total_projection& PRINT #1,"044 ";total_color_map& PRINT #1,"045 ";total_slop_map& PRINT #1,"# --------- Zone de m‚moire des indexs de fenˆtres ----------------" PRINT #1,"046 ";hwind% PRINT #1,"# --------- Les zones de m‚moire pour la scŠne --------------------" PRINT #1,"047 ";univers% PRINT #1,"048 ";texture% PRINT #1,"049 ";pigment% PRINT #1,"050 ";normal% PRINT #1,"051 ";finish% PRINT #1,"052 ";interior% PRINT #1,"053 ";camera% PRINT #1,"054 ";source% PRINT #1,"055 ";atmosphere% PRINT #1,"056 ";defaut_texture% PRINT #1,"057 ";defaut_pigment% PRINT #1,"058 ";defaut_normal% PRINT #1,"059 ";defaut_finish% PRINT #1,"060 ";defaut_interior% PRINT #1,"061 ";objet% PRINT #1,"062 ";back_fond% PRINT #1,"063 ";bit_smooth| PRINT #1,"064 ";bit_in_out| PRINT #1,"065 ";coord_polygon% PRINT #1,"066 ";commande% PRINT #1,"067 ";precalcul% PRINT #1,"068 ";matrice% PRINT #1,"069 ";matrice_cam% PRINT #1,"070 ";zoo% PRINT #1,"071 ";came_pyra% PRINT #1,"072 ";spot_cone% PRINT #1,"073 ";nom_calque% PRINT #1,"074 ";edge% PRINT #1,"075 ";ttf% PRINT #1,"# --------- Les zone de m‚moire pour les noms de fichiers ---------" PRINT #1,"076 ";mem_nom% PRINT #1,"077 ";nom_en_cours% PRINT #1,"078 ";nom_divers% PRINT #1,"079 ";nom_mouvement% PRINT #1,"080 ";masque% PRINT #1,"081 ";msq% PRINT #1,"082 ";mem_che% PRINT #1,"083 ";disque% PRINT #1,"084 ";path% PRINT #1,"# --------- Les autres variables ----------------------------------" PRINT #1,"085 ";focale& PRINT #1,"086 ";transfert% PRINT #1,"087 ";version% PRINT #1,"088 ";date% PRINT #1,"089 ";smooth! PRINT #1,"090 ";primitives_simples! PRINT #1,"# --------- Num‚ro d'index des primitives de bases ----------------" PRINT #1,"091 ";primitive_segment& PRINT #1,"092 ";primitive_boite& PRINT #1,"093 ";primitive_sphere& PRINT #1,"094 ";primitive_prisme& PRINT #1,"095 ";primitive_triangle& PRINT #1,"096 ";primitive_tronc_de_cone& PRINT #1,"097 ";primitive_hemisphere& PRINT #1,"098 ";primitive_boite_arrondie& PRINT #1,"099 ";primitive_disque& PRINT #1,"100 ";primitive_pyramide& PRINT #1,"101 ";primitive_colonne& PRINT #1,"102 ";primitive_plan& PRINT #1,"103 ";primitive_tore& PRINT #1,"# --------- Les tailles importantes des zones de m‚moire ----------" PRINT #1,"104 ";taille_objet& PRINT #1,"105 ";taille_texture& PRINT #1,"106 ";taille_pigment& PRINT #1,"107 ";taille_normal& PRINT #1,"108 ";taille_finish& PRINT #1,"109 ";taille_interior& PRINT #1,"110 ";taille_couleur& PRINT #1,"111 ";taille_camera& PRINT #1,"112 ";taille_atmosphere& PRINT #1,"113 ";taille_color_map& PRINT #1,"114 ";taille_slop_map& PRINT #1,"115 ";taille_source& PRINT #1,"116 ";taille_projection& PRINT #1,"# --------- Nombre de sources de lumiŠre par d‚faut ---------------" PRINT #1,"117 ";nombre_de_source& PRINT #1,"# --------- Quelques offsets et tailles importants ----------------" PRINT #1,"118 ";offset_couleur& PRINT #1,"119 ";offset_csg_type& PRINT #1,"120 ";offset_relation_csg& PRINT #1,"121 ";offset_nom_objet& PRINT #1,"122 ";offset_calque& PRINT #1,"123 ";offset_rapport& PRINT #1,"124 ";offset_nom_montagne& PRINT #1,"125 ";offset_force_blob& PRINT #1,"# --------- Offset de d‚calage des drapeaux sp‚ciaux --------------" PRINT #1,"126 ";offset_drapeau0& PRINT #1,"127 ";offset_drapeau1& PRINT #1,"# --------- Les bits utiles au premier octet ----------------------" PRINT #1,"128 ";bit_ombre| PRINT #1,"129 ";bit_masque| PRINT #1,"130 ";bit_ouvert| PRINT #1,"131 ";bit_biblio| PRINT #1,"132 ";bit_bicubic| PRINT #1,"133 ";bit_montagne| PRINT #1,"134 ";bit_facette| PRINT #1,"# --------- Les bits utiles au deuxiŠme octet ---------------------" PRINT #1,"135 ";bit_quadric| PRINT #1,"136 ";bit_quartic| PRINT #1,"137 ";bit_4d_julia| PRINT #1,"138 ";bit_lathe| PRINT #1,"139 ";bit_sor| PRINT #1,"140 ";bit_prisme| PRINT #1,"141 ";bit_texte| PRINT #1,"142 ";offset_defaut& PRINT #1,"143 ";bit_defaut| PRINT #1,"# --------- Les bits utiles a l'offset pr‚c‚dent ------------------" PRINT #1,"144 ";bit_spot| PRINT #1,"145 ";bit_surface| PRINT #1,"146 ";bit_objet_lie| PRINT #1,"147 ";bit_cylindre| PRINT #1,"148 ";bit_attenuation| PRINT #1,"149 ";bit_shadowless| PRINT #1,"150 ";bit_atmosphere| PRINT #1,"# --------- Drapeau des vues --------------------------------------" PRINT #1,"151 ";vue_de_face| PRINT #1,"152 ";vue_de_dos| PRINT #1,"153 ";vue_de_gauche| PRINT #1,"154 ";vue_de_droite| PRINT #1,"155 ";vue_de_dessus| PRINT #1,"156 ";vue_de_dessous| PRINT #1,"157 ";vue_en_3d| PRINT #1,"# --------- Les adresses des boŒtes d'alertes ---------------------" PRINT #1,"158 ";adr_quitter% PRINT #1,"159 ";adr_memoire% PRINT #1,"160 ";adr_notrouve% PRINT #1,"161 ";adr_danger% PRINT #1,"162 ";adr_limite% PRINT #1,"163 ";adr_mauvaise_version% PRINT #1,"164 ";adr_nofenetre% PRINT #1,"165 ";adr_existe% PRINT #1,"166 ";adr_vide% PRINT #1,"167 ";adr_movl1% PRINT #1,"168 ";adr_racctrou% PRINT #1,"169 ";adr_ficinclu% PRINT #1,"170 ";adr_no3d2% PRINT #1,"171 ";adr_pov_def% PRINT #1,"172 ";adr_nomimage% PRINT #1,"173 ";adr_depasse% PRINT #1,"174 ";adr_imprimante% PRINT #1,"175 ";adr_memoire_visu% PRINT #1,"# --------- L'objet actif de la scŠne en cours --------------------" PRINT #1,"176 ";objet_actif& PRINT #1,"# --------- Quelques zones vides pour plus tard -------------------" PRINT #1,"177 ";a_charger% PRINT #1,"178 ";tracer_handle& PRINT #1,"179 ";tracer_fnct% PRINT #1,"# --------- Adresses des lignes de commentaires -------------------" PRINT #1,"180 ";ligne_comment1% PRINT #1,"181 ";ligne_comment2% PRINT #1,"182 ";ligne_comment3% PRINT #1,"183 ";ligne_comment4% PRINT #1,"184 ";ligne_comment5% PRINT #1,"# --------- Routine de gestion des ressources ‚tendus -------------" PRINT #1,"185 ";r_resident! PRINT #1,"186 ";f_init% PRINT #1,"187 ";f_scalc% PRINT #1,"# --------- Adresse et drapeau pour le fond des ressources --------" PRINT #1,"188 ";fond% PRINT #1,"189 ";fond_img! PRINT #1,"190 ";largeur_fond% PRINT #1,"191 ";hauteur_fond% PRINT #1,"# --------- Adresses et indexs utiles pour les modules ------------" PRINT #1,"192 ";adr_camera% PRINT #1,"193 ";adr_lanceur% PRINT #1,"194 ";adr_parametres% PRINT #1,"195 ";adr_divers% PRINT #1,"196 ";che3d2& PRINT #1,"197 ";chepov& PRINT #1,"198 ";cheinc& PRINT #1,"199 ";lin31& PRINT #1,"200 ";lin32& PRINT #1,"201 ";povscrip& PRINT #1,"202 ";posangle& PRINT #1,"203 ";lin19& PRINT #1,"204 ";cheebs& PRINT #1,"# -----------------------------------------------------------------" PRINT #1,"205 ";taille_media& PRINT #1,"206 ";total_media& PRINT #1,"207 ";taille_scattering& PRINT #1,"208 ";total_scattering& PRINT #1,"209 ";taille_density& PRINT #1,"210 ";total_density& PRINT #1,"211 ";include_slop_map% PRINT #1,"212 ";include_media% PRINT #1,"213 ";include_scattering% PRINT #1,"214 ";include_density% PRINT #1,"215 ";include_density_map% PRINT #1,"# --------- Nombre de bicubic et adresse m‚moire ------------------" PRINT #1,"216 ";nombre_de_carreaux% PRINT #1,"217 ";pt_control% PRINT #1,"# --------- Nombre d'objets LATHE/SOR/PRISM et adresse m‚moire ----" PRINT #1,"218 ";nombre_extrude% PRINT #1,"219 ";courbe_extrude% PRINT #1,"# --------- Nombre de liste de CSG et adresse m‚moire -------------" PRINT #1,"220 ";nombre_de_csg% PRINT #1,"221 ";liste_csg% PRINT #1,"# --------- Num‚ro du calque actif --------------------------------" PRINT #1,"222 ";calque_actif| PRINT #1,"# --------- Disque systeme ----------------------------------------" PRINT #1,"223";disque_systeme% PRINT #1,"# --------- Chemin systeme ----------------------------------------" PRINT #1,"224 ";path_systeme% PRINT #1,"# --------- Taille de transfert pour les CSG ----------------------" PRINT #1,"225 ";taille_transfert% PRINT #1,"# --------- Zone pour les vro_copy --------------------------------" PRINT #1,"226 ";mfdb% PRINT #1,"# --------- Zone pour les vro_copy --------------------------------" PRINT #1,"227 ";mfbd% PRINT #1,"# --------- Mode entrelac‚ oui/non --------------------------------" PRINT #1,"228 ";mode_entrelace! PRINT #1,"# --------- Mode TRUE COLOR oui/non -------------------------------" PRINT #1,"229 ";true_color! PRINT #1,"# ------ Adresse du chemin des ressources (langue choisie) --------" PRINT #1,"230 ";{OB_SPEC(adr_parametres%,SUB(chelangu&,2))} PRINT #1,"# --------- Type de C.S.G. … calculer -----------------------------" PRINT #1,"231 ";type_de_csg& PRINT #1,"# ------------------- Des oublis ajout‚s … la fin -----------------" PRINT #1,"232 ";adr_chemin_include% PRINT #1,"233 ";zone_preview% PRINT #1,"234 ";cheinc1& PRINT #1,"235 ";cheinc2& PRINT #1,"236 ";cheinc3& PRINT #1,"237 ";cheinc4& PRINT #1,"238 ";cheinc5& PRINT #1,"239 ";cheinc6& PRINT #1,"240 ";cheinc7& PRINT #1,"241 ";cheinc8& PRINT #1,"242 ";cheinc9& PRINT #1,"243 ";eb_temp% PRINT #1,"244 ";preview_24bits% PRINT #1,"245 ";preview_compre% PRINT #1,"246 ";roue% PRINT #1,"247 ";largeur_roue& PRINT #1,"248 ";hauteur_roue& PRINT #1,"249 ";deg_gris% PRINT #1,"250 ";largeur_deg_gris& PRINT #1,"251 ";hauteur_deg_gris& PRINT #1,"252 ";degigris% PRINT #1,"253 ";largeur_degigris& PRINT #1,"254 ";hauteur_degigris& PRINT #1,"255 ";deg_roug% PRINT #1,"256 ";largeur_deg_roug& PRINT #1,"257 ";hauteur_deg_roug& PRINT #1,"258 ";deg_vert% PRINT #1,"259 ";largeur_deg_vert& PRINT #1,"260 ";hauteur_deg_vert& PRINT #1,"261 ";deg_bleu% PRINT #1,"262 ";largeur_deg_bleu& PRINT #1,"263 ";hauteur_deg_bleu& PRINT #1,"264 ";objets_a_deplacer& PRINT #1,"# ---------------------- Les zone d'annulation --------------------" PRINT #1,"265 ";annul_texture% PRINT #1,"266 ";annul_pigment% PRINT #1,"267 ";annul_normal% PRINT #1,"268 ";annul_finish% PRINT #1,"269 ";annul_interior% PRINT #1,"# ---------------------- Fin du fichier protocole -----------------" PRINT #1,"EOF" CLOSE #1 RETURN > FUNCTION lire_transfert_retour LOCAL compteur&,nbobje&,nbprim&,tail%,apoi&,reponse!,anc_nbo&,anc_pri& LOCAL termine!,i& ' anc_nbo&=nombre_d_objets& anc_pri&=primitive& ' CHAR{mem_che%}=CHAR{eb_temp%}+"\eb_model.shm"+CHR$(0) CLR nbobje&,nbprim&,compteur&,i& IF @s_exist(mem_che%) OPEN "i",#1,CHAR{mem_che%} IF LOF(#1) DO membfill(mem_che%,512,0) termine!=@lire_une_ligne(mem_che%) EXIT IF LEFT$(CHAR{mem_che%},3)="EOF" IF LEN(CHAR{mem_che%})>1 IF compteur&<2 IF VAL(LEFT$(CHAR{mem_che%},3))=0 enleve_code(mem_che%) nbobje&=VAL(CHAR{mem_che%}) INC compteur& ELSE IF VAL(LEFT$(CHAR{mem_che%},3))=1 enleve_code(mem_che%) nbprim&=VAL(CHAR{mem_che%}) INC compteur& ENDIF ELSE IF (compteur&>1) IF i&-1) OR (nbprim&>-1)) IF nbobje&<1 ! Pas de primitive, que des secondaires ADD primitive&,nbprim& ADD nombre_d_objets&,nbprim& ELSE IF nbprim&<1 ! Pas de secondaire, que des primitives ADD nombre_d_objets&,nbobje& ELSE ! des primitives et des secondaires ADD primitive&,nbprim& ADD nombre_d_objets&,nbobje& ENDIF reponse!=TRUE IF nombre_d_objets&=>limite_des_objets& ~@afficher_alerte(adr_depasse%) CHAR{coord_polygon%}="[1][ "+STR$(nombre_d_objets&)+" objets demand‚s | "+STR$(nombre_d_objets&)+" objects need ][ Ok ]"+CHR$(0) ~@afficher_alerte(coord_polygon%) i&=nbprim& DO libere(ADD(objet%,SHL(ADD(anc_pri&,i&),2))) DEC i& LOOP WHILE i&>0 nombre_d_objets&=anc_nbo& primitive&=anc_pri& reponse!=FALSE ENDIF ENDIF ' RETURN reponse! ' ENDFUNC > PROCEDURE chemin_systeme ' ------------------------------------------------------------------------ ' Si SELECTRIC est install‚, il va effectu‚ des changments de chemins ! ' intenpestifs (par des CHDIR/CHDRIVE), il faut donc inp‚rativement ! ' remettre tout en l'‚tat pour que tout aille bien. ! ' De plus, lors de l'utilisation des modules et autre plug in du modeleur! ' les chemins systŠmes sont modifier et il faut donc les remettre. ! ' ------------------------------------------------------------------------ ' Remettre le lecteur systeme ! ~GEMDOS(&HE,W:lecteur%) ! ' ! ' Remettre le chemin systŠme ! ~GEMDOS(&H3B,L:path_systeme%) ! ' ------------------------------------------------------------------------ RETURN > PROCEDURE chemin_en_cours(d%,p%) LOCAL a|,lec% ' a|=65 ! En cas de majuscule, 65=A IF multitache! a|=97 ! En cas de minuscule, 97=a ENDIF ' ------------------------------------------------------------------------ ' Pour ‚viter tout problŠme en multitƒche, autant changer le chemin ! ' systŠme … chaque fois que l'on veut lancer une application fille ! ' du genre modules, programmes externes...etc... ! ' ------------------------------------------------------------------------ ' ! ' Remettre le lecteur systeme ! lec%=SUB(ASC(CHAR{d%}),a|) ! ~GEMDOS(&HE,W:lec%) ! ' ! ' Remettre le chemin systŠme ! minuscule(p%) ! ~GEMDOS(&H3B,L:p%) ! ' ! ' ------------------------------------------------------------------------ RETURN ' ****************************************************************************** ' **** Emulation des routines ASM de XtendTOS de Lo‹c SEBALD en GFA **** ' ****************************************************************************** > PROCEDURE do_normals(adr_tab%) LOCAL x0%,y0%,z0% ! Le premier point LOCAL xp%,yp%,zp% ! Le second point LOCAL xd%,yd%,zd% ! Le troisiŠme point LOCAL off% ! L'offset de d‚calage de pr‚cision LOCAL x1,y1,z1 ! Le premier vecteur LOCAL x2,y2,z2 ! Le second vecteur ' x0%={ADD(adr_tab%,16)} y0%={ADD(adr_tab%,20)} z0%={ADD(adr_tab%,24)} ' xp%={ADD(adr_tab%,28)} yp%={ADD(adr_tab%,32)} zp%={ADD(adr_tab%,36)} ' xd%={ADD(adr_tab%,40)} yd%={ADD(adr_tab%,44)} zd%={ADD(adr_tab%,48)} ' off%=2^{ADD(adr_tab%,52)} ' ' On calcul le vecteur allant du premier au second point x1=ROUND(SUB(xp%,x0%)/off%,6) y1=ROUND(SUB(yp%,y0%)/off%,6) z1=ROUND(SUB(zp%,z0%)/off%,6) ' ' ensuite, le vecteur allant du premier au troisiŠme point x2=ROUND(SUB(xd%,x0%)/off%,6) y2=ROUND(SUB(yd%,y0%)/off%,6) z2=ROUND(SUB(zd%,z0%)/off%,6) ' ' Enfin, le produit vectoriel des deux pr‚c‚dents vecteurs ' ce qui donne le vecteur normal … la face en son centre. ' Soit : un vecteur dirig‚ vers l'ext‚rieur dans un repŠre droit ' {ADD(adr_tab%,16)}=((y1*z2)-(z1*y2))*off% {ADD(adr_tab%,20)}=((z1*x2)-(x1*z2))*off% {ADD(adr_tab%,24)}=((x1*y2)-(y1*x2))*off% ' RETURN > PROCEDURE do_normalisation(adr_tab%) LOCAL taille ! Norme du vecteur LOCAL off% ! L'offset de d‚calage de pr‚cision LOCAL xn,yn,zn ! Vecteur normal ' off%=2^{ADD(adr_tab%,52)} ' xn=ROUND({ADD(adr_tab%,16)}/off%,6) yn=ROUND({ADD(adr_tab%,20)}/off%,6) zn=ROUND({ADD(adr_tab%,24)}/off%,6) ' taille=ROUND(SQR((xn*xn)+(yn*yn)+(zn*zn)),6) IF ROUND(taille,6)==0 {ADD(adr_tab%,16)}=xn*off% {ADD(adr_tab%,20)}=yn*off% {ADD(adr_tab%,24)}=zn*off% ELSE {ADD(adr_tab%,16)}=(xn/ROUND(taille,6))*off% {ADD(adr_tab%,20)}=(yn/ROUND(taille,6))*off% {ADD(adr_tab%,24)}=(zn/ROUND(taille,6))*off% ENDIF ' RETURN > PROCEDURE do_barycenter(adr_tab%) LOCAL x0%,y0%,z0% ! Le premier point LOCAL xp%,yp%,zp% ! Le second point LOCAL xd%,yd%,zd% ! Le troisiŠme point LOCAL off% ! L'offset de d‚calage de pr‚cision LOCAL moyx,moyy,moyz ! Barycentre de la face ' x0%={ADD(adr_tab%,16)} y0%={ADD(adr_tab%,20)} z0%={ADD(adr_tab%,24)} ' xp%={ADD(adr_tab%,28)} yp%={ADD(adr_tab%,32)} zp%={ADD(adr_tab%,36)} ' xd%={ADD(adr_tab%,40)} yd%={ADD(adr_tab%,44)} zd%={ADD(adr_tab%,48)} ' off%={ADD(adr_tab%,52)} ' ' On commence donc par recherche le point central de la face... ' Bien sur, ce systŠme de moyenne pond‚r‚e sur les trois axes ' ne fonctionne que sur des polygone convexes CLR moyx,moyy,moyz ADD moyx,x0% ! Premier point ADD moyy,y0% ! ADD moyz,z0% ! ADD moyx,xp% ! Second point ADD moyy,yp% ! ADD moyz,zp% ! ADD moyx,xd% ! TroisiŠme point ADD moyy,yd% ! ADD moyz,zd% ! ' ' ********** Point central ' {ADD(adr_tab%,16)}=moyx/3 {ADD(adr_tab%,20)}=moyy/3 {ADD(adr_tab%,24)}=moyz/3 ' RETURN > PROCEDURE do_all(adr_tab%) LOCAL x0%,y0%,z0% ! Le premier point LOCAL xp%,yp%,zp% ! Le second point LOCAL xd%,yd%,zd% ! Le troisiŠme point LOCAL taille ! Norme du vecteur LOCAL off% ! L'offset de d‚calage de pr‚cision LOCAL moyx,moyy,moyz ! Barycentre de la face LOCAL x1,y1,z1 ! Le premier vecteur LOCAL x2,y2,z2 ! Le second vecteur LOCAL xn,yn,zn ! Vecteur normal ' x0%={ADD(adr_tab%,16)} y0%={ADD(adr_tab%,20)} z0%={ADD(adr_tab%,24)} ' xp%={ADD(adr_tab%,28)} yp%={ADD(adr_tab%,32)} zp%={ADD(adr_tab%,36)} ' xd%={ADD(adr_tab%,40)} yd%={ADD(adr_tab%,44)} zd%={ADD(adr_tab%,48)} ' off%=2^{ADD(adr_tab%,52)} ' //////////////////////////////////////////////////////////////////////////// ' On commence donc par recherche le point central de la face... ' Bien sur, ce systŠme de moyenne pond‚r‚e sur les trois axes ' ne fonctionne que sur des polygone convexes CLR moyx,moyy,moyz ADD moyx,x0% ! Premier point ADD moyy,y0% ! ADD moyz,z0% ! ADD moyx,xp% ! Second point ADD moyy,yp% ! ADD moyz,zp% ! ADD moyx,xd% ! TroisiŠme point ADD moyy,yd% ! ADD moyz,zd% ! ' ' ********** Point central ' {ADD(adr_tab%,40)}=moyx/3 {ADD(adr_tab%,44)}=moyy/3 {ADD(adr_tab%,48)}=moyz/3 ' //////////////////////////////////////////////////////////////////////////// ' ' On calcul le vecteur allant du premier au second point x1=ROUND(SUB(xp%,x0%)/off%,6) y1=ROUND(SUB(yp%,y0%)/off%,6) z1=ROUND(SUB(zp%,z0%)/off%,6) ' ' ensuite, le vecteur allant du premier au troisiŠme point x2=ROUND(SUB(xd%,x0%)/off%,6) y2=ROUND(SUB(yd%,y0%)/off%,6) z2=ROUND(SUB(zd%,z0%)/off%,6) ' ' Enfin, le produit vectoriel des deux pr‚c‚dents vecteurs ' ce qui donne le vecteur normal … la face en son centre. ' Soit : un vecteur dirig‚ vers l'ext‚rieur dans un repŠre droit ' {ADD(adr_tab%,28)}=((y1*z2)-(z1*y2))*off% {ADD(adr_tab%,32)}=((z1*x2)-(x1*z2))*off% {ADD(adr_tab%,36)}=((x1*y2)-(y1*x2))*off% ' //////////////////////////////////////////////////////////////////////////// ' ' On normalise la normale … la face ' xn=ROUND({ADD(adr_tab%,28)}/off%,6) yn=ROUND({ADD(adr_tab%,32)}/off%,6) zn=ROUND({ADD(adr_tab%,36)}/off%,6) ' taille=ROUND(SQR((xn*xn)+(yn*yn)+(zn*zn)),6) IF ROUND(taille,6)==0 {ADD(adr_tab%,16)}=xn*off% {ADD(adr_tab%,20)}=yn*off% {ADD(adr_tab%,24)}=zn*off% ELSE {ADD(adr_tab%,16)}=(xn/ROUND(taille,6))*off% {ADD(adr_tab%,20)}=(yn/ROUND(taille,6))*off% {ADD(adr_tab%,24)}=(zn/ROUND(taille,6))*off% ENDIF ' RETURN > PROCEDURE ro_tr(adr_tab%) LOCAL matr%,m%,off% LOCAL tx%,ty%,tz% LOCAL xc%,yc%,zc% LOCAL tmp0%,tmp1% LOCAL crd%,cpd% LOCAL nb_p% ' matr%={ADD(adr_tab%,16)} ! Matrice de transformation off%={ADD(adr_tab%,28)} ! Coefficent diviseur nb_p%={ADD(adr_tab%,32)} ! Nombre de point … traiter tx%={ADD(adr_tab%,36)} ! D‚placement sur X ty%={ADD(adr_tab%,40)} ! D‚placement sur Y tz%={ADD(adr_tab%,44)} ! D‚placement sur Z ' crd%={ADD(adr_tab%,20)} ! Source cpd%={ADD(adr_tab%,24)} ! destination DO m%=matr% ' ------------------------ Lecture et mise … l'‚chelle d'un point xc%={crd%} ADD crd%,4 MUL xc%,{m%} ADD m%,4 DIV xc%,2 yc%={crd%} ADD crd%,4 MUL yc%,{m%} ADD m%,4 DIV yc%,2 zc%={crd%} ADD crd%,4 MUL zc%,{m%} ADD m%,4 DIV zc%,2 ' ----------------------- Rotation autour de X,Y et Z par matrice du point ' ----------------------- suivit de la translation ' Coordonn‚e X tmp0%=xc% MUL tmp0%,{m%} ADD m%,4 tmp1%=yc% MUL tmp1%,{m%} ADD m%,4 ADD tmp0%,tmp1% tmp1%=zc% MUL tmp1%,{m%} ADD m%,4 ADD tmp0%,tmp1% DIV tmp0%,off% ADD tmp0%,tx% {cpd%}=tmp0% ADD cpd%,4 ' Coordonn‚e Y tmp0%=xc% MUL tmp0%,{m%} ADD m%,4 tmp1%=yc% MUL tmp1%,{m%} ADD m%,4 ADD tmp0%,tmp1% tmp1%=zc% MUL tmp1%,{m%} ADD m%,4 ADD tmp0%,tmp1% DIV tmp0%,off% ADD tmp0%,ty% {cpd%}=tmp0% ADD cpd%,4 ' Coordonn‚e Z tmp0%=xc% MUL tmp0%,{m%} ADD m%,4 tmp1%=yc% MUL tmp1%,{m%} ADD m%,4 ADD tmp0%,tmp1% tmp1%=zc% MUL tmp1%,{m%} ADD m%,4 ADD tmp0%,tmp1% DIV tmp0%,off% ADD tmp0%,tz% {cpd%}=tmp0% ADD cpd%,4 ' DEC nb_p% LOOP WHILE nb_p%>0 ' RETURN > PROCEDURE tr_ro(adr_tab%) LOCAL matr%,m%,off% LOCAL tx%,ty%,tz% LOCAL xc%,yc%,zc% LOCAL tmp0%,tmp1% LOCAL crd%,cpd% LOCAL nb_p% ' matr%={ADD(adr_tab%,16)} ! Matrice de transformation off%={ADD(adr_tab%,28)} ! Coefficent diviseur nb_p%={ADD(adr_tab%,32)} ! Nombre de point … traiter tx%={ADD(adr_tab%,36)} ! D‚placement sur X ty%={ADD(adr_tab%,40)} ! D‚placement sur Y tz%={ADD(adr_tab%,44)} ! D‚placement sur Z ' crd%={ADD(adr_tab%,20)} ! Source cpd%={ADD(adr_tab%,24)} ! destination DO m%=matr% ' ------------------------ Lecture et mise … l'‚chelle d'un point xc%={crd%} ADD crd%,4 MUL xc%,{m%} ADD m%,4 DIV xc%,2 ADD xc%,tx% yc%={crd%} ADD crd%,4 MUL yc%,{m%} ADD m%,4 DIV yc%,2 ADD yc%,ty% zc%={crd%} ADD crd%,4 MUL zc%,{m%} ADD m%,4 DIV zc%,2 ADD zc%,tz% ' ----------------------- Rotation autour de X,Y et Z par matrice du point ' Coordonn‚e X tmp0%=xc% MUL tmp0%,{m%} ADD m%,4 tmp1%=yc% MUL tmp1%,{m%} ADD m%,4 ADD tmp0%,tmp1% tmp1%=zc% MUL tmp1%,{m%} ADD m%,4 ADD tmp0%,tmp1% DIV tmp0%,off% {cpd%}=tmp0% ADD cpd%,4 ' Coordonn‚e Y tmp0%=xc% MUL tmp0%,{m%} ADD m%,4 tmp1%=yc% MUL tmp1%,{m%} ADD m%,4 ADD tmp0%,tmp1% tmp1%=zc% MUL tmp1%,{m%} ADD m%,4 ADD tmp0%,tmp1% DIV tmp0%,off% {cpd%}=tmp0% ADD cpd%,4 ' Coordonn‚e Z tmp0%=xc% MUL tmp0%,{m%} ADD m%,4 tmp1%=yc% MUL tmp1%,{m%} ADD m%,4 ADD tmp0%,tmp1% tmp1%=zc% MUL tmp1%,{m%} ADD m%,4 ADD tmp0%,tmp1% DIV tmp0%,off% {cpd%}=tmp0% ADD cpd%,4 ' DEC nb_p% LOOP WHILE nb_p%>0 ' RETURN > PROCEDURE c2d2d(adr_tab%) LOCAL crd%,des%,vu| LOCAL off%,z_zo%,cpt| LOCAL tx%,ty%,tz% LOCAL origx&,origy& ' crd%={ADD(adr_tab%,16)} des%={ADD(adr_tab%,20)} z_zo%={ADD(adr_tab%,24)} vu|={ADD(adr_tab%,28)} origx&={ADD(adr_tab%,32)} origy&={ADD(adr_tab%,36)} off%=2^{ADD(adr_tab%,40)} ' cpt|=3 DO tx%={crd%} ty%={ADD(crd%,4)} tz%={ADD(crd%,8)} $S|,$S> SELECT vu| CASE vue_de_face| ' X+ … droite Y+ en haut ty%=-ty% CASE vue_de_dos| ' X+ … gauche Y+ en haut tx%=-tx% ty%=-ty% CASE vue_de_gauche| ' Z+ … gauche Y+ en haut tx%=-tz% ty%=-ty% CASE vue_de_droite| ' Z+ … droite Y+ en haut tx%=tz% ty%=-ty% CASE vue_de_dessus| ' X+ … droite Z+ en haut ty%=-tz% CASE vue_de_dessous| ' X+ … droite Z+ en bas ty%=tz% ENDSELECT MUL tx%,{z_zo%} IF {ADD(z_zo%,4)}<>0 ! Evitons les divisions par 0 DIV tx%,{ADD(z_zo%,4)} ENDIF DIV tx%,off% IF ADD(origx&,tx%)>32700 INT{des%}=32700 ELSE IF ADD(origx&,tx%)<-32700 INT{des%}=-32700 ELSE INT{des%}=ADD(origx&,tx%) ENDIF MUL ty%,{ADD(z_zo%,8)} IF {ADD(z_zo%,12)}<>0 ! Evitons les divisions par 0 DIV ty%,{ADD(z_zo%,12)} ENDIF DIV ty%,off% IF ADD(origy&,ty%)>32700 INT{ADD(des%,2)}=32700 ELSE IF ADD(origy&,ty%)<-32700 INT{ADD(des%,2)}=-32700 ELSE INT{ADD(des%,2)}=ADD(origy&,ty%) ENDIF ' ADD crd%,12 ADD des%,4 DEC cpt| LOOP WHILE cpt|>0 ' RETURN > PROCEDURE c3d2d(adr_tab%) LOCAL crd%,des%,mdes%,vu|,fo% LOCAL off%,z_zo%,cpt| LOCAL tx%,ty%,tz% LOCAL zx%,zy%,zz% LOCAL origx&,origy& ' crd%={ADD(adr_tab%,16)} des%={ADD(adr_tab%,20)} mdes%=des% z_zo%={ADD(adr_tab%,24)} fo%={ADD(adr_tab%,28)} origx&={ADD(adr_tab%,36)} origy&={ADD(adr_tab%,40)} off%=2^{ADD(adr_tab%,44)} ' tx%={crd%} ty%={ADD(crd%,4)} tz%={ADD(crd%,8)} zx%=fo% zy%=fo% ' Coordonn‚e X MUL zx%,{ADD(z_zo%,4)} ! Zoomx% DIV zx%,{z_zo%} ! Z_correctionx% DIV zx%,{ADD(z_zo%,4)} ! Zoomx% MUL tx%,zx% DIV tx%,tz% ' Coordonn‚e Y MUL zy%,{ADD(z_zo%,12)} ! Zoomy% DIV zy%,{ADD(z_zo%,8)} ! Z_coorrectiony% DIV zy%,{ADD(z_zo%,12)} ! Zoomy% MUL ty%,zy% DIV ty%,tz% INT{des%}=ADD(origx&,tx%) INT{ADD(des%,2)}=ADD(origy&,ty%) ADD j%,2 ADD des%,4 ADD crd%,12 ' ---------------------------------------------------------- tx%={crd%} ty%={ADD(crd%,4)} tz%={ADD(crd%,8)} zx%=fo% zy%=fo% ' Coordonn‚e X MUL zx%,{ADD(z_zo%,4)} ! Zoomx% DIV zx%,{z_zo%} ! Z_correctionx% DIV zx%,{ADD(z_zo%,4)} ! Zoomx% MUL tx%,zx% DIV tx%,tz% ' Coordonn‚e Y MUL zy%,{ADD(z_zo%,12)} ! Zoomy% DIV zy%,{ADD(z_zo%,8)} ! Z_coorrectiony% DIV zy%,{ADD(z_zo%,12)} ! Zoomy% MUL ty%,zy% DIV ty%,tz% INT{des%}=ADD(origx&,tx%) INT{ADD(des%,2)}=ADD(origy&,ty%) ADD j%,2 ADD des%,4 ADD crd%,12 ' ---------------------------------------------------------- tx%={crd%} ty%={ADD(crd%,4)} tz%={ADD(crd%,8)} zx%=fo% zy%=fo% ' Coordonn‚e X MUL zx%,{ADD(z_zo%,4)} ! Zoomx% DIV zx%,{z_zo%} ! Z_correctionx% DIV zx%,{ADD(z_zo%,4)} ! Zoomx% MUL tx%,zx% DIV tx%,tz% ' Coordonn‚e Y MUL zy%,{ADD(z_zo%,12)} ! Zoomy% DIV zy%,{ADD(z_zo%,8)} ! Z_coorrectiony% DIV zy%,{ADD(z_zo%,12)} ! Zoomy% MUL ty%,zy% DIV ty%,tz% INT{des%}=ADD(origx&,tx%) INT{ADD(des%,2)}=ADD(origy&,ty%) ' ---------------------------------------------------------- ' RETURN > PROCEDURE draw_line(adr_tab%) LOCAL adr_pt%,nb_t%,addp% ' adr_pt%={ADD(adr_tab%,16)} ' nb_t%={adr_pt%} ' IF nb_t%=0 ! L…, c'est une ligne qu'il faut tracer parametre_trace_ligne({ADD(adr_pt%,4)}) BMOVE ADD(adr_pt%,8),emu_xten%,8 polyline(1) ELSE ! Alors, que l…, c'est un ensemble de facette addp%=ADD(adr_pt%,4) DO ' BMOVE ADD(addp%,4),emu_xten%,12 BMOVE ADD(addp%,4),ADD(emu_xten%,12),4 parametre_trace_ligne({addp%}) polyline(3) ' ADD addp%,16 DEC nb_t% LOOP WHILE nb_t%>0 ENDIF ' RETURN > PROCEDURE draw_poly(adr_tab%) LOCAL adr_pt%,nb_t%,addp% ' adr_pt%={ADD(adr_tab%,16)} ' nb_t%={adr_pt%} IF nb_t%=0 ! L…, c'est une ligne qu'il faut tracer ' parametre_trace_ligne({ADD(adr_pt%,4)}) ' BMOVE ADD(adr_pt%,8),emu_xten%,8 polyline(1) ELSE ! Alors, que l…, c'est un ensemble de facette addp%=ADD(adr_pt%,4) DO ' BMOVE ADD(addp%,4),emu_xten%,12 BMOVE ADD(addp%,4),ADD(emu_xten%,12),4 parametre_trace_poly({addp%}) filled_aera(2) IF INT{ADD({addp%},8)}=1 parametre_contour({addp%}) polyline(3) ENDIF ' ADD addp%,16 DEC nb_t% LOOP WHILE nb_t%>0 ENDIF ' RETURN > PROCEDURE parametre_trace_ligne(adr_param%) LOCAL r|,v|,b|,c&,con!,mas!,tra% ' IF true_color! r|=BYTE{ADD(adr_param%,1)} ! Couleur en TRUE COLOR v|=BYTE{ADD(adr_param%,2)} b|=BYTE{ADD(adr_param%,3)} ELSE c&={adr_param%} ENDIF mas!=(INT{ADD(adr_param%,10)}=1) ! masque de dessin activ‚ tra%={ADD(adr_param%,12)} ! Adresse de la trame ' IF mas! IF true_color! set_color_representation(254,r|*3.9215,v|*3.9215,b|*3.9215,vdihandle%) set_type_de_ligne(254,1,7,0,0,CARD{tra%}) ELSE set_type_de_ligne(c&,1,7,0,0,CARD{tra%}) ENDIF ELSE IF true_color! set_color_representation(254,r|*3.9215,v|*3.9215,b|*3.9215,vdihandle%) set_type_de_ligne(254,1,1,0,0,-1) ELSE set_type_de_ligne(c&,1,1,0,0,-1) ENDIF ENDIF ' RETURN > PROCEDURE parametre_trace_poly(adr_param%) LOCAL r|,v|,b|,c&,con!,mas!,tra% LOCAL rc|,vc|,bc|,cc& ' ' Couleur de l'encre IF true_color! r|=BYTE{ADD(adr_param%,1)} ! Couleur en TRUE COLOR v|=BYTE{ADD(adr_param%,2)} b|=BYTE{ADD(adr_param%,3)} ELSE c&={adr_param%} ENDIF mas!=(INT{ADD(adr_param%,10)}=1) ! masque de dessin activ‚ tra%={ADD(adr_param%,12)} ! Adresse de la trame ' IF mas! IF true_color! set_color_representation(254,r|*3.9215,v|*3.9215,b|*3.9215,vdihandle%) set_remplissage(4,1,254,tra%) ELSE set_remplissage(4,1,c&,tra%) ENDIF ELSE IF true_color! set_color_representation(254,r|*3.9215,v|*3.9215,b|*3.9215,vdihandle%) set_remplissage(2,8,254,-1) ELSE set_remplissage(2,8,c&,-1) ENDIF ENDIF ' RETURN > PROCEDURE parametre_contour(adr_param%) LOCAL r|,v|,b|,c&,con!,mas!,tra% ' IF true_color! r|=BYTE{ADD(adr_param%,5)} ! Couleur en TRUE COLOR v|=BYTE{ADD(adr_param%,6)} b|=BYTE{ADD(adr_param%,7)} ELSE c&={ADD(adr_param%,4)} ENDIF mas!=(INT{ADD(adr_param%,10)}=1) ! masque de dessin activ‚ tra%={ADD(adr_param%,12)} ! Adresse de la trame ' IF mas! IF true_color! set_color_representation(254,r|*3.9215,v|*3.9215,b|*3.9215,vdihandle%) set_type_de_ligne(254,1,7,0,0,CARD{tra%}) ELSE set_type_de_ligne(c&,1,7,0,0,CARD{tra%}) ENDIF ELSE IF true_color! set_color_representation(254,r|*3.9215,v|*3.9215,b|*3.9215,vdihandle%) set_type_de_ligne(254,1,1,0,0,-1) ELSE set_type_de_ligne(c&,1,1,0,0,-1) ENDIF ENDIF ' RETURN > PROCEDURE quick_sort ' ttf%={ADD(tracer_tri_tab%,16)} l&=CARD{ADD(tracer_tri_tab%,20)} r&=CARD{ADD(tracer_tri_tab%,22)} ' taille_zone_ttf%=CARD{ADD(tracer_tri_tab%,24)} quicksort(l&,r&) ' RETURN > PROCEDURE quicksort(l&,r&) LOCAL tt% LOCAL z0& LOCAL z1& LOCAL lue% ' IF SUB(r&,l&)=1 tt%=ADD(ttf%,MUL(l&,taille_zone_ttf%)) IF {tt%}>{ADD(ttf%,MUL(r&,taille_zone_ttf%))} BMOVE tt%,mem_num%,taille_zone_ttf% BMOVE ADD(ttf%,MUL(r&,taille_zone_ttf%)),tt%,taille_zone_ttf% BMOVE mem_num%,ADD(ttf%,MUL(r&,taille_zone_ttf%)),taille_zone_ttf% ENDIF ELSE z0&=l& z1&=r& lue%={ADD(ttf%,MUL(DIV(ADD(z0&,z1&),2),taille_zone_ttf%))} REPEAT WHILE {ADD(ttf%,MUL(z0&,taille_zone_ttf%))}z1& IF l& PROCEDURE debut_ecran_virtuel(destination%) IF destination%<>physique% SLPOKE &H44E,destination% ENDIF RETURN > PROCEDURE fin_ecran_virtuel(destination%) IF destination%<>physique% BMOVE destination%,physique%,ecran% SLPOKE &H44E,physique% ENDIF RETURN ' ****************************************************************************** ' **** Les fonctions de TINY_GL par appel ~C en GFA **** ' **** en th‚orie compatible avec MESA GL **** ' ****************************************************************************** > PROCEDURE glbegin(mode%) $C+ ~C:glbegin%(L:mode%) $C- RETURN > PROCEDURE glclear(mask%) $C+ ~C:glclear%(L:mask%) $C- RETURN > PROCEDURE glclearcolor(red,green,blue,alpha) SINGLE{mesa_v0%}=red SINGLE{mesa_v1%}=green SINGLE{mesa_v2%}=blue SINGLE{mesa_v3%}=alpha $C+ ~C:glclearcolor%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%},L:{mesa_v3%}) $C- RETURN > PROCEDURE glcolor3f(red,green,blue) SINGLE{mesa_v0%}=red SINGLE{mesa_v1%}=green SINGLE{mesa_v2%}=blue $C+ ~C:glcolor3f%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%}) $C- RETURN > PROCEDURE gldisable(cap%) $C+ ~C:gldisable%(L:cap%) $C- RETURN > PROCEDURE glenable(cap%) $C+ ~C:glenable%(L:cap%) $C- RETURN > PROCEDURE glend $C+ ~C:glend%() $C- RETURN > PROCEDURE gllightfv(light%,pname%,params%) $C+ ~C:gllightfv%(L:light%,L:pname%,L:params%) $C- RETURN > PROCEDURE glloadidentity $C+ ~C:glloadidentity%() $C- RETURN > PROCEDURE glmaterialfv(face%,pname%,params%) $C+ ~C:glmaterialfv%(L:face%,L:pname%,L:params%) $C- RETURN > PROCEDURE glmatrixmode(mode%) $C+ ~C:glmatrixmode%(L:mode%) $C- RETURN > PROCEDURE glortho(left,right,bottom,top,nearval,farval) SINGLE{mesa_v0%}=left SINGLE{mesa_v1%}=right SINGLE{mesa_v2%}=bottom SINGLE{mesa_v3%}=top SINGLE{mesa_v4%}=nearval SINGLE{mesa_v5%}=farval $C+ ~C:glortho%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%},L:{mesa_v3%},L:{mesa_v4%},L:{mesa_v5%}) $C- RETURN > PROCEDURE glpopmatrix $C+ ~C:glpopmatrix%() $C- RETURN > PROCEDURE glpushmatrix $C+ ~C:glpushmatrix%() $C- RETURN > PROCEDURE glrotatef(angle,x,y,z) SINGLE{mesa_v0%}=angle SINGLE{mesa_v1%}=x SINGLE{mesa_v2%}=y SINGLE{mesa_v3%}=z $C+ ~C:glrotatef%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%},L:{mesa_v3%}) $C- RETURN > PROCEDURE gltexenvi(target%,pname%,params%) $C+ ~C:gltexenvi%(L:target%,L:pname%,L:params%) $C- RETURN > PROCEDURE gltexparameteri(target%,pname%,param%) $C+ ~C:gltexparameteri%(L:target%,L:pname%,L:param%) $C- RETURN > PROCEDURE gltranslatef(x,y,z) SINGLE{mesa_v0%}=x SINGLE{mesa_v1%}=y SINGLE{mesa_v2%}=z $C+ ~C:gltranslatef%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%}) $C- RETURN > PROCEDURE glvertex2f(x,y) SINGLE{mesa_v0%}=x SINGLE{mesa_v1%}=y $C+ ~C:glvertex2f%(L:{mesa_v0%},L:{mesa_v1%}) $C- RETURN > PROCEDURE glvertex3f(x,y,z) SINGLE{mesa_v0%}=x SINGLE{mesa_v1%}=y SINGLE{mesa_v2%}=z $C+ ~C:glvertex3f%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%}) $C- RETURN > FUNCTION osmesacreateldg(format%,type%,width_%,height_%) LOCAL ret% $C+ ret%=C:osmesacreateldg%(L:format%,L:type%,L:width_%,L:height_%) $C- RETURN ret% ENDFUNC > PROCEDURE osmesadestroyldg $C+ ~C:osmesadestroyldg%() $C- RETURN > PROCEDURE tiny_save_tga(file%,buffer_%,width_%,height_%) $C+ ~C:tiny_save_tga%(L:file%,L:buffer_%,L:width_%,L:height_%) $C- RETURN > PROCEDURE glarrayelement(i_%) $C+ ~C:glarrayelement%(L:i_%) $C- RETURN > PROCEDURE glbindtexture(target%,texture%) $C+ ~C:glbindtexture%(L:target%,L:texture%) $C- RETURN > PROCEDURE glcalllist(list%) $C+ ~C:glcalllist%(L:list%) $C- RETURN > PROCEDURE glcleardepth(depth) SINGLE{mesa_v0%}=depth $C+ ~C:glcleardepth%(L:{mesa_v0%}) $C- RETURN > PROCEDURE glcolor4f(red,green,blue,alpha) SINGLE{mesa_v0%}=red SINGLE{mesa_v1%}=green SINGLE{mesa_v2%}=blue SINGLE{mesa_v3%}=alpha $C+ ~C:glcolor4f%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%},L:{mesa_v3%}) $C- RETURN > PROCEDURE glcolor3fv(v) SINGLE{mesa_v0%}=v $C+ ~C:glcolor3fv%(L:{mesa_v0%}) $C- RETURN > PROCEDURE glcolor4fv(v) SINGLE{mesa_v0%}=v $C+ ~C:glcolor4fv%(L:{mesa_v0%}) $C- RETURN > PROCEDURE glcolormaterial(face%,mode%) $C+ ~C:glcolormaterial%(L:face%,L:mode%) $C- RETURN > PROCEDURE glcolorpointer(size%,type%,stride%,ptr%) $C+ ~C:glcolorpointer%(L:size%,L:type%,L:stride%,L:ptr%) $C- RETURN > PROCEDURE cullface(mode%) $C+ ~C:cullface%(L:mode%) $C- RETURN > PROCEDURE gldeletetextures(n%,textures%) $C+ ~C:gldeletetextures%(L:n%,L:textures%) $C- RETURN > PROCEDURE gldisableclientstate(cap%) $C+ ~C:gldisableclientstate%(L:cap%) $C- RETURN > PROCEDURE glenableclientstate(cap%) $C+ ~C:glenableclientstate%(L:cap%) $C- RETURN > PROCEDURE glendlist $C+ ~C:glendlist%() $C- RETURN > PROCEDURE gledgeflag(flag%) $C+ ~C:gledgeflag%(L:flag%) $C- RETURN > PROCEDURE glflush $C+ ~C:glflush%() $C- RETURN > PROCEDURE glfrontface(mode%) $C+ ~C:glfrontface%(L:mode%) $C- RETURN > PROCEDURE glfrustum(left,right,bottom,top,nearval,farval) SINGLE{mesa_v0%}=left SINGLE{mesa_v1%}=right SINGLE{mesa_v2%}=bottom SINGLE{mesa_v3%}=top SINGLE{mesa_v4%}=nearval SINGLE{mesa_v5%}=farval $C+ ~C:glfrustum%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%},L:{mesa_v3%},L:{mesa_v4%},L:{mesa_v5%}) $C- RETURN > FUNCTION glgenlists(range%) LOCAL ret% $C+ ret%=C:glgenlists%(L:range%) $C- RETURN ret% ENDFUNC > PROCEDURE glgentextures(n%,textures%) $C+ ~C:glgentextures%(L:n%,L:textures%) $C- RETURN > PROCEDURE glgetfloatv(pname%,params%) $C+ ~C:glgetfloatv%(L:pname%,L:params%) $C- RETURN > PROCEDURE glgetintegerv(pname%,params%) $C+ ~C:glgetintegerv%(L:pname%,L:params%) $C- RETURN > PROCEDURE glhint $C+ ~C:glhint%() $C- RETURN > PROCEDURE glinitnames $C+ ~C:glinitnames%() $C- RETURN > FUNCTION gllslist(list%) LOCAL ret% $C+ ret%=C:gllslist%(L:list%) $C- RETURN ret% ENDFUNC > PROCEDURE gllightmodeli(pname%,params%) $C+ ~C:gllightmodeli%(L:pname%,L:params%) $C- RETURN > PROCEDURE gllightmodelfv(pname%,params%) $C+ ~C:gllightmodelfv%(L:pname%,L:params%) $C- RETURN > PROCEDURE glloadmatrixf(m%) $C+ ~C:glloadmatrixf%(L:m%) $C- RETURN > PROCEDURE glloadname(name%) $C+ ~C:glloadname%(L:name%) $C- RETURN > PROCEDURE glmaterialf(face%,pname%,params%) $C+ ~C:glmaterialf%(L:face%,L:pname%,L:params%) $C- RETURN > PROCEDURE glmultmatrixf(m%) $C+ ~C:glmultmatrixf%(L:m%) $C- RETURN > PROCEDURE glnewlist(liste%,mode%) $C+ ~C:glnewlist%(L:liste%,L:mode%) $C- RETURN > PROCEDURE glnormal3f(nx,ny,nz) SINGLE{mesa_v0%}=nx SINGLE{mesa_v1%}=ny SINGLE{mesa_v2%}=nz $C+ ~C:glnormal3f%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%}) $C- RETURN > PROCEDURE glnormal3fv(v) SINGLE{mesa_v0%}=v $C+ ~C:glnormal3fv%(L:{mesa_v0%}) $C- RETURN > PROCEDURE glnormalpointer(type%,stride%,ptr%) $C+ ~C:glnormalpointer%(L:type%,L:stride%,L:ptr%) $C- RETURN > PROCEDURE glpixelstorei(pname%,params%) $C+ ~C:glpixelstorei%(L:pname%,L:params%) $C- RETURN > PROCEDURE glpolygonmode(face%,mode%) $C+ ~C:glpolygonmode%(L:face%,L:mode%) $C- RETURN > PROCEDURE glpolygonoffset(factor,units) SINGLE{mesa_v0%}=factor SINGLE{mesa_v1%}=units $C+ ~C:glpolygonoffset%(L:{mesa_v0%},L:{mesa_v1%}) $C- RETURN > PROCEDURE glpopname $C+ ~C:glpopname%() $C- RETURN > PROCEDURE glpushname $C+ ~C:glpushname%() $C- RETURN > FUNCTION glrendermode(mode%) LOCAL ret% $C+ ret%=C:glrendermode%(L:mode%) $C- RETURN ret% ENDFUNC > PROCEDURE glselectbuffer(size%,buffer%) $C+ ~C:glselectbuffer%(L:size%,L:buffer%) $C- RETURN > PROCEDURE glscalef(x,y,z) SINGLE{mesa_v0%}=x SINGLE{mesa_v1%}=y SINGLE{mesa_v2%}=z $C+ ~C:glscalef%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%}) $C- RETURN > PROCEDURE glshademodel(mode%) $C+ ~C:glshademodel%(L:mode%) $C- RETURN > PROCEDURE gltexcoord2f(s,t) SINGLE{mesa_v0%}=s SINGLE{mesa_v1%}=t $C+ ~C:gltexcoord2f%(L:{mesa_v0%},L:{mesa_v1%}) $C- RETURN > PROCEDURE gltexcoord4f(s,t,r,q) SINGLE{mesa_v0%}=v SINGLE{mesa_v1%}=t SINGLE{mesa_v2%}=r SINGLE{mesa_v3%}=q $C+ ~C:gltexcoord4f%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%},L:{mesa_v3%}) $C- RETURN > PROCEDURE gltexcoord2fv(v) SINGLE{mesa_v0%}=v $C+ ~C:gltexcoord2fv%(L:{mesa_v0%}) $C- RETURN > PROCEDURE gltexcoordpointer(size%,type%,stride%,ptr%) $C+ ~C:gltexcoordpointer%(L:size%,L:type%,L:stride%,L:ptr%) $C- RETURN > PROCEDURE glteximage2d(target%,level%,internalformat%,width_%,height_%,border%,format%,type%,pixels%) $C+ ~C:glteximage2d%(L:target%,L:level%,L:internalformat%,L:width_%,L:height_%,L:border%,L:format%,L:type%,L:pixels%) $C- RETURN > PROCEDURE glvertex4f(x,y,z,w) SINGLE{mesa_v0%}=x SINGLE{mesa_v1%}=y SINGLE{mesa_v2%}=z SINGLE{mesa_v3%}=w $C+ ~C:glvertex4f%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%},L:{mesa_v3%}) $C- RETURN > PROCEDURE glvertex3fv(v) SINGLE{mesa_v0%}=v $C+ ~C:glvertex3fv%(L:{mesa_v0%}) $C- RETURN > PROCEDURE glvertexpointer(size%,type%,stride%,ptr%) $C+ ~C:glvertexpointer%(L:size%,L:type%,L:stride%,L:ptr%) $C- RETURN > PROCEDURE glviewport(x%,y%,width_%,height_%) $C+ ~C:glviewport%(L:x%,L:y%,L:width_%,L:height_%) $C- RETURN > PROCEDURE swapbuffer(buf%) $C+ ~C:swapbuffer%(L:buf%) $C- RETURN > FUNCTION max_width LOCAL ret% $C+ ret%=C:max_width%() $C- RETURN ret% ENDFUNC > FUNCTION max_height LOCAL ret% $C+ ret%=C:max_height%() $C- RETURN ret% ENDFUNC > PROCEDURE gldeletelists(list%,range%) $C+ ~C:gldeletelists%(L:list%,L:range%) $C- RETURN > PROCEDURE glulookat(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz) SINGLE{mesa_v0%}=eyex SINGLE{mesa_v1%}=eyey SINGLE{mesa_v2%}=eyez SINGLE{mesa_v3%}=centerx SINGLE{mesa_v4%}=centery SINGLE{mesa_v5%}=centerz SINGLE{mesa_v6%}=upx SINGLE{mesa_v7%}=upy SINGLE{mesa_v8%}=upz $C+ ~C:glulookat%(L:{mesa_v0%},L:{mesa_v1%},L:{mesa_v2%},L:{mesa_v3%},L:{mesa_v4%},L:{mesa_v5%},L:{mesa_v6%},L:{mesa_v7%},L:{mesa_v8%}) $C- RETURN ' ****************************************************************************** ' **** Les fonctions de SCREEN LDG par appel ~C en GFA **** ' ****************************************************************************** > FUNCTION screen_init(handle%,videoinf%,format_screen%,sortie_video%,flags%) $C+ RETURN C:screen_init%(L:handle%,L:videoinf%,L:format_screen%,L:sortie_video%,L:flags%) $C- ENDFUNC > PROCEDURE screen_display(handle%,videoinf%) graf_mouse(m_off&,0) $C+ ~C:screen_display%(L:handle%,L:videoinf%) $C+ graf_mouse(m_on&,0) RETURN > PROCEDURE fix_palette(sortie_video%,mode%,handle%) $C+ ~C:fix_palette%(L:sortie_video%,L:mode%,L:handle%) $C- RETURN > FUNCTION screen_detect(handle%,answer%) $C+ RETURN C:screen_detect%(L:handle%,L:answer%) $C- ENDFUNC > PROCEDURE restore_palette(handle%) $C+ ~C:restore_palette%(L:handle%) $C- RETURN > PROCEDURE screen_save_tga(file%,buffer_%,width_%,height_%,mode%) $C+ ~C:screen_save_tga%(L:file%,L:buffer_%,L:width_%,L:height_%,L:mode%) $C- RETURN ' ****************************************************************************** > FUNCTION activation_de_mesa_gl LOCAL n% ' mesa_gl!=FALSE CHAR{mem_che%}="tiny_gl.ldg"+CHR$(0) IF @recupere_routines_ldg ! L…, on r‚cupŠre les routines OPEN GL IF ldg_version%=>&H210 ! et c'est la bonne version IF @recupere_routines_screen ! L…, on r‚cupŠre les routine SCREEN initialisation_ecran ! Le type d'‚cran via SCREEN.LDG RETURN TRUE ENDIF ENDIF ENDIF ' mesa_gl!=TRUE ! Pas de TINY_GL, on cherche MESA_GL CHAR{mem_che%}="mesa_gl.ldg"+CHR$(0) mesa_gl!=TRUE IF @recupere_routines_ldg ! L…, on r‚cupŠre les routines OPEN GL IF ldg_version%=>&H210 ! et c'est la bonne version IF @recupere_routines_screen ! L…, on r‚cupŠre les routine SCREEN initialisation_ecran ! Le type d'‚cran via SCREEN.LDG RETURN TRUE ENDIF ENDIF ENDIF ' mesa_gl!=FALSE n%=@prendre(512,FALSE,3) ! Une fonction est vide il CHAR{n%}="[1][" ! vaut mieux pr‚venir CHAR{n%}=CHAR{n%}+" LDG : TINY/MESA |" CHAR{n%}=CHAR{n%}+" ou : OSMESA + GLUT |" CHAR{n%}=CHAR{n%}+"ou/et: SCREEN |" CHAR{n%}=CHAR{n%}+" non trouv‚s |" CHAR{n%}=CHAR{n%}+"][ DESOLE ]"+CHR$(0) ~@afficher_alerte(n%) libere(*n%) ' RETURN FALSE ! Y'a pas de TINY_GL et pas de MESA_GL ' ENDFUNC ' ------------------------------------------------------------------------------ > FUNCTION recupere_routines_ldg LOCAL retour! ' ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ retour!=FALSE $C+ exldg%=C:ldg_libexec%(L:mem_che%,L:mon_aespb%) $C- IF exldg%=0 ! Des fois que... $C+ exldg%=C:ldg_libexec%(L:mem_che%,L:mon_aespb%) $C- ENDIF IF exldg%=0 RETURN retour! ELSE retour!=TRUE ' CHAR{mem_che%}="information"+CHR$(0) ldg_info%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glBegin"+CHR$(0) glbegin%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glClear"+CHR$(0) glclear%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glClearColor"+CHR$(0) glclearcolor%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3f"+CHR$(0) glcolor3f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDisable"+CHR$(0) gldisable%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEnable"+CHR$(0) glenable%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEnd"+CHR$(0) glend%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLightfv"+CHR$(0) gllightfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLoadIdentity"+CHR$(0) glloadidentity%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glMaterialfv"+CHR$(0) glmaterialfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glMatrixMode"+CHR$(0) glmatrixmode%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glOrtho"+CHR$(0) glortho%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPopMatrix"+CHR$(0) glpopmatrix%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPushMatrix"+CHR$(0) glpushmatrix%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRotatef"+CHR$(0) glrotatef%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexEnvi"+CHR$(0) gltexenvi%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexParameteri"+CHR$(0) gltexparameteri%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTranslatef"+CHR$(0) gltranslatef%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex2f"+CHR$(0) glvertex2f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex3f"+CHR$(0) glvertex3f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="OSMesaCreateLDG"+CHR$(0) osmesacreateldg%=@ldg_find2(exldg%) ' CHAR{mem_che%}="OSMesaDestroyLDG"+CHR$(0) osmesadestroyldg%=@ldg_find2(exldg%) ' CHAR{mem_che%}="max_width"+CHR$(0) glmax_width%=@ldg_find2(exldg%) ' CHAR{mem_che%}="max_height"+CHR$(0) glmax_height%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluLookAt"+CHR$(0) glulookat%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glArrayElement"+CHR$(0) glarrayelement%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glBindTexture"+CHR$(0) glbindtexture%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glCallList"+CHR$(0) glcalllist%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glClearDepth"+CHR$(0) glcleardepth%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4f"+CHR$(0) glcolor4f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3fv"+CHR$(0) glcolor3fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4fv"+CHR$(0) glcolor4fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColorMaterial"+CHR$(0) glcolormaterial%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColorPointer"+CHR$(0) glcolorpointer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glCullFace"+CHR$(0) glcullface%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDeleteTextures"+CHR$(0) gldeletetextures%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDisableClientState"+CHR$(0) gldisableclientstate%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEnableClientState"+CHR$(0) glenableclientstate%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEndList"+CHR$(0) glendlist%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEdgeFlag"+CHR$(0) gledgeflag%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glFlush"+CHR$(0) glflush%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glFrontFace"+CHR$(0) glfrontface%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glFrustum"+CHR$(0) glfrustum%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGenLists"+CHR$(0) glgenlists%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGenTextures"+CHR$(0) glgentextures%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetFloatv"+CHR$(0) glgetfloatv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetIntegerv"+CHR$(0) glgetintegerv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glHint"+CHR$(0) glhint%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glInitNames"+CHR$(0) glinitnames%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIsList"+CHR$(0) glislist%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLightf"+CHR$(0) gllightf%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLightModeli"+CHR$(0) gllightmodeli%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLightModelfv"+CHR$(0) gllightmodelfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLoadMatrixf"+CHR$(0) glloadmatrixf%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLoadName"+CHR$(0) glloadname%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glMaterialf"+CHR$(0) glmaterialf%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glMultMatrixf"+CHR$(0) glmultmatrixf%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glNewList"+CHR$(0) glnewlist%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glNormal3f"+CHR$(0) glnormal3f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glNormal3fv"+CHR$(0) glnormal3fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glNormalPointer"+CHR$(0) glnormalpointer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPixelStorei"+CHR$(0) glpixelstorei%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPolygonMode"+CHR$(0) glpolygonmode%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPolygonOffset"+CHR$(0) glpolygonoffset%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPopName"+CHR$(0) glpopname%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPushName"+CHR$(0) glpushname%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRenderMode"+CHR$(0) glrendermode%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glSelectBuffer"+CHR$(0) glselectbuffer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glScalef"+CHR$(0) glscalef%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glShadeModel"+CHR$(0) glshademodel%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord2f"+CHR$(0) gltexcoord2f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord4f"+CHR$(0) gltexcoord4f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord2fv"+CHR$(0) gltexcoord2fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoordPointer"+CHR$(0) gltexcoordpointer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexImage2D"+CHR$(0) glteximage2d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex4f"+CHR$(0) glvertex4f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex3fv"+CHR$(0) glvertex3fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertexPointer"+CHR$(0) glvertexpointer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glViewport"+CHR$(0) glviewport%=@ldg_find2(exldg%) ' CHAR{mem_che%}="swapbuffer"+CHR$(0) swapbuffer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDeleteLists"+CHR$(0) gldeletelists%=@ldg_find2(exldg%) ' IF mesa_gl! ' CHAR{mem_che%}="glIndexi"+CHR$(0) glindexi%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord1f"+CHR$(0) gltexcoord1f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexImage1D"+CHR$(0) glteximage1d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex2i"+CHR$(0) glvertex2i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glutSolidCone"+CHR$(0) glutsolidcone%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glutSolidSphere"+CHR$(0) glutsolidsphere%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glutSolidTorus"+CHR$(0) glutsolidtorus%=@ldg_find2(exldg%) ' CHAR{mem_che%}="OSDirectScreenCreateLDG"+CHR$(0) osdirectscreencreateldg%=@ldg_find2(exldg%) ' CHAR{mem_che%}="Save_TGA"+CHR$(0) mesa_save_tga%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluBeginCurve"+CHR$(0) glubegincurve%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluBeginSurface"+CHR$(0) glubeginsurface%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluBeginTrim"+CHR$(0) glubegintrim%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluEndCurve"+CHR$(0) gluendcurve%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluEndSurface"+CHR$(0) gluendsurface%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluEndTrim"+CHR$(0) gluendtrim%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluNewQuadric"+CHR$(0) glunewquadric%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluDeleteQuadric"+CHR$(0) gludeletequadric%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluQuadricDrawStyle"+CHR$(0) gluquadricdrawstyle%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluQuadricOrientation"+CHR$(0) gluquadricorientation%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluQuadricCallback"+CHR$(0) gluquadriccallback%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluQuadricNormals"+CHR$(0) gluquadricnormals%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluCylinder"+CHR$(0) glucylinder%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluDisk"+CHR$(0) gludisk%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluPartialDisk"+CHR$(0) glupartialdisk%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluQuadricTexture"+CHR$(0) gluquadrictexture%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluSphere"+CHR$(0) glusphere%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluNewNurbsRenderer"+CHR$(0) glunewnurbsrenderer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluDeleteNurbsRenderer"+CHR$(0) gludeletenurbsrenderer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluLoadSamplingMatrices"+CHR$(0) gluloadsamplingmatrices%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluNurbsProperty"+CHR$(0) glunurbsproperty%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluGetNurbsProperty"+CHR$(0) glugetnurbsproperty%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluNurbsCurve"+CHR$(0) glunurbscurve%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluNurbsSurface"+CHR$(0) glunurbssurface%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluNurbsCallback"+CHR$(0) glunurbscallback%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluPwlCurve"+CHR$(0) glupwlcurve%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluScaleImage"+CHR$(0) gluscaleimage%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluBuild1DMipmaps"+CHR$(0) glubuild1dmipmaps%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluBuild2DMipmaps"+CHR$(0) glubuild2dmipmaps%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluOrtho2D"+CHR$(0) gluortho2d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluPerspective"+CHR$(0) gluperspective%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluPickMatrix"+CHR$(0) glupickmatrix%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluErrorString"+CHR$(0) gluerrorstring%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluGetString"+CHR$(0) glugetstring%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glAccum"+CHR$(0) glaccum%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glAlphaFunc"+CHR$(0) glalphafunc%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glAreTexturesResident"+CHR$(0) glaretexturesresident%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glBitmap"+CHR$(0) glbitmap%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glBlendFunc"+CHR$(0) glblendfunc%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glCallLists"+CHR$(0) glcalllists%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glClearAccum"+CHR$(0) glclearaccum%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glClearIndex"+CHR$(0) glclearindex%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glClearDepth"+CHR$(0) glcleardepth%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glClearStencil"+CHR$(0) glclearstencil%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3b"+CHR$(0) glcolor3b%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3d"+CHR$(0) glcolor3d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3i"+CHR$(0) glcolor3i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3s"+CHR$(0) glcolor3s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3ub"+CHR$(0) glcolor3ub%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3ui"+CHR$(0) glcolor3ui%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3us"+CHR$(0) glcolor3us%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4b"+CHR$(0) glcolor4b%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4d"+CHR$(0) glcolor4d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4i"+CHR$(0) glcolor4i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4s"+CHR$(0) glcolor4s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4ub"+CHR$(0) glcolor4ub%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4ui"+CHR$(0) glcolor4ui%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4us"+CHR$(0) glcolor4us%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3bv"+CHR$(0) glcolor3bv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3iv"+CHR$(0) glcolor3iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3sv"+CHR$(0) glcolor3sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3ubv"+CHR$(0) glcolor3ubv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3uiv"+CHR$(0) glcolor3uiv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor3usv"+CHR$(0) glcolor3usv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4bv"+CHR$(0) glcolor4bv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4iv"+CHR$(0) glcolor4iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4sv"+CHR$(0) glcolor4sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4ubv"+CHR$(0) glcolor4ubv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4uiv"+CHR$(0) glcolor4uiv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColor4usv"+CHR$(0) glcolor4usv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColorMask"+CHR$(0) glcolormask%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColorTableEXT"+CHR$(0) glcolortableext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColorSubTableEXT"+CHR$(0) glcolorsubtableext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glCopyPixels"+CHR$(0) glcopypixels%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glCopyTexImage1D"+CHR$(0) glcopyteximage1d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glCopyTexImage2D"+CHR$(0) glcopyteximage2d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glCopyTexSubImage1D"+CHR$(0) glcopytexsubimage1d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glCopyTexSubImage2D"+CHR$(0) glcopytexsubimage2d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDepthFunc"+CHR$(0) gldepthfunc%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDepthMask"+CHR$(0) gldepthmask%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDepthRange"+CHR$(0) gldepthrange%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDrawArrays"+CHR$(0) gldrawarrays%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDrawBuffer"+CHR$(0) gldrawbuffer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDrawElements"+CHR$(0) gldrawelements%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDrawPixels"+CHR$(0) gldrawpixels%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEvalCoord1d"+CHR$(0) glevalcoord1d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEvalCoord1f"+CHR$(0) glevalcoord1f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEvalCoord1fv"+CHR$(0) glevalcoord1fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEvalCoord2d"+CHR$(0) glevalcoord2d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEvalCoord2f"+CHR$(0) glevalcoord2f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEvalCoord2fv"+CHR$(0) glevalcoord2fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEvalPoint1"+CHR$(0) glevalpoint1%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEvalPoint2"+CHR$(0) glevalpoint2%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEvalMesh1"+CHR$(0) glevalmesh1%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEdgeFlagv"+CHR$(0) gledgeflagv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEdgeFlagPointer"+CHR$(0) gledgeflagpointer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEvalMesh2"+CHR$(0) glevalmesh2%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glFeedbackBuffer"+CHR$(0) glfeedbackbuffer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glFinish"+CHR$(0) glfinish%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glFogf"+CHR$(0) glfogf%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glFogi"+CHR$(0) glfogi%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glFogfv"+CHR$(0) glfogfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glFogiv"+CHR$(0) glfogiv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetBooleanv"+CHR$(0) glgetbooleanv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetColorTableEXT"+CHR$(0) glgetcolortableext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetColorTableParameterivEXT"+CHR$(0) glgetcolortableparameterivext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetColorTableParameterfvEXT"+CHR$(0) glgetcolortableparameterfvext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetError"+CHR$(0) glgeterror%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetLightfv"+CHR$(0) glgetlightfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetLightiv"+CHR$(0) glgetlightiv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetMapfv"+CHR$(0) glgetmapfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetMapiv"+CHR$(0) glgetmapiv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetMaterialfv"+CHR$(0) glgetmaterialfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetMaterialiv"+CHR$(0) glgetmaterialiv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetPixelMapfv"+CHR$(0) glgetpixelmapfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetPixelMapuiv"+CHR$(0) glgetpixelmapuiv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetPixelMapusv"+CHR$(0) glgetpixelmapusv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetPointerv"+CHR$(0) glgetpointerv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetPolygonStipple"+CHR$(0) glgetpolygonstipple%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetString"+CHR$(0) glgetstring%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetTexEnvfv"+CHR$(0) glgettexenvfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetTexEnviv"+CHR$(0) glgettexenviv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetTexGeniv"+CHR$(0) glgettexgeniv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetTexGenfv"+CHR$(0) glgettexgenfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetTexImage"+CHR$(0) glgetteximage%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetTexLevelParameterfv"+CHR$(0) glgettexlevelparameterfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetTexLevelParameteriv"+CHR$(0) glgettexlevelparameteriv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetTexParameterfv"+CHR$(0) glgettexparameterfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetTexParameteriv"+CHR$(0) glgettexparameteriv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIndexd"+CHR$(0) glindexd%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIndexf"+CHR$(0) glindexf%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIndexs"+CHR$(0) glindexs%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIndexub"+CHR$(0) glindexub%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIndexfv"+CHR$(0) glindexfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIndexiv"+CHR$(0) glindexiv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIndexsv"+CHR$(0) glindexsv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIndexubv"+CHR$(0) glindexubv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIndexMask"+CHR$(0) glindexmask%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIndexPointer"+CHR$(0) glindexpointer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glInterleavedArrays"+CHR$(0) glinterleavedarrays%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIsTexture"+CHR$(0) glistexture%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLighti"+CHR$(0) gllighti%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLightiv"+CHR$(0) gllightiv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLightModelf"+CHR$(0) gllightmodelf%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLightModeliv"+CHR$(0) gllightmodeliv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLineWidth"+CHR$(0) gllinewidth%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLineStipple"+CHR$(0) gllinestipple%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glListBase"+CHR$(0) gllistbase%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glLogicOp"+CHR$(0) gllogicop%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glMap1f"+CHR$(0) glmap1f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glMap2f"+CHR$(0) glmap2f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glMapGrid1d"+CHR$(0) glmapgrid1d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glMapGrid1f"+CHR$(0) glmapgrid1f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glMapGrid2d"+CHR$(0) glmapgrid2d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glMapGrid2f"+CHR$(0) glmapgrid2f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glMateriali"+CHR$(0) glmateriali%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glMaterialiv"+CHR$(0) glmaterialiv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glNormal3b"+CHR$(0) glnormal3b%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glNormal3d"+CHR$(0) glnormal3d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glNormal3i"+CHR$(0) glnormal3i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glNormal3s"+CHR$(0) glnormal3s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glNormal3bv"+CHR$(0) glnormal3bv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glNormal3iv"+CHR$(0) glnormal3iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glNormal3sv"+CHR$(0) glnormal3sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPassThrough"+CHR$(0) glpassthrough%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPixelMapfv"+CHR$(0) glpixelmapfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPixelMapuiv"+CHR$(0) glpixelmapuiv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPixelMapusv"+CHR$(0) glpixelmapusv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPixelStoref"+CHR$(0) glpixelstoref%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPixelTransferf"+CHR$(0) glpixeltransferf%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPixelTransferi"+CHR$(0) glpixeltransferi%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPixelZoom"+CHR$(0) glpixelzoom%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPointSize"+CHR$(0) glpointsize%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPolygonOffsetEXT"+CHR$(0) glpolygonoffsetext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPolygonStipple"+CHR$(0) glpolygonstipple%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPopAttrib"+CHR$(0) glpopattrib%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPopClientAttrib"+CHR$(0) glpopclientattrib%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPrioritizeTextures"+CHR$(0) glprioritizetextures%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos2d"+CHR$(0) glrasterpos2d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos2f"+CHR$(0) glrasterpos2f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos2i"+CHR$(0) glrasterpos2i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos2s"+CHR$(0) glrasterpos2s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos3d"+CHR$(0) glrasterpos3d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos3f"+CHR$(0) glrasterpos3f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos3i"+CHR$(0) glrasterpos3i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos3s"+CHR$(0) glrasterpos3s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos4d"+CHR$(0) glrasterpos4d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos4f"+CHR$(0) glrasterpos4f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos4i"+CHR$(0) glrasterpos4i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos4s"+CHR$(0) glrasterpos4s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos2fv"+CHR$(0) glrasterpos2fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos2iv"+CHR$(0) glrasterpos2iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos2sv"+CHR$(0) glrasterpos2sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos3fv"+CHR$(0) glrasterpos3fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos3iv"+CHR$(0) glrasterpos3iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos3sv"+CHR$(0) glrasterpos3sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos4fv"+CHR$(0) glrasterpos4fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos4iv"+CHR$(0) glrasterpos4iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRasterPos4sv"+CHR$(0) glrasterpos4sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glReadBuffer"+CHR$(0) glreadbuffer%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glReadPixels"+CHR$(0) glreadpixels%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRectd"+CHR$(0) glrectd%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRectf"+CHR$(0) glrectf%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRecti"+CHR$(0) glrecti%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRects"+CHR$(0) glrects%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRectfv"+CHR$(0) glrectfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRectiv"+CHR$(0) glrectiv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRectsv"+CHR$(0) glrectsv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glScissor"+CHR$(0) glscissor%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIsEnabled"+CHR$(0) glisenabled%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPushAttrib"+CHR$(0) glpushattrib%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPushClientAttrib"+CHR$(0) glpushclientattrib%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glRotated"+CHR$(0) glrotated%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glScaled"+CHR$(0) glscaled%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glStencilFunc"+CHR$(0) glstencilfunc%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glStencilMask"+CHR$(0) glstencilmask%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glStencilOp"+CHR$(0) glstencilop%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord1d"+CHR$(0) gltexcoord1d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord1i"+CHR$(0) gltexcoord1i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord1s"+CHR$(0) gltexcoord1s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord2d"+CHR$(0) gltexcoord2d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord2i"+CHR$(0) gltexcoord2i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord2s"+CHR$(0) gltexcoord2s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord3d"+CHR$(0) gltexcoord3d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord3f"+CHR$(0) gltexcoord3f%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord3i"+CHR$(0) gltexcoord3i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord3s"+CHR$(0) gltexcoord3s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord4d"+CHR$(0) gltexcoord4d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord4i"+CHR$(0) gltexcoord4i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord4s"+CHR$(0) gltexcoord4s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord1fv"+CHR$(0) gltexcoord1fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord1iv"+CHR$(0) gltexcoord1iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord1sv"+CHR$(0) gltexcoord1sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord2iv"+CHR$(0) gltexcoord2iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord2sv"+CHR$(0) gltexcoord2sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord3fv"+CHR$(0) gltexcoord3fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord3iv"+CHR$(0) gltexcoord3iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord3sv"+CHR$(0) gltexcoord3sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord4fv"+CHR$(0) gltexcoord4fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord4iv"+CHR$(0) gltexcoord4iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoord4sv"+CHR$(0) gltexcoord4sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexGend"+CHR$(0) gltexgend%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexGenf"+CHR$(0) gltexgenf%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexGeni"+CHR$(0) gltexgeni%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexGeniv"+CHR$(0) gltexgeniv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexGenfv"+CHR$(0) gltexgenfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexEnvf"+CHR$(0) gltexenvf%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexEnvfv"+CHR$(0) gltexenvfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexEnviv"+CHR$(0) gltexenviv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexParameterf"+CHR$(0) gltexparameterf%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexParameterfv"+CHR$(0) gltexparameterfv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexParameteriv"+CHR$(0) gltexparameteriv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexSubImage1D"+CHR$(0) gltexsubimage1d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexSubImage2D"+CHR$(0) gltexsubimage2d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTranslated"+CHR$(0) gltranslated%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex2d"+CHR$(0) glvertex2d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex2s"+CHR$(0) glvertex2s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex3d"+CHR$(0) glvertex3d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex3i"+CHR$(0) glvertex3i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex3s"+CHR$(0) glvertex3s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex4d"+CHR$(0) glvertex4d%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex4i"+CHR$(0) glvertex4i%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex4s"+CHR$(0) glvertex4s%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex2fv"+CHR$(0) glvertex2fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex2iv"+CHR$(0) glvertex2iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex2sv"+CHR$(0) glvertex2sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex3iv"+CHR$(0) glvertex3iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex3sv"+CHR$(0) glvertex3sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex4fv"+CHR$(0) glvertex4fv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex4iv"+CHR$(0) glvertex4iv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertex4sv"+CHR$(0) glvertex4sv%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glBlendEquationEXT"+CHR$(0) glblendequationext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glBlendColorEXT"+CHR$(0) glblendcolorext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glVertexPointerEXT"+CHR$(0) glvertexpointerext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glNormalPointerEXT"+CHR$(0) glnormalpointerext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glColorPointerEXT"+CHR$(0) glcolorpointerext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIndexPointerEXT"+CHR$(0) glindexpointerext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexCoordPointerEXT"+CHR$(0) gltexcoordpointerext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glEdgeFlagPointerEXT"+CHR$(0) gledgeflagpointerext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGetPointervEXT"+CHR$(0) glgetpointervext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glArrayElementEXT"+CHR$(0) glarrayelementext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDrawArraysEXT"+CHR$(0) gldrawarraysext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glAreTexturesResidentEXT"+CHR$(0) glaretexturesresidentext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glBindTextureEXT"+CHR$(0) glbindtextureext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glDeleteTexturesEXT"+CHR$(0) gldeletetexturesext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glGenTexturesEXT"+CHR$(0) glgentexturesext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glIsTextureEXT"+CHR$(0) glistextureext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPrioritizeTexturesEXT"+CHR$(0) glprioritizetexturesext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glCopyTexSubImage3DEXT"+CHR$(0) glcopytexsubimage3dext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexImage3DEXT"+CHR$(0) glteximage3dext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glTexSubImage3DEXT"+CHR$(0) gltexsubimage3dext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPointParameterfEXT"+CHR$(0) glpointparameterfext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glPointParameterfvEXT"+CHR$(0) glpointparameterfvext%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos4fMESA"+CHR$(0) glwindowpos4fmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos2iMESA"+CHR$(0) glwindowpos2imesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos2sMESA"+CHR$(0) glwindowpos2smesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos2fMESA"+CHR$(0) glwindowpos2fmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos2dMESA"+CHR$(0) glwindowpos2dmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos2ivMESA"+CHR$(0) glwindowpos2ivmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos2svMESA"+CHR$(0) glwindowpos2svmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos2fvMESA"+CHR$(0) glwindowpos2fvmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos3iMESA"+CHR$(0) glwindowpos3imesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos3sMESA"+CHR$(0) glwindowpos3smesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos3fMESA"+CHR$(0) glwindowpos3fmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos3dMESA"+CHR$(0) glwindowpos3dmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos3ivMESA"+CHR$(0) glwindowpos3ivmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos3svMESA"+CHR$(0) glwindowpos3svmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos3fvMESA"+CHR$(0) glwindowpos3fvmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos4iMESA"+CHR$(0) glwindowpos4imesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos4sMESA"+CHR$(0) glwindowpos4smesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos4dMESA"+CHR$(0) glwindowpos4dmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos4ivMESA"+CHR$(0) glwindowpos4ivmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos4svMESA"+CHR$(0) glwindowpos4svmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glWindowPos4fvMESA"+CHR$(0) glwindowpos4fvmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="glResizeBuffersMESA"+CHR$(0) glresizebuffersmesa%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluUnProject"+CHR$(0) gluunproject%=@ldg_find2(exldg%) ' CHAR{mem_che%}="gluProject"+CHR$(0) gluproject%=@ldg_find2(exldg%) ' ENDIF ' ENDIF RETURN retour! ENDFUNC > FUNCTION recupere_routines_screen LOCAL retour! ' ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ retour!=FALSE CHAR{mem_che%}="screen.ldg"+CHR$(0) $C+ scrldg%=C:ldg_libexec%(L:mem_che%,L:mon_aespb%) $C- IF scrldg%=0 ! Des fois que... $C+ scrldg%=C:ldg_libexec%(L:mem_che%,L:mon_aespb%) $C- ENDIF IF scrldg%=0 RETURN retour! ELSE retour!=TRUE ' CHAR{mem_che%}="screen_init"+CHR$(0) screen_init%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="screen_display"+CHR$(0) screen_display%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="virtual_display"+CHR$(0) virtual_display%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="fix_palette"+CHR$(0) fix_palette%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="screen_detect"+CHR$(0) screen_detect%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="trnfm_8C_to_R8V8B8"+CHR$(0) trnfm_8c_to_r8v8b8%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="trnfm_to_R8V8B8"+CHR$(0) trnfm_to_r8v8b8%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="trnfm_plane_to_VDI"+CHR$(0) trnfm_plane_to_vdi%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="trnfm_ind_pal"+CHR$(0) trnfm_ind_pal%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="screen_display_texture"+CHR$(0) screen_display_texture%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="restore_palette"+CHR$(0) restore_palette%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="screen_display_from_disk"+CHR$(0) screen_display_from_disk%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="Save_TGA"+CHR$(0) screen_save_tga%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="direct_display"+CHR$(0) LET direct_display%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="direct_display_texture"+CHR$(0) LET direct_display_texture%=@ldg_find2(scrldg%) ' CHAR{mem_che%}="resize_R8V8B8"+CHR$(0) resize_r8v8b8%=@ldg_find2(scrldg%) ' ENDIF RETURN retour! ENDFUNC ' > FUNCTION ldg_find2(ldg%) LOCAL retour% ' $C+ retour%=C:ldg_find%(L:mem_che%,L:ldg%) $C- ' ' testfonction(retour%) ' RETURN retour% ' ENDFUNC > PROCEDURE testfonction(adr%) LOCAL n% ' IF adr%=0 n%=@prendre(512,FALSE,3) ! Une fonction est vide il CHAR{n%}="[1][" ! vaut mieux pr‚venir CHAR{n%}=CHAR{n%}+" La fonction : "+CHAR{mem_che%}+"|" CHAR{n%}=CHAR{n%}+" est vide ! |" CHAR{n%}=CHAR{n%}+"][ ATTENTION ]"+CHR$(0) ~@afficher_alerte(n%) libere(*n%) ENDIF ' RETURN ' ------------------------------------------------------------------------------ > PROCEDURE initialisation_ecran LOCAL flag% ' flag%=@screen_detect(vdihandle%,format_screen%)=0 ~@screen_init(vdihandle%,videoinf%,format_screen%,sortie_video%,0) ' IF plan_systeme&=8 fix_palette(sortie_video%,1,vdihandle%) ENDIF ' RETURN ' ****************************************************************************** > FUNCTION creation_scene_open_gl(arb_adr%,obj&,mode%) LOCAL buffer%,width%,height%,px&,py&,buffer_ok!,taille_buffer% ' width%=OB_W(arb_adr%,obj&) height%=OB_H(arb_adr%,obj&) ' ' ' IF arb_adr%=adr_vue_fine% ' IF buffer_tga_phong% ' libere(*buffer_tga_phong%) ' ENDIF ' ENDIF ' ' Cr‚ation d'un buffer 24 bits en RGB IF arb_adr%=adr_vue_fine% buffer_tga_phong%=@osmesacreateldg(vdi_rgb%,gl_unsigned_byte%,width%,height%) buffer_ok!=(buffer_tga_phong%>0) ELSE buffer_tga_flat%=@osmesacreateldg(vdi_rgb%,gl_unsigned_byte%,width%,height%) buffer_ok!=(buffer_tga_flat%>0) ENDIF ' IF buffer_ok! objc_offset(arb_adr%,obj&,px&,py&) ' IF arb_adr%=adr_vue_fine% {videoinf%}=buffer_tga_phong% ELSE {videoinf%}=buffer_tga_flat% ENDIF CARD{ADD(videoinf%,4)}=width% CARD{ADD(videoinf%,6)}=height% CARD{ADD(videoinf%,20)}=px& CARD{ADD(videoinf%,22)}=py& CARD{ADD(videoinf%,24)}=0 CARD{ADD(videoinf%,26)}=0 CARD{ADD(videoinf%,28)}=width% CARD{ADD(videoinf%,30)}=height% ' dessin_de_la_scene_open_gl(width%,height%,mode%) screen_display(vdihandle%,videoinf%) ' IF arb_adr%=adr_vue_fine% IF buffer_tga_phong% osmesadestroyldg libere(*buffer_tga_phong%) go_ph_vers_buffer ENDIF ELSE IF arb_adr%=adr_fenetre% IF buffer_tga_flat% osmesadestroyldg libere(*buffer_tga_flat%) ecran_vers_buffer ENDIF ENDIF ' ELSE graf_mouse(m_on&,0) les_messages_d_erreur(8) RETURN FALSE ENDIF ' RETURN TRUE ' ENDFUNC ' > PROCEDURE dessin_de_la_scene_open_gl(width%,height%,mod%) LOCAL nbp%,nbf%,adr_poi%,adr_fac%,coul| LOCAL lum&,adr_li%,adr_mvt%,h LOCAL cpt_l&,adr_sr%,fin_sr%,adr_pi%,adr_fi% LOCAL num&,univ%,fin_univ%,adr_p1%,adr_p2%,adr_p3% LOCAL adr%,fin_adr%,adr_nor%,fa%,r&,v&,b& LOCAL p1%,p2%,p3%,t,adr_n% LOCAL cx,cy,cz,vx,vy,vz LOCAL x1,y1,z1 LOCAL x2,y2,z2 LOCAL x3,y3,z3 LOCAL xn,yn,zn LOCAL xn1,yn1,zn1 LOCAL xn2,yn2,zn2,r&,v&,b& LOCAL xn3,yn3,zn3,paso,pasp LOCAL xrot,yrot,zrot ' -------------------------- CLR cpt_l& adr_sr%=source% fin_sr%=@adresse_source(nombre_de_source&) DO IF BYTE{adr_sr%}=1 adr_li%=ADD(light_position%,MUL(16,cpt_l&)) SINGLE{adr_li%}=ROUND(-SINGLE{ADD(adr_sr%,8)},3) SINGLE{ADD(adr_li%,4)}=ROUND(SINGLE{ADD(adr_sr%,12)},3) SINGLE{ADD(adr_li%,8)}=ROUND(-SINGLE{ADD(adr_sr%,16)},3) SINGLE{ADD(adr_li%,12)}=1 INC cpt_l& ENDIF ADD adr_sr%,taille_source& EXIT IF cpt_l&=10 arret_dessin!=BTST(BIOS(&HB,-1),cl_alternate&) EXIT IF arret_dessin! LOOP WHILE adr_sr%0 xn1=xn1/t yn1=yn1/t zn1=zn1/t ENDIF adr_n%=ADD(adr_nor%,MUL(14,p2%)) ! Normale au point 2 xn2={ADD(adr_n%,2)} yn2={ADD(adr_n%,6)} zn2={ADD(adr_n%,10)} t=SQR(xn2*xn2+yn2*yn2+zn2*zn2) IF t<>0 xn2=xn2/t yn2=yn2/t zn2=zn2/t ENDIF adr_n%=ADD(adr_nor%,MUL(14,p3%)) ! Normale au point 3 xn3={ADD(adr_n%,2)} yn3={ADD(adr_n%,6)} zn3={ADD(adr_n%,10)} t=SQR(xn3*xn3+yn3*yn3+zn3*zn3) IF t<>0 xn3=xn3/t yn3=yn3/t zn3=zn3/t ENDIF ' glnormal3f(ROUND(xn1,3),ROUND(yn1,3),ROUND(zn1,3)) glvertex3f(ROUND(x1,3),ROUND(y1,3),ROUND(z1,3)) ' glnormal3f(ROUND(xn3,3),ROUND(yn3,3),ROUND(zn3,3)) glvertex3f(ROUND(x3,3),ROUND(y3,3),ROUND(z3,3)) ' glnormal3f(ROUND(xn2,3),ROUND(yn2,3),ROUND(zn2,3)) glvertex3f(ROUND(x2,3),ROUND(y2,3),ROUND(z2,3)) ' ELSE BMOVE adr_p1%,ADD(tracer_lestrois_tab%,16),12 BMOVE adr_p2%,ADD(tracer_lestrois_tab%,28),12 BMOVE adr_p3%,ADD(tracer_lestrois_tab%,40),12 do_all(tracer_lestrois_tab%) xn={ADD(tracer_lestrois_tab%,16)}/1024 ! Normale normalis‚e yn={ADD(tracer_lestrois_tab%,20)}/1024 ! et centr‚e sur zn={ADD(tracer_lestrois_tab%,24)}/1024 ! la facette ' glnormal3f(ROUND(xn,3),ROUND(yn,3),ROUND(zn,3)) glvertex3f(ROUND(x1,3),ROUND(y1,3),ROUND(z1,3)) ' glnormal3f(ROUND(xn,3),ROUND(yn,3),ROUND(zn,3)) glvertex3f(ROUND(x3,3),ROUND(y3,3),ROUND(z3,3)) ' glnormal3f(ROUND(xn,3),ROUND(yn,3),ROUND(zn,3)) glvertex3f(ROUND(x2,3),ROUND(y2,3),ROUND(z2,3)) ' ENDIF ' ADD adr%,6 arret_dessin!=BTST(BIOS(&HB,-1),cl_alternate&) EXIT IF arret_dessin! LOOP WHILE adr% FUNCTION gl_light(lum&) $S&,$S> SELECT lum& CASE 0 RETURN gl_light0% CASE 1 RETURN gl_light1% CASE 2 RETURN gl_light2% CASE 3 RETURN gl_light3% CASE 4 RETURN gl_light4% CASE 5 RETURN gl_light5% CASE 6 RETURN gl_light6% CASE 7 RETURN gl_light7% CASE 8 RETURN gl_light8% CASE 9 RETURN gl_light9% ENDSELECT ENDFUNC > PROCEDURE couleur_pour_un_point_open_gl(co&,adr_p%,adr_f%) LOCAL c0,c1,c2 LOCAL cr&,cv&,cb& ' ' On commence par mettre des valeurs par d‚faut histoire d'avoir un rendu ' pas trop mauvais lorsqu'aucun paramŠtre n'est plac‚. ' SINGLE{specular%}=0 ! \ Specular rouge SINGLE{ADD(specular%,4)}=0 ! | Specular vert SINGLE{ADD(specular%,8)}=0 ! | Specular bleu SINGLE{ADD(specular%,12)}=1 ! / ? ' SINGLE{diffuse%}=0.8 ! \ Ambiente Rouge SINGLE{ADD(diffuse%,4)}=0.8 ! | Ambiente Vert SINGLE{ADD(diffuse%,8)}=0.8 ! | Ambiente Bleu SINGLE{ADD(diffuse%,12)}=1 ! / ? ' SINGLE{ambient%}=1 ! \ SINGLE{ADD(ambient%,4)}=0 ! | Objet rouge SINGLE{ADD(ambient%,8)}=0 ! | par d‚faut SINGLE{ADD(ambient%,12)}=1 ! / ' IF BTST(BYTE{ADD(adr_p%,3)},5) ! COLOR ' Couleur de l'objet pris dans pigment SINGLE{ambient%}=ROUND(BYTE{ADD(adr_p%,92)}/255,3) SINGLE{ADD(ambient%,4)}=ROUND(BYTE{ADD(adr_p%,93)}/255,3) SINGLE{ADD(ambient%,8)}=ROUND(BYTE{ADD(adr_p%,94)}/255,3) SINGLE{ADD(ambient%,12)}=ROUND(BYTE{ADD(adr_p%,95)}/255,3) ' ELSE IF BTST(BYTE{ADD(adr_p%,3)},6) ! QUICK COLOR ' Sinon couleur rapide de l'objet dans pigment SINGLE{ambient%}=ROUND(BYTE{ADD(adr_p%,98)}/255,3) SINGLE{ADD(ambient%,4)}=ROUND(BYTE{ADD(adr_p%,99)}/255,3) SINGLE{ADD(ambient%,8)}=ROUND(BYTE{ADD(adr_p%,100)}/255,3) SINGLE{ADD(ambient%,12)}=ROUND(BYTE{ADD(adr_p%,101)}/255,3) ' ELSE ' Sinon, couleur de l'objet … l'‚cran inquire_color_representation(co&,cr&,cv&,cb&,vdihandle%) SINGLE{ambient%}=ROUND(cr&/1000,3) SINGLE{ADD(ambient%,4)}=ROUND(cv&/1000,3) SINGLE{ADD(ambient%,8)}=ROUND(cb&/1000,3) ' ENDIF IF BTST(BYTE{ADD(adr_f%,2)},4) ' Co‚ficient de r‚fl‚xion ambiante pour l'objet SINGLE{diffuse%}=ROUND(BYTE{ADD(adr_f%,16)}/255,3) SINGLE{ADD(diffuse%,4)}=ROUND(BYTE{ADD(adr_f%,17)}/255,3) SINGLE{ADD(diffuse%,8)}=ROUND(BYTE{ADD(adr_f%,18)}/255,3) ENDIF IF BTST(BYTE{ADD(adr_f%,2)},5) ' Co‚ficient Specular/Roughness SINGLE{specular%}=ROUND(BYTE{ADD(adr_f%,21)}/100,3) SINGLE{specular%}=ROUND(ROUND(SINGLE{specular%},3)*ROUND(BYTE{ADD(adr_f%,22)}/100,3),3) SINGLE{ADD(specular%,4)}=SINGLE{specular%} SINGLE{ADD(specular%,8)}=SINGLE{specular%} ENDIF ' RETURN ' ****************************************************************************** ' ****************************************************************************** > PROCEDURE dessin_time_line(tlx&,tly&,tlw&,tlh&) LOCAL linx&,liny&,linw&,linh& LOCAL lt&,cplt& ' objc_offset(adr_animation%,anime004&,linx&,liny&) ADD linx&,2 ADD liny&,2 linw&=OB_W(adr_animation%,anime004&) linh&=OB_H(adr_animation%,anime004&) SUB linw&,4 SUB linh&,4 ' ' set_clipping_rectangle(1,tlx&,tly&,PRED(ADD(tlx&,tlw&)),PRED(ADD(tly&,tlh&)),0,0) ' set_writing_mode(mode_remplace|) set_remplissage(2,8,blanc&,-1) graf_mouse(m_off&,0) vdi_11(1,linx&,liny&,PRED(ADD(linx&,linw&)),PRED(ADD(liny&,linh&)),0,0,0,0) ' set_type_de_ligne(noir&,1,0,0,0,-1) line(ADD(linx&,8),SUB(PRED(ADD(liny&,linh&)),2),PRED(ADD(linx&,linw&)),SUB(PRED(ADD(liny&,linh&)),2)) ' lt&=ADD(linx&,8) CLR cplt& DO IF cplt&<10 line(lt&,ADD(liny&,DIV(linh&,5)),lt&,SUB(PRED(ADD(liny&,linh&)),2)) INC cplt& ELSE line(lt&,ADD(liny&,2),lt&,SUB(PRED(ADD(liny&,linh&)),2)) CLR cplt& ENDIF ADD lt&,10 LOOP WHILE lt& PROCEDURE sauver_image_tga_type_2 LOCAL taille_tga%,lar_gou&,hau_gou& LOCAL buffer_tga%,tgax&,tgay&,adr_src%,adr_des% LOCAL ro|,ve|,bl| ' CHAR{masque%}="tga"+CHR$(0) CHAR{msq%}="tgk"+CHR$(0) definition_fichier(adr_parametres%,cheebs&,nom_divers%,FALSE,TRUE,-1) IF LEN(CHAR{nom_divers%})<>0 membfill(mem_che%,512,0) CHAR{mem_che%}=CHAR{disque%}+CHAR{path%}+CHAR{nom_divers%}+CHR$(0) ' lar_gou&=OB_W(adr_vue_fine%,gourphon&) ! Largeur de la fenˆtre hau_gou&=OB_H(adr_vue_fine%,gourphon&) ! Hauteur de la fenˆtre ' taille_tga%=ADD(MUL(MUL(lar_gou&,hau_gou&),3),18) buffer_tga%=@prendre(taille_tga%,TRUE,3) ' ' Tous les mots mots sont invers‚s (Lo/Hi) BYTE{ADD(buffer_tga%,0)}=0 ! 0= entˆte, taille 17 BYTE{ADD(buffer_tga%,1)}=0 ! Pas de palette BYTE{ADD(buffer_tga%,2)}=2 ! TGA 2 RGB non compress‚e BYTE{ADD(buffer_tga%,3)}=0 ! \ BYTE{ADD(buffer_tga%,4)}=0 ! \ BYTE{ADD(buffer_tga%,5)}=0 ! > Ignor‚ (pas de palette) BYTE{ADD(buffer_tga%,6)}=0 ! / BYTE{ADD(buffer_tga%,7)}=0 ! / BYTE{ADD(buffer_tga%,8)}=0 ! \ Position de l'image en X BYTE{ADD(buffer_tga%,9)}=0 ! / 0 BYTE{ADD(buffer_tga%,10)}=0 ! \ Position de l'image en Y BYTE{ADD(buffer_tga%,11)}=0 ! / 0 BYTE{ADD(buffer_tga%,12)}=BYTE(lar_gou&) ! \ Largeur de l'image BYTE{ADD(buffer_tga%,13)}=BYTE(ROR&(lar_gou&,8)) ! / en mode UNTEL (Lo/Hi) BYTE{ADD(buffer_tga%,14)}=BYTE(hau_gou&) ! \ Hauteur de l'image BYTE{ADD(buffer_tga%,15)}=BYTE(ROR&(hau_gou&,8)) ! / en mode UNTEL (Lo/Hi) BYTE{ADD(buffer_tga%,16)}=24 ! Nombre de plan de l'image BYTE{ADD(buffer_tga%,17)}=32 ! D‚part : en bas … gauche ' adr_des%=ADD(buffer_tga%,18) adr_src%=ph_go_virtuel% ' CLR tgay& DO CLR tgax& DO ' $S&,$S> SELECT plan_systeme& CASE 1 CASE 2 CASE 4 CASE 8 CASE 15,16 ro|=ROR(CARD{adr_src%},11) AND &X11111 ve|=ROR(CARD{adr_src%},5) AND &X111111 bl|=CARD{adr_src%} AND &X11111 ADD adr_src%,2 ' BYTE{adr_des%}=ro| INC adr_des% BYTE{adr_des%}=ve| INC adr_des% BYTE{adr_des%}=bl| INC adr_des% CASE 24 ro|=BYTE{adr_src%} INC adr_src% ve|=BYTE{adr_src%} INC adr_src% bl|=BYTE{adr_src%} INC adr_src% ' BYTE{adr_des%}=ro| INC adr_des% BYTE{adr_des%}=ve| INC adr_des% BYTE{adr_des%}=bl| INC adr_des% CASE 32 INC adr_src% ro|=BYTE{adr_src%} INC adr_src% ve|=BYTE{adr_src%} INC adr_src% bl|=BYTE{adr_src%} INC adr_src% ' BYTE{adr_des%}=ro| INC adr_des% BYTE{adr_des%}=ve| INC adr_des% BYTE{adr_des%}=bl| INC adr_des% ENDSELECT ' INC tgax& LOOP WHILE tgax& PROCEDURE gestion_des_erreurs les_messages_d_erreur(ERR) ON ERROR GOSUB gestion_des_erreurs CLOSE ~@nouvelle_scene(TRUE) RESUME retour_des_erreurs RETURN > PROCEDURE les_messages_d_erreur(nn&) LOCAL n% n%=@prendre(512,FALSE,3) $S&,$S> SELECT nn& CASE -66 CHAR{n%}="[3][Ce n'est pas un |programme binaire.|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE -49 CHAR{n%}="[3][Pas d'autres donn‚es.|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE -46 CHAR{n%}="[3][Erreur de lecteur de disquette.|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE -40 CHAR{n%}="[3][Adresse non valable.|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE -39 CHAR{n%}="[3][La m‚moire est pleine.|Lancement de module annul‚e ][D‚sol‚]"+CHR$(0) CASE -37 CHAR{n%}="[3][Handle non valable.|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE -36 CHAR{n%}="[3][AccŠs impossible.|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE -35 CHAR{n%}="[3][Trop de fichiers ouverts.|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE -34 CHAR{n%}="[3][Chemin de s‚lection non trouv‚.|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE -33 CHAR{n%}="[3][Fichier non trouv‚|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE -32 CHAR{n%}="[3][Num‚ro de fonction incorrecte|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 0 CHAR{n%}="[3][Division par 0|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 1 CHAR{n%}="[3][D‚bordement|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 2 CHAR{n%}="[3][Le nombre n'est pas un Interger|-2147483648..2147483647|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 3 CHAR{n%}="[3][Le nombre n'est pas un octet|0..255|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 4 CHAR{n%}="[3][Le nombre n'est pas un mot|-32768..32767|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 5 CHAR{n%}="[3][Racine carr‚ d'un nombre|n‚gatif impossible|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 6 CHAR{n%}="[3][Logarithme d'un nombre|inf‚rieur … z‚ro impossible|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 7 CHAR{n%}="[3][Erreur inconnue|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 8 ~@afficher_alerte(adr_memoire%) CASE 9 CHAR{n%}="[3][Fonction ou instruction|impossible|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 22 CHAR{n%}="[3][Fichier d‚j… ouvert|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 23 CHAR{n%}="[3][Mauvais num‚ro de fichier|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 24 CHAR{n%}="[3][Fichier non ouvert|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 26 CHAR{n%}="[3][Fin de fichier atteinte|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 34 CHAR{n%}="[3][Trop peu de donn‚es|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 35 CHAR{n%}="[3][Donn‚e non num‚rique|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 37 CHAR{n%}="[3][Disque plein|Faites de la place|ou changez de disque][ Merci ]"+CHR$(0) CASE 42 CHAR{n%}="[3][Trop peu de paramŠtres|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 43 CHAR{n%}="[3][Expression trop complexe|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 44 CHAR{n%}="[3][Fonction ind‚finie|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 45 CHAR{n%}="[3][Trop de paramŠtres|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 46 CHAR{n%}="[3][ParamŠtre inexact|ce doit ˆtre un nombre|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 47 CHAR{n%}="[3][ParamŠtre inexact|ce doit ˆtre une chaine|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 61 CHAR{n%}="[3][RESERVE erreur|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 64 CHAR{n%}="[3][Erreur dans pointeur|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 67 CHAR{n%}="[3][Erreur ASIN/ACOS|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 90 CHAR{n%}="[3][Erreur dans |variables locales|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 102 CHAR{n%}="[3][Erreur bus|adressage incorrecte|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 103 CHAR{n%}="[3][Erreur d'adresse|adresse de mot impaire|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 104 CHAR{n%}="[3][Ex‚cution d'une instruction 680xx|ne convenant pas|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 105 CHAR{n%}="[3][Division par z‚ro|en langage machine|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 106 CHAR{n%}="[3][exception CHK|interruption 680xx|par instruction CHK|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 107 CHAR{n%}="[3][exception TRAPV|interruption 680xx|par instruction TRAPV|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 108 CHAR{n%}="[3][Interruption 680xx|par ex‚cution d'une|instruction privil‚gi‚e|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 109 CHAR{n%}="[3][Exception trace|interruption trace avec 680xx|Pr‚venir l'auteur][ Merci ]"+CHR$(0) CASE 997 CHAR{n%}="[3][Le module TEXBASSE n'est|pas pr‚sent … cot‚ de|EB Model 3.][ D‚sol‚ ]"+CHR$(0) CASE 998 CHAR{n%}="[3][Le module CSG n'est|pas pr‚sent … cot‚ de|EB Model 3.][ D‚sol‚ ]"+CHR$(0) CASE 999 CHAR{n%}="[3][Le module CSG vient|de stoper son travail|sans pr‚venir.][ D‚sol‚ ]"+CHR$(0) DEFAULT CHAR{n%}="[3][Erreur "+STR$(nn&)+" inconnue|Notez son num‚ro |et pr‚venez l'auteur][ Merci ]"+CHR$(0) ENDSELECT ecriture_log_erreur(n%) ~@form_alert(1,n%) libere(*n%) RETURN > PROCEDURE ecriture_log_erreur(n%) OPEN "o",#1,CHAR{eb_temp%}+"\erreur.log" PRINT #1,";----------------------------------------------------------" PRINT #1,";" PRINT #1,"; Fichier LOG en cas d erreur grave sur EB Model 3" PRINT #1,"; Ce fichier n est utile que pour le developpeur:" PRINT #1,"; Il liste differentes adresses et leur contenue" PRINT #1,"; ce qui me permetra d analyser le probleme et" PRINT #1,"; surtout de le resoudre." PRINT #1,";" IF version% PRINT #1,"; (c) BARANGER Emmanuel - EB_MODEL "+CHAR{version%}+" du "+CHAR{date%} ELSE PRINT #1,"; (c) BARANGER Emmanuel - EB_MODEL 3" ENDIF PRINT #1,";" PRINT #1,"; Erreur : ";ERR PRINT #1,"; Type : ";CHAR{n%} PRINT #1,";----------------------------------------------------------" PRINT #1,"; disque_systeme% = ";CHAR{disque_systeme%} PRINT #1,"; path_systeme% = ";CHAR{path_systeme%} PRINT #1,"; mem_che% = ";CHAR{mem_che%} PRINT #1,"; mem_nom% = ";CHAR{mem_nom%} PRINT #1,"; eb_temp% = ";CHAR{eb_temp%} PRINT #1,"; flag_creation_eb_temp!= ";flag_creation_eb_temp! PRINT #1,"; precalcul% = ";precalcul% PRINT #1,"; station% = ";station% PRINT #1,"; etendue% = ";etendue% PRINT #1,"; xmax& = ";xmax& PRINT #1,"; ymax& = ";ymax& IF haute_resolution! PRINT #1,"; haute_resolution! = TRUE" ELSE PRINT #1,"; haute_resolution! = FALSE" ENDIF IF mode_entrelace! PRINT #1,"; mode_entrelace! = TRUE" ELSE PRINT #1,"; mode_entrelace! = FALSE" ENDIF IF true_color! PRINT #1,"; true_color! = TRUE" ELSE PRINT #1,"; true_color! = FALSE" ENDIF PRINT #1,"; maxcol& = ";maxcol& PRINT #1,"; plan_systeme& = ";plan_systeme& PRINT #1,"; ecran% = ";ecran% PRINT #1,"; physique% = ";physique% PRINT #1,"; lecteur% = ";lecteur% PRINT #1,"; quartecran% = ";quartecran% PRINT #1,"; taille_preview_ecran% = ";taille_preview_ecran% PRINT #1,"; flag_creation_eb_temp!= ";flag_creation_eb_temp! PRINT #1,";" PRINT #1,";----------------------------------------------------------" CLOSE #1 RETURN ' ******************************************************************************** ' **** (C)BARANGER E. 1994/1995/1996/1997/1998/1999/2000/2001/2004/2005/2006 **** ' ********************************************************************************