| OK, maybe you think Plane-Maker is not good enough for you and
you want to write your own aircraft editor.
Maybe you want to know the format of the X-Plane aircraft file-format
for some other devious purpose.
In either event, here is the format, with sample source code,
of the the ".ACF" file format used by X-Plane.
Some of the data in this file is figured out by X-Plane, so you
can leave that data at "zero" if you write your own program to
fill in the file.
We will leave it to you to figure out what data needs to be filled
in by looking at the aircraft that already come with X-Plane.
Here is the source code from Plane-Maker to open an aircraft:
if(inf_open(msc.plane_path[0],tACF,acf_version,Xfals))
{
got_a_plane=Xtrue;
inf[inf_use].read((char*)&pln[0],sizeof(pln[0]));
inf[inf_use].close();
}
"acf_version" is 600 as of this writing.
tACF is simply an enum.
Here is "inf_open" code to open the file:
xint inf_open(xchr C_path[strDIM],xint ftype,xint version,xint
alert_bad_version)
{
inf[inf_use].open(C_path,ios::binary|ios::in);
inf_is_bin[inf_use]=Xtrue;
xchr first_char;
inf[inf_use].read((char*)&first_char,sizeof(xchr));
if(first_char!='a'&&first_char!='i')return Xfals;
return inf[inf_use].good();
}
"xint" is obviously "INT"
"xflt" is obviously "FLOAT"
"xchr" is obviously "CHAR"
"Xfals" is obviously "FALSE"
etc.
As you see, the first charactor of the file is either an a or
i, depending on whether the file was saved on an Apple or IBM.
OK, so now that you have the file opened and the first character
read in, it is time to simple read in the AIRCRAFT STRUCTRUE,
and here it is:
enum
{
prop1EN= 0,
prop2EN= 1,
prop3EN= 2,
prop4EN= 3,
prop5EN= 4,
prop6EN= 5,
prop7EN= 6,
prop8EN= 7,
wng1lEN= 8,
wng1rEN= 9,
wng2lEN=10,
wng2rEN=11,
wng3lEN=12,
wng3rEN=13,
wng4lEN=14,
wng4rEN=15,
hstblEN=16,
hstbrEN=17,
vstb1EN=18,
vstb2EN=19,
pyln1EN=20,
pyln2EN=21,
pyln3EN=22,
pyln4EN=23,
pyln5EN=24,
pyln6EN=25,
pyln7EN=26,
pyln8EN=27,
fuse_EN=28,
nace1EN=29,
nace2EN=30,
nace3EN=31,
nace4EN=32,
nace5EN=33,
nace6EN=34,
nace7EN=35,
nace8EN=36,
misc1EN=37,
misc2EN=38,
fair1EN=39,
fair2EN=40,
fair3EN=41,
fair4EN=42,
fair5EN=43,
gear1EN=44,
gear2EN=45,
gear3EN=46,
gear4EN=47,
gear5EN=48,
partDIM=49
};
#define body_rDIM 18
#define body_sDIM 20
#define idDIM 5
#define nameDIM 40
#define strDIM 500
struct planestruct
{
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???VIEW???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xchr tailnum[nameDIM]; // ID
xchr author [ strDIM]; // author
xchr descrip[ strDIM]; // description
xflt size_x,size_z; // shadow size, and viewing distance size
xint is_APL,actype,HUDtype,asi_kts,cockpit_type;
xint has_fd,has_stallwarn,has_litemap_tex;
xflt peX,peY,peZ;
xflt Vso,Vs,Vfe,Vno,Vne,Mmo,Gneg,Gpos,est_Vs;
xflt yawstringx,yawstringy;
xflt HUD_cntrx ,HUD_cntry ;
xflt HUD_delx ,HUD_dely ;
xint has_lanlite1; xflt lanlite1X,lanlite1Y,lanlite1Z; xflt lanlite_the;
xint has_lanlite2; xflt lanlite2X,lanlite2Y,lanlite2Z;
xint has_lanlite3; xflt lanlite3X,lanlite3Y,lanlite3Z;
xint has_fuserb1 ; xflt fuserb1X ,fuserb1Y ,fuserb1Z;
xint has_fuserb2 ; xflt fuserb2X ,fuserb2Y ,fuserb2Z;
xint has_taillite; xflt tailliteX,tailliteY,tailliteZ;
xint has_navlites;
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???PANEL??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xint ins_type[insDIM]; // instrument definition
xflt ins_size[insDIM]; // 1.0 is DEFAULT.. not pixels because
confusion of width vs height, which dimension we are referring
to, etc.
xflt ins_x [insDIM]; // loc
xflt ins_y [insDIM]; // loc
xflt ins_delx[insDIM]; // size of bitmap for offset, since the
"location"
xflt ins_dely[insDIM]; // is the CENTER of the instrument.
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???FORCE-FEEDBACK?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xint ff_hydraulic;
xint ff_stickshaker;
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???ENGINE?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xint numen,auto_featherEQ;
xflt throtmax_FWD ,throtmax_REV ;
xflt omegaminRSC ,omegamaxRSC ;
xflt omegamingreenRSC,omegamaxgreenRSC;
xflt pmax,tmax,burnerinc;
xflt critalt,mpmax,gearrat;
xflt face_jet,face_rocket,spooltime,max_mach_eff;
xflt fmax_sl,fmax_opt,fmax_vac,h_opt;
xflt tip_mach_des_50,tip_mach_des_100;
xflt rotor_mi_rat,tip_weight,trotor_rat;
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???PROP???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xint en_type [8]; // engine type... diff types allowed for B-36,
NASP concepts, Mars liquid rocket take-off assist, etc. etc. etc.
xint revthrust_eq[8]; // better organization to do it this way
xint prop_type [8]; // prop type
xflt prop_dir [8]; // 1.0=CW, -1.0=CCW, float so we can multiply
effects by floats
xflt num_blades [8]; // float so we can multiply effects by floats
xflt SFC [8]; // SFC
xflt minpitch [8]; // by governor
xflt maxpitch [8]; // by governor
xflt revpitch [8]; // in reverse
xflt sidecant [8]; // this is physical geometry,
xflt vertcant [8]; // built into planes & helos and changed with
thrust vector
xflt miprop_rpm [8]; // MI for changing prop RPM
xflt miprop_pitch[8]; // MI for changing prop pitch (needed for
helo cyclic)
xflt discarea [8]; // for "total" propwash
xflt ringarea [8][10]; // area each ring of prop
xflt bladesweep [8][10]; // blade sweep for scimitar props
xflt des_rpm_prp [8]; // design point
xflt des_kts_prp [8]; // design point
xflt des_kts_acf [8]; // design point
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???PARTS (WINGS, BODIES, GEAR)????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xint part_eq [partDIM];
xchr Rafl0 [partDIM][nameDIM]; // file, not path
xchr Rafl1 [partDIM][nameDIM]; // file, not path
xchr Tafl0 [partDIM][nameDIM]; // file, not path
xchr Tafl1 [partDIM][nameDIM]; // file, not path
xint els [partDIM];
xflt Xarm [partDIM];
xflt Yarm [partDIM];
xflt Zarm [partDIM];
xflt X_body_aero[partDIM]; // body aero center offset from it's
reference
xflt Y_body_aero[partDIM]; // used for force build-up
xflt Z_body_aero[partDIM];
xflt Croot [partDIM];
xflt Ctip [partDIM];
xflt dihed [partDIM];
xflt sweep1 [partDIM];
xflt sweep2 [partDIM];
xflt sweepnow [partDIM];
xint varsweepEQ [partDIM];
xflt semilen_SEG[partDIM]; // semilen this segment only
xflt semilen_JND[partDIM]; // semilen of the JOINED wing segments,
all JOINED SEGMENTS, for AR and CDi and ground effect, etc.
xflt e [partDIM];
xflt AR [partDIM];
xflt al_D_al0 [partDIM];
xflt cl_D_cl0 [partDIM];
xflt cm_D_cm0 [partDIM];
xflt delta_fac [partDIM];
xflt spec_wash [partDIM];
xflt alpha_max [partDIM];
xflt slat_effect[partDIM];
xflt s [partDIM][10]; // s for each element for foils, and FRONT,
SIDE, TOP for BODIES.
xflt mac [partDIM][10];
xflt anginc [partDIM][10];
xint ail1 [partDIM][10];
xint ail2 [partDIM][10];
xint splr [partDIM][10];
xint flap [partDIM][10]; xint flapEQ;
xint slat [partDIM][10]; xint slatEQ;
xint sbrk [partDIM][10]; xint sbrkEQ;
xint drud [partDIM][10];
xint elev [partDIM][10];
xint rudd [partDIM][10];
xint in_downwash[partDIM][partDIM][10];
xflt body_r [partDIM];
xflt body_X [partDIM][body_sDIM][body_rDIM];
xflt body_Y [partDIM][body_sDIM][body_rDIM];
xflt body_Z [partDIM][body_sDIM][body_rDIM];
xint gear_type [partDIM];
xflt gear_latE [partDIM],gear_lonE[partDIM],gear_axiE[partDIM];
// extended
xflt gear_latR [partDIM],gear_lonR[partDIM],gear_axiR[partDIM];
// retracted
xflt gear_latN [partDIM],gear_lonN[partDIM],gear_axiN[partDIM];
// now
xflt gear_leglen[partDIM]; // gear param
xflt gear_tirrad[partDIM]; // gear param
xflt gearcon [partDIM]; // gear param
xflt geardmp [partDIM]; // gear param
xflt gearstatdef[partDIM]; // static deflection... the gear TIRE
LOCATION IS OFFSET DOWN BY THIS MUCH IN X-PLANE since people ALWAYS
enter gear location UNDER STATIC DEFLECTION!
xflt gear_def [partDIM]; // current deflection
xflt gear_deploy[partDIM]; // landing gear deployment, 0.0->1.0
xflt gear_xnodef[partDIM]; // gear unloaded location
xflt gear_ynodef[partDIM]; // gear unloaded location
xflt gear_znodef[partDIM]; // gear unloaded location
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???BODIES?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xflt fuse_cd;
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???CONTROLS???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xflt ail1_crat,ail1_up,ail1_dn ,lail1def,rail1def;
xflt ail2_crat,ail2_up,ail2_dn ,lail2def,rail2def;
xflt elev_crat,elev_up,elev_dn ,lhstbdef,rhstbdef;
xflt rudd_crat,rudd_lr ,rudd1def,rudd2def;
xflt splr_crat,splr_up ,lsplrdef,rsplrdef;
xflt drud_crat,drud_ud ,ldruddef,rdruddef;
xflt sbrk_crat,sbrk_up ;
xflt flap_crat,flap_dn[7] ,lflapdef,rflapdef;
xflt hstb_trim_up,hstb_trim_dn ,hstb_trim_def ;
xint hstabtype,vstabtype,flap_type,con_smooth;
xflt flap_cl,flap_cd,flap_cm;
xint flap_detents;
xflt flap_deftime;
xflt slat_inc;
xflt blownflap_addspeed;
xflt blownflap_throtred;
xflt blownflap_minengag;
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???LANDING GEAR???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xint gear_retract,is_taildragger,gear_is_skid;
xflt gear_deptime,nwsteerdeg1,nwsteerdeg2,nwsteerspd;
xflt water_rud_longarm;
xflt water_rud_area;
xflt water_rud_maxdef;
xflt h_eqlbm,the_eqlbm;
xint gear_door_use [10] ; // has gear door
xflt gear_door_loc [10] [3]; // door location (for reference-point
of door)
xflt gear_door_geo [10][4][3]; // door geo, 4 corners
xflt gear_door_axi_rot[10] ; // door axis of rotation ("heading"
of axis)
xflt gear_door_ext_ang[10] ; // door extended angle
xflt gear_door_ret_ang[10] ; // door retracted angle
xflt gear_door_ang_now[10] ; // door current angle, not in flite
since it is geo and this is a nice place to keep all the door
geo.
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???WEIGHT AND BALANCE?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xflt cgY,cgZ,Jxx_unitmass,Jyy_unitmass,Jzz_unitmass;
xflt m_empty,m_displaced,m_max,m_fuel,m_jettison,m_displaced_y;
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???SPECIAL CONTROLS???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xflt jato_theta,jato_thrust,jato_dur,jato_sfc,jato_Y,jato_Z;
xflt brake_area,brake_Y,brake_Z;
xflt chute_area,chute_Y,chute_Z;
xflt ail1pitch,ail1flaps;
xflt ail2pitch,ail2flaps;
xflt stabroll,stabhdng,ail2vmax;
xflt tvec_ptch,tvec_roll,tvec_hdng;
xflt diff_thro_with_hdng;
xint arrestingEQ;
xint antiiceEQ;
xint bitchinbettyEQ;
xint gearhornEQ;
xint autosbrkEQ;
xint autofbrkEQ;
xint autosweepEQ;
xint autoslatEQ;
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???VTOL CONTROLS??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xint vectEQ;
xflt vectarm;
xflt cyclic_elev,cyclic_ailn,delta3;
xflt puffL,puffM,puffN;
xflt tail_with_coll;
xflt diff_coll_with_roll;
xflt diff_coll_with_hdng;
xflt diff_cycl_with_hdng;
xint auto_rpm_with_tvec;
xflt rotor_trim_max,rotor_trim_ptch_cyc_rat;
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???ASTAB STUFF????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xflt AShiV,ASloV;
xflt ASmaxp1,ASp1,ASmaxp2,ASp2;
xflt ASmaxh1,ASh1,ASmaxh2,ASh2;
xflt ASmaxr1,ASr1,ASmaxr2,ASr2;
xflt ASminG,ASmaxG;
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//???OVERFLOWS??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
xflt flt_overflow[300];
xint drive_by_wire;
xint int_overflow[ 99];
};
|