Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- global.Anorms = [
- [ -0.525731, 0.000000, 0.850651 ],
- [ -0.442863, 0.238856, 0.864188 ],
- [ -0.295242, 0.000000, 0.955423 ],
- [ -0.309017, 0.500000, 0.809017 ],
- [ -0.162460, 0.262866, 0.951056 ],
- [ 0.000000, 0.000000, 1.000000 ],
- [ 0.000000, 0.850651, 0.525731 ],
- [ -0.147621, 0.716567, 0.681718 ],
- [ 0.147621, 0.716567, 0.681718 ],
- [ 0.000000, 0.525731, 0.850651 ],
- [ 0.309017, 0.500000, 0.809017 ],
- [ 0.525731, 0.000000, 0.850651 ],
- [ 0.295242, 0.000000, 0.955423 ],
- [ 0.442863, 0.238856, 0.864188 ],
- [ 0.162460, 0.262866, 0.951056 ],
- [ -0.681718, 0.147621, 0.716567 ],
- [ -0.809017, 0.309017, 0.500000 ],
- [ -0.587785, 0.425325, 0.688191 ],
- [ -0.850651, 0.525731, 0.000000 ],
- [ -0.864188, 0.442863, 0.238856 ],
- [ -0.716567, 0.681718, 0.147621 ],
- [ -0.688191, 0.587785, 0.425325 ],
- [ -0.500000, 0.809017, 0.309017 ],
- [ -0.238856, 0.864188, 0.442863 ],
- [ -0.425325, 0.688191, 0.587785 ],
- [ -0.716567, 0.681718, -0.147621 ],
- [ -0.500000, 0.809017, -0.309017 ],
- [ -0.525731, 0.850651, 0.000000 ],
- [ 0.000000, 0.850651, -0.525731 ],
- [ -0.238856, 0.864188, -0.442863 ],
- [ 0.000000, 0.955423, -0.295242 ],
- [ -0.262866, 0.951056, -0.162460 ],
- [ 0.000000, 1.000000, 0.000000 ],
- [ 0.000000, 0.955423, 0.295242 ],
- [ -0.262866, 0.951056, 0.162460 ],
- [ 0.238856, 0.864188, 0.442863 ],
- [ 0.262866, 0.951056, 0.162460 ],
- [ 0.500000, 0.809017, 0.309017 ],
- [ 0.238856, 0.864188, -0.442863 ],
- [ 0.262866, 0.951056, -0.162460 ],
- [ 0.500000, 0.809017, -0.309017 ],
- [ 0.850651, 0.525731, 0.000000 ],
- [ 0.716567, 0.681718, 0.147621 ],
- [ 0.716567, 0.681718, -0.147621 ],
- [ 0.525731, 0.850651, 0.000000 ],
- [ 0.425325, 0.688191, 0.587785 ],
- [ 0.864188, 0.442863, 0.238856 ],
- [ 0.688191, 0.587785, 0.425325 ],
- [ 0.809017, 0.309017, 0.500000 ],
- [ 0.681718, 0.147621, 0.716567 ],
- [ 0.587785, 0.425325, 0.688191 ],
- [ 0.955423, 0.295242, 0.000000 ],
- [ 1.000000, 0.000000, 0.000000 ],
- [ 0.951056, 0.162460, 0.262866 ],
- [ 0.850651, -0.525731, 0.000000 ],
- [ 0.955423, -0.295242, 0.000000 ],
- [ 0.864188, -0.442863, 0.238856 ],
- [ 0.951056, -0.162460, 0.262866 ],
- [ 0.809017, -0.309017, 0.500000 ],
- [ 0.681718, -0.147621, 0.716567 ],
- [ 0.850651, 0.000000, 0.525731 ],
- [ 0.864188, 0.442863, -0.238856 ],
- [ 0.809017, 0.309017, -0.500000 ],
- [ 0.951056, 0.162460, -0.262866 ],
- [ 0.525731, 0.000000, -0.850651 ],
- [ 0.681718, 0.147621, -0.716567 ],
- [ 0.681718, -0.147621, -0.716567 ],
- [ 0.850651, 0.000000, -0.525731 ],
- [ 0.809017, -0.309017, -0.500000 ],
- [ 0.864188, -0.442863, -0.238856 ],
- [ 0.951056, -0.162460, -0.262866 ],
- [ 0.147621, 0.716567, -0.681718 ],
- [ 0.309017, 0.500000, -0.809017 ],
- [ 0.425325, 0.688191, -0.587785 ],
- [ 0.442863, 0.238856, -0.864188 ],
- [ 0.587785, 0.425325, -0.688191 ],
- [ 0.688191, 0.587785, -0.425325 ],
- [ -0.147621, 0.716567, -0.681718 ],
- [ -0.309017, 0.500000, -0.809017 ],
- [ 0.000000, 0.525731, -0.850651 ],
- [ -0.525731, 0.000000, -0.850651 ],
- [ -0.442863, 0.238856, -0.864188 ],
- [ -0.295242, 0.000000, -0.955423 ],
- [ -0.162460, 0.262866, -0.951056 ],
- [ 0.000000, 0.000000, -1.000000 ],
- [ 0.295242, 0.000000, -0.955423 ],
- [ 0.162460, 0.262866, -0.951056 ],
- [ -0.442863, -0.238856, -0.864188 ],
- [ -0.309017, -0.500000, -0.809017 ],
- [ -0.162460, -0.262866, -0.951056 ],
- [ 0.000000, -0.850651, -0.525731 ],
- [ -0.147621, -0.716567, -0.681718 ],
- [ 0.147621, -0.716567, -0.681718 ],
- [ 0.000000, -0.525731, -0.850651 ],
- [ 0.309017, -0.500000, -0.809017 ],
- [ 0.442863, -0.238856, -0.864188 ],
- [ 0.162460, -0.262866, -0.951056 ],
- [ 0.238856, -0.864188, -0.442863 ],
- [ 0.500000, -0.809017, -0.309017 ],
- [ 0.425325, -0.688191, -0.587785 ],
- [ 0.716567, -0.681718, -0.147621 ],
- [ 0.688191, -0.587785, -0.425325 ],
- [ 0.587785, -0.425325, -0.688191 ],
- [ 0.000000, -0.955423, -0.295242 ],
- [ 0.000000, -1.000000, 0.000000 ],
- [ 0.262866, -0.951056, -0.162460 ],
- [ 0.000000, -0.850651, 0.525731 ],
- [ 0.000000, -0.955423, 0.295242 ],
- [ 0.238856, -0.864188, 0.442863 ],
- [ 0.262866, -0.951056, 0.162460 ],
- [ 0.500000, -0.809017, 0.309017 ],
- [ 0.716567, -0.681718, 0.147621 ],
- [ 0.525731, -0.850651, 0.000000 ],
- [ -0.238856, -0.864188, -0.442863 ],
- [ -0.500000, -0.809017, -0.309017 ],
- [ -0.262866, -0.951056, -0.162460 ],
- [ -0.850651, -0.525731, 0.000000 ],
- [ -0.716567, -0.681718, -0.147621 ],
- [ -0.716567, -0.681718, 0.147621 ],
- [ -0.525731, -0.850651, 0.000000 ],
- [ -0.500000, -0.809017, 0.309017 ],
- [ -0.238856, -0.864188, 0.442863 ],
- [ -0.262866, -0.951056, 0.162460 ],
- [ -0.864188, -0.442863, 0.238856 ],
- [ -0.809017, -0.309017, 0.500000 ],
- [ -0.688191, -0.587785, 0.425325 ],
- [ -0.681718, -0.147621, 0.716567 ],
- [ -0.442863, -0.238856, 0.864188 ],
- [ -0.587785, -0.425325, 0.688191 ],
- [ -0.309017, -0.500000, 0.809017 ],
- [ -0.147621, -0.716567, 0.681718 ],
- [ -0.425325, -0.688191, 0.587785 ],
- [ -0.162460, -0.262866, 0.951056 ],
- [ 0.442863, -0.238856, 0.864188 ],
- [ 0.162460, -0.262866, 0.951056 ],
- [ 0.309017, -0.500000, 0.809017 ],
- [ 0.147621, -0.716567, 0.681718 ],
- [ 0.000000, -0.525731, 0.850651 ],
- [ 0.425325, -0.688191, 0.587785 ],
- [ 0.587785, -0.425325, 0.688191 ],
- [ 0.688191, -0.587785, 0.425325 ],
- [ -0.955423, 0.295242, 0.000000 ],
- [ -0.951056, 0.162460, 0.262866 ],
- [ -1.000000, 0.000000, 0.000000 ],
- [ -0.850651, 0.000000, 0.525731 ],
- [ -0.955423, -0.295242, 0.000000 ],
- [ -0.951056, -0.162460, 0.262866 ],
- [ -0.864188, 0.442863, -0.238856 ],
- [ -0.951056, 0.162460, -0.262866 ],
- [ -0.809017, 0.309017, -0.500000 ],
- [ -0.864188, -0.442863, -0.238856 ],
- [ -0.951056, -0.162460, -0.262866 ],
- [ -0.809017, -0.309017, -0.500000 ],
- [ -0.681718, 0.147621, -0.716567 ],
- [ -0.681718, -0.147621, -0.716567 ],
- [ -0.850651, 0.000000, -0.525731 ],
- [ -0.688191, 0.587785, -0.425325 ],
- [ -0.587785, 0.425325, -0.688191 ],
- [ -0.425325, 0.688191, -0.587785 ],
- [ -0.425325, -0.688191, -0.587785 ],
- [ -0.587785, -0.425325, -0.688191 ],
- [ -0.688191, -0.587785, -0.425325 ]];
- #macro ANORMS global.Anorms
- // Function to parse the MDL file
- function parse_mdl(file, absolute = false) {
- if QuakeMgr.mdlDat[? file] == undefined{
- shader_set(shd_palettize);
- texture_set_stage( shader_get_sampler_index(shd_palettize,"u_pal"), sprite_get_texture(global.palTex,0) );
- gpu_set_tex_repeat_ext(shader_get_sampler_index(shd_palettize,"u_pal"),false);
- gpu_set_tex_filter_ext(shader_get_sampler_index(shd_palettize,"u_pal"),false);
- //trace("Importing MDL: "+file);
- var value = string_replace_all(file,"/","\\");
- if absolute == false{
- value = filename_dir_goup(filename_dir(QuakeMgr.bspFile))+"\\"+value;
- }
- if file_exists(value){
- //trace("MDL Found: "+filename_name(value));
- _isMDLEntity = true;
- }else{
- //trace("MDL Does Not Exist: "+filename_name(value));
- return false;
- }
- // Open the file
- var mdl_buff = buffer_load(value);
- var _mdl = {
- ident: 0,
- version: 0,
- scale: [0, 0, 0],
- translate: [0, 0, 0],
- boundingradius: 0,
- eyeposition: [0, 0, 0],
- num_skins: 0,
- skinwidth: 0,
- skinheight: 0,
- num_verts: 0,
- num_tris: 0,
- num_frames: 0,
- synctype: 0,
- flags: 0,
- size: 0,
- skins: null,
- group: 0,
- num_pics: 0,
- verts: null,
- tris: null,
- frames: null
- };
- // Read the header information
- _mdl.ident = buffer_read(mdl_buff, buffer_u32);
- if _mdl.ident != 1330660425{
- trace("Incorrect Model Ident");
- return false;
- }else{
- //trace("Model Ident as Expected");
- }
- _mdl.version = buffer_read(mdl_buff, buffer_u32);
- if _mdl.version != 6{
- trace("Incorrect Model Version");
- return false;
- }else{
- //trace("Model Version as Expected");
- }
- _mdl.scale = [buffer_read(mdl_buff, buffer_f32),
- buffer_read(mdl_buff, buffer_f32),
- buffer_read(mdl_buff, buffer_f32)]
- _mdl.translate = [buffer_read(mdl_buff, buffer_f32),
- buffer_read(mdl_buff, buffer_f32),
- buffer_read(mdl_buff, buffer_f32)]
- _mdl.boundingradius = buffer_read(mdl_buff, buffer_f32);
- _mdl.eyeposition = [buffer_read(mdl_buff, buffer_f32),
- buffer_read(mdl_buff, buffer_f32),
- buffer_read(mdl_buff, buffer_f32)]
- _mdl.num_skins = buffer_read(mdl_buff, buffer_u32);
- _mdl.skinwidth = buffer_read(mdl_buff, buffer_u32);
- _mdl.skinheight = buffer_read(mdl_buff,buffer_u32);
- _mdl.num_verts = buffer_read(mdl_buff, buffer_u32);
- _mdl.num_tris = buffer_read(mdl_buff, buffer_u32);
- _mdl.num_frames = buffer_read(mdl_buff, buffer_u32);
- _mdl.synctype = buffer_read(mdl_buff, buffer_u32);
- _mdl.flags = buffer_read(mdl_buff, buffer_u32);
- _mdl.size = buffer_read(mdl_buff, buffer_f32);
- var w,h;
- w = _mdl.skinwidth;
- h = _mdl.skinheight;
- _mdl.skins = array_create(_mdl.num_skins);
- var skin = 0;
- for ( var i = 0; i < _mdl.num_skins; ++i){//_mdl.num_skins{
- _mdl.group = buffer_read(mdl_buff, buffer_s32);
- if _mdl.group != 0{
- _mdl.num_pics = buffer_read(mdl_buff, buffer_u32);
- //trace("MDL Contains "+string(_mdl.num_pics)+" Pics in Group");
- }else{
- //trace("MDL Contains Single Image Skin");
- _mdl.num_pics = 1;
- }
- //trace("Number of frames in Skin: "+string(_mdl.num_pics) );
- _mdl.skins[skin] = array_create(_mdl.num_pics);
- for ( var pic = 0; pic < _mdl.num_pics; pic++){
- if ( w > 0 && h > 0 ){
- var surf = surface_create(w,h,surface_r8unorm);
- var mBuffer = buffer_create( (w*h),buffer_fast,1)
- //trace("Building Skin: " +string(skin)+", "+string(pic));
- //trace(string(w)+", "+string(h));
- //repeat ( w * h ){
- // buffer_write(mBuffer, buffer_u32, buffer_read(mdl_buff, buffer_u8) );
- //}
- buffer_copy(mdl_buff,buffer_tell(mdl_buff),w*h,mBuffer,0);
- buffer_seek(mdl_buff,buffer_seek_relative,w*h);
- buffer_set_surface( mBuffer,surf,0);
- buffer_delete(mBuffer);
- var surf2 = surface_create(w,h);
- surface_set_target(surf2);
- draw_clear_alpha(0,0);
- draw_surface(surf,0,0);
- surface_reset_target();
- surface_free(surf);
- _mdl.skins[skin][pic] = {};
- _mdl.skins[skin][pic].sprite = sprite_create_from_surface(surf2,0,0, w,h, 0,0,0,0);
- _mdl.skins[skin][pic].texture = sprite_get_texture( _mdl.skins[skin][pic].sprite, 0);
- surface_free(surf2);
- //sprite_save(_mdl.skins[skin][pic].sprite,0,string_replace_all(value,".mdl","")+"-"+string(skin)+"-"+string(pic)+".png");
- }
- //pic++;
- }
- skin++;
- }
- gpu_set_tex_filter_ext(shader_get_sampler_index(shd_palettize,"u_pal"),true);
- shader_reset();
- //trace("Loading verts");
- _mdl.verts = array_create(_mdl.num_verts);
- for ( var i = 0; i < _mdl.num_verts; i++){//_mdl.num_verts{
- var vert = {};
- vert.onseam = buffer_read(mdl_buff,buffer_u32);
- vert.s = buffer_read(mdl_buff,buffer_u32);
- vert.t = buffer_read(mdl_buff,buffer_u32);
- vert.s = ( vert.s + 0.5 ) / _mdl.skinwidth;
- vert.t = ( vert.t + 0.5 ) / _mdl.skinheight;
- _mdl.verts[i] = vert;
- }
- _mdl.tris = array_create(_mdl.num_tris);
- //trace("Loading tris");
- for ( var i = 0; i < _mdl.num_tris; i++){//_mdl.num_tris{
- var tri = {};
- tri.facesfront = buffer_read(mdl_buff,buffer_u32);
- tri.vert[0] = buffer_read(mdl_buff,buffer_u32);
- tri.vert[1] = buffer_read(mdl_buff,buffer_u32);
- tri.vert[2] = buffer_read(mdl_buff,buffer_u32);
- _mdl.tris[i] = tri;
- }
- //trace("Loading Frames");
- _mdl.frames = array_create(_mdl.num_frames,undefined);
- for (var frame = 0; frame < _mdl.num_frames; ++frame)
- {
- var _frame = {};
- _mdl.frames[frame] = _frame;
- _frame.type = buffer_read(mdl_buff, buffer_s32);
- // Simple frame
- if (_frame.type == 0)
- {
- _frame.bboxmin = array_create(3);
- _frame.bboxmin[0] = buffer_read(mdl_buff, buffer_u8);
- _frame.bboxmin[1] = buffer_read(mdl_buff, buffer_u8);
- _frame.bboxmin[2] = buffer_read(mdl_buff, buffer_u8);
- /*_frame.bboxmin[3] =*/ buffer_read(mdl_buff, buffer_u8);
- _frame.bboxmax = array_create(3);
- _frame.bboxmax[0] = buffer_read(mdl_buff, buffer_u8);
- _frame.bboxmax[1] = buffer_read(mdl_buff, buffer_u8);
- _frame.bboxmax[2] = buffer_read(mdl_buff, buffer_u8);
- /*_frame.bboxmax[3] =*/ buffer_read(mdl_buff, buffer_u8);
- _frame.name = read_string_from_buffer(mdl_buff, 16);
- _frame.verts = array_create(_mdl.num_verts);
- for (var i = 0; i < _mdl.num_verts; ++i)
- {
- _frame.verts[i] = {};
- _frame.verts[i].v = array_create(3);
- _frame.verts[i].v[0] = buffer_read(mdl_buff, buffer_u8);
- _frame.verts[i].v[1] = buffer_read(mdl_buff, buffer_u8);
- _frame.verts[i].v[2] = buffer_read(mdl_buff, buffer_u8);
- _frame.verts[i].normalIndex = buffer_read(mdl_buff, buffer_u8);
- }
- }
- // Compound frame
- else
- {
- _frame.nm = buffer_read(mdl_buff, buffer_s32);
- if (_frame.nm < 0)
- {
- debugLog(kLogError, "corrupted frame section");
- return false;
- }
- _frame.bboxmin[0] = buffer_read(mdl_buff, buffer_u8);
- _frame.bboxmin[1] = buffer_read(mdl_buff, buffer_u8);
- _frame.bboxmin[2] = buffer_read(mdl_buff, buffer_u8);
- /*_frame.bboxmin[3] =*/ buffer_read(mdl_buff, buffer_u8);
- _frame.bboxmax = array_create(3);
- _frame.bboxmax[0] = buffer_read(mdl_buff, buffer_u8);
- _frame.bboxmax[1] = buffer_read(mdl_buff, buffer_u8);
- _frame.bboxmax[2] = buffer_read(mdl_buff, buffer_u8);
- /*_frame.bboxmax[3] =*/ buffer_read(mdl_buff, buffer_u8);
- _frame.times = array_create(_frame.nm);
- for (var subframe = 0; subframe < _frame.nm; ++subframe)
- {
- _frame.times[subframe] = buffer_read(mdl_buff, buffer_f32);
- }
- _frame.frames = array_create(_frame.nm);
- for (var subframe = 0; subframe < _frame.nm; ++subframe)
- {
- _frame.frames[subframe] = {};
- _frame.frames[subframe].bboxmin = array_create(3);
- _frame.frames[subframe].bboxmin[0] = buffer_read(mdl_buff, buffer_u8);
- _frame.frames[subframe].bboxmin[1] = buffer_read(mdl_buff, buffer_u8);
- _frame.frames[subframe].bboxmin[2] = buffer_read(mdl_buff, buffer_u8);
- /*_frame.bboxmin[3] =*/ buffer_read(mdl_buff, buffer_u8);
- _frame.frames[subframe].bboxmax = array_create(3);
- _frame.frames[subframe].bboxmax[0] = buffer_read(mdl_buff, buffer_u8);
- _frame.frames[subframe].bboxmax[1] = buffer_read(mdl_buff, buffer_u8);
- _frame.frames[subframe].bboxmax[2] = buffer_read(mdl_buff, buffer_u8);
- /*_frame.bboxmax[3] =*/ buffer_read(mdl_buff, buffer_u8);
- _frame.frames[subframe].name = read_string_from_buffer(mdl_buff, 16);
- _frame.frames[subframe].verts = array_create(_mdl.num_verts);
- for (var i = 0; i < _mdl.num_verts; ++i)
- {
- _frame.frames[subframe].verts[i] = {};
- _frame.frames[subframe].verts[i].v = array_create(3);
- _frame.frames[subframe].verts[i].v[0] = buffer_read(mdl_buff, buffer_u8);
- _frame.frames[subframe].verts[i].v[1] = buffer_read(mdl_buff, buffer_u8);
- _frame.frames[subframe].verts[i].v[2] = buffer_read(mdl_buff, buffer_u8);
- _frame.frames[subframe].verts[i].normalIndex = buffer_read(mdl_buff, buffer_u8);
- }
- }
- }
- }
- //trace("Creating Vertex Buffers");
- for ( var _f = 0; _f < _mdl.num_frames; _f++){
- var _frame = _mdl.frames[_f];
- if (_frame.type == 0){
- var _vbuff = vertex_create_buffer();
- _frame.vbuff = _vbuff;
- vertex_begin(_vbuff,QuakeMgr.vFormatMDL);
- var _verts = _frame.verts;
- for (var _t = 0; _t < _mdl.num_tris; ++_t){
- var _tri = _mdl.tris[_t];
- mdl_add_tri(_mdl,_vbuff,_tri,_verts);
- }
- vertex_end(_vbuff);
- } else {
- //trace("Number of Subframes: "+string(_frame.nm));
- for (var subframe = 0; subframe < _frame.nm; ++subframe){
- var _subframe = _frame.frames[subframe];
- var _vbuff = vertex_create_buffer();
- _subframe.vbuff = _vbuff;
- vertex_begin(_vbuff,QuakeMgr.vFormatMDL);
- var _verts = _subframe.verts;
- for (var _t = 0; _t < _mdl.num_tris; ++_t){
- var _tri = _mdl.tris[_t];
- mdl_add_tri(_mdl,_vbuff,_tri,_verts);
- }
- vertex_end(_vbuff);
- }
- }
- // Close the file
- buffer_delete(mdl_buff);
- QuakeMgr.mdlDat[? file] = _mdl;
- }
- }else{
- //trace("MDL Already Imported: "+file);
- }
- return QuakeMgr.mdlDat[? file];
- }
- function mdl_add_tri( _mdl,_vbuffer,_tri, _verts ){
- var v1,v2,v3;
- v1 = _verts[_tri.vert[0]].v;
- v2 = _verts[_tri.vert[1]].v;
- v3 = _verts[_tri.vert[2]].v;
- var vst1,vst2,vst3;
- vst1 = _mdl.verts[_tri.vert[0]];
- vst2 = _mdl.verts[_tri.vert[1]];
- vst3 = _mdl.verts[_tri.vert[2]];
- var n1,n2,n3;
- n1 = ANORMS[_verts[_tri.vert[0]].normalIndex];
- n2 = ANORMS[_verts[_tri.vert[1]].normalIndex];
- n3 = ANORMS[_verts[_tri.vert[2]].normalIndex];
- mdl_add_point(_mdl,_vbuffer,v1,vst1,n1,_tri.facesfront);
- mdl_add_point(_mdl,_vbuffer,v2,vst2,n2,_tri.facesfront);
- mdl_add_point(_mdl,_vbuffer,v3,vst3,n3,_tri.facesfront);
- }
- function mdl_add_point(_mdl, _vbuffer, _vF,_vST, _norm, facesfront){
- vertex_position_3d(_vbuffer, _vF[0]*_mdl.scale[0]+_mdl.translate[0],_vF[1]*_mdl.scale[1]+_mdl.translate[1],_vF[2]*_mdl.scale[2]+_mdl.translate[2]);
- vertex_normal(_vbuffer,_norm[0],_norm[1],_norm[2]);
- vertex_color(_vbuffer,c_white,1);
- var s,t;
- s = _vST.s;
- t = _vST.t;
- s = facesfront ? _vST.s : _vST.s + (0.5) * (_vST.onseam != 0);
- vertex_texcoord(_vbuffer, s,t);
- }
Advertisement
Add Comment
Please, Sign In to add comment