void setup_font() { if ( (cur_font != font_in->get()) || (cur_render_type !=render_type->get()) || (cur_glyph_size != glyph_size->get()) ) { vsx::file *fp; if ((fp = engine_state->filesystem->f_open(font_in->get().c_str())) == NULL) { printf("font not found: %s\n",cur_font.c_str()); return; } cur_font = font_in->get(); cur_render_type = render_type->get(); cur_glyph_size = glyph_size->get(); if (ftfont) { delete ftfont; ftfont = 0; } if (ftfont2) { delete ftfont2; ftfont2 = 0; } unsigned long size = engine_state->filesystem->f_get_size(fp); char* fdata = (char*)malloc(size); unsigned long bread = engine_state->filesystem->f_read((void*)fdata, size, fp); if (bread == size) { switch (cur_render_type) { case 0: ftfont = new FTGLTextureFont((unsigned char*)fdata, size); break; case 1: ftfont = new FTGLPolygonFont((unsigned char*)fdata, size); ftfont2 = new FTGLOutlineFont((unsigned char*)fdata, size); break; } ftfont->FaceSize((unsigned int)round(cur_glyph_size)); ftfont->CharMap(ft_encoding_unicode); if (ftfont2) { ftfont2->FaceSize((unsigned int)round(cur_glyph_size)); ftfont2->CharMap(ft_encoding_unicode); } loading_done = true; } engine_state->filesystem->f_close(fp); } }
void deactivate_offscreen() { glUseProgram(glsl_prog); if (!which_buffer || support_feedback->get() == 0) { if (texture) { texture->end_capture(); texture->valid = true; } ((vsx_module_param_texture*)texture_result)->set(texture); } else { if (texture2) { texture2->end_capture(); texture2->valid = true; } ((vsx_module_param_texture*)texture_result)->set(texture2); } which_buffer = !which_buffer; #if defined(VSXU_OPENGL_ES) || defined (__APPLE__) //printf("resetting viewport to %d %d %d %d\n",viewport[0],viewport[1],viewport[2],viewport[3]); glViewport(viewport[0],viewport[1],viewport[2],viewport[3]); #endif }
// this is run for each connection to this in-param. void output(vsx_module_param_abs* param) { glMatrixMode(GL_MODELVIEW); glPushMatrix(); // translation glTranslatef(position->get(0),position->get(1),position->get(2)); // rotation glRotatef( (float)angle->get()*360, rotation_axis->get(0), rotation_axis->get(1), rotation_axis->get(2) ); // scaling glScalef(size->get(0), size->get(1), size->get(2)); // color glColor4f( color_rgb->get(0), color_rgb->get(1), color_rgb->get(2), color_rgb->get(3) ); glBegin(GL_QUADS); glTexCoord2f(0.0f,0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glTexCoord2f(0.0f,1.0f); glVertex3f(-1.0f, 1.0f, 0.0f); glTexCoord2f(1.0f,1.0f); glVertex3f( 1.0f, 1.0f, 0.0f); glTexCoord2f(1.0f,0.0f); glVertex3f( 1.0f, -1.0f, 0.0f); glEnd(); if (border->get()) { glEnable(GL_LINE_SMOOTH); glLineWidth(1.5); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBegin(GL_LINE_STRIP); glColor3f(0, 0, 0); glVertex3f(-2, -0.4f, 0); glVertex3f(-2, -0.2f, 0); glVertex3f( 2, -0.2f, 0); glVertex3f( 2, -0.4f, 0); glVertex3f(-2, -0.4f, 0); glEnd(); } glPopMatrix(); render_result->set(1); loading_done = true; }
void run() { texture_out = texture_info_param_in->get_addr(); if (texture_out) { if (param_updates) { (*texture_out)->bind(); #ifdef VSXU_OPENGL_ES if (GL_EXT_texture_filter_anisotropic) #endif #ifndef VSXU_OPENGL_ES if (GLEW_EXT_texture_filter_anisotropic) #endif { float rMaxAniso; glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &rMaxAniso); if (anisotropic_filter->get()) glTexParameterf((*texture_out)->texture_info.ogl_type, GL_TEXTURE_MAX_ANISOTROPY_EXT, rMaxAniso); else glTexParameterf((*texture_out)->texture_info.ogl_type, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); } float vals[4]; vals[0] = border_color->get(0); vals[1] = border_color->get(1); vals[2] = border_color->get(2); vals[3] = border_color->get(3); glTexParameteri((*texture_out)->texture_info.ogl_type,GL_TEXTURE_MIN_FILTER, tex_filter[min_filter->get()]); glTexParameteri((*texture_out)->texture_info.ogl_type,GL_TEXTURE_MAG_FILTER, tex_filter[mag_filter->get()]); #ifndef VSXU_OPENGL_ES glTexParameterfv((*texture_out)->texture_info.ogl_type, GL_TEXTURE_BORDER_COLOR, vals); #endif glTexParameteri((*texture_out)->texture_info.ogl_type, GL_TEXTURE_WRAP_T, tex_wrap[wrap_t->get()]); glTexParameteri((*texture_out)->texture_info.ogl_type, GL_TEXTURE_WRAP_S, tex_wrap[wrap_s->get()]); (*texture_out)->_bind(); --param_updates; } ((vsx_module_param_texture*)texture_result)->set(*texture_out); } else { texture_result->valid = false; } }
void run() { if (drive->get() == 0) current_frame = (int)(engine->vtime * get_frame_rate()); else current_frame = (int)(time->get() * get_frame_rate()); if (current_frame != previous_frame) { //printf("r-"); bitm.data=(long unsigned int*)get_frame_data(current_frame); bitm.timestamp++; previous_frame = current_frame; // printf("t-"); } if (bitm.valid && bitm_timestamp != bitm.timestamp) { bitm_timestamp = bitm.timestamp; result1->set(bitm); loading_done = true; } if (current_frame>num_frames) current_frame=0; }
bool activate_offscreen() { //printf("ac1\n"); //printf("activate offscreen\n"); //glGetIntegerv(GL_VIEWPORT, viewport); //printf("old viewport is %d %d %d %d\n",viewport[0],viewport[1],viewport[2],viewport[3]); #if defined(VSXU_OPENGL_ES) || defined (__APPLE__) glGetIntegerv (GL_VIEWPORT, viewport); #endif bool rebuild = false; if (alpha_channel->get() != alpha_channel_int) { alpha_channel_int = alpha_channel->get(); rebuild = true; } if (float_texture->get() != float_texture_int) { float_texture_int = float_texture->get(); rebuild = true; } if (texture_size->get() >= 10) { glGetIntegerv (GL_VIEWPORT, viewport); int t_res_x = abs(viewport[2] - viewport[0]); int t_res_y = abs(viewport[3] - viewport[1]); if (texture_size->get() == 10) { if (t_res_x != res_x || t_res_y != res_y) rebuild = true; } if (texture_size->get() == 11) { if (t_res_x / 2 != res_x || t_res_y / 2 != res_y) rebuild = true; } if (texture_size->get() == 12) { if (t_res_x / 4 != res_x || t_res_y / 4 != res_y) rebuild = true; } if (texture_size->get() == 13) { if (t_res_x * 2 != res_x || t_res_y * 2 != res_y) rebuild = true; } if (texture_size->get() == 14) { if (t_res_x * 4 != res_x || t_res_y * 4 != res_y) rebuild = true; } } if (texture_size->get() != tex_size_internal || rebuild) { //printf("generating new framebuffer\n"); tex_size_internal = texture_size->get(); switch (tex_size_internal) { case 0: res_y = res_x = 2048; break; case 1: res_y = res_x = 1024; break; case 2: res_y = res_x = 512; break; case 3: res_y = res_x = 256; break; case 4: res_y = res_x = 128; break; case 5: res_y = res_x = 64; break; case 6: res_y = res_x = 32; break; case 7: res_y = res_x = 16; break; case 8: res_y = res_x = 8; break; case 9: res_y = res_x = 4; break; case 10: res_x = abs(viewport[2] - viewport[0]); res_y = abs(viewport[3] - viewport[1]); break; case 11: res_x = abs(viewport[2] - viewport[0]) / 2; res_y = abs(viewport[3] - viewport[1]) / 2; break; case 12: res_x = abs(viewport[2] - viewport[0]) / 4; res_y = abs(viewport[3] - viewport[1]) / 4; break; case 13: res_x = abs(viewport[2] - viewport[0]) * 2; res_y = abs(viewport[3] - viewport[1]) * 2; break; case 14: res_x = abs(viewport[2] - viewport[0]) * 4; res_y = abs(viewport[3] - viewport[1]) * 4; break; }; texture->reinit_buffer(res_x, res_y,float_texture->get(),alpha_channel->get()); if (support_feedback->get()) texture2->reinit_buffer(res_x, res_y, float_texture->get(),alpha_channel->get()); } if (!which_buffer || support_feedback->get() == 0) texture->begin_capture(); else texture2->begin_capture(); //printf("changing viewport to %d\n",res_x); glViewport(0,0,res_x,res_y); glDepthMask(GL_TRUE); //glDisable(GL_DEPTH_TEST); glClearColor(clear_color->get(0),clear_color->get(1),clear_color->get(2),clear_color->get(3)); //printf("clear buffer\n"); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer //#ifdef __APPLE__ glEnable(GL_BLEND); //#endif glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&glsl_prog); glUseProgram(0); //glBlendFunc(GL_SRC_ALPHA,GL_ONE); loading_done = true; return true; };
void output(vsx_module_param_abs* param) { VSX_UNUSED(param); if (text_in->updates) { if (process_lines()) text_in->updates = 0; } if (text_alpha->get() <= 0) return; if (!ftfont) { user_message = "module||error loading font "+cur_font; return; } if (text_in->get() == "_") return; float obj_size = size->get(); gl_state->matrix_mode (VSX_GL_MODELVIEW_MATRIX ); gl_state->matrix_push(); gl_state->matrix_rotate_f( (float)angle->get()*360, rotation_axis->get(0), rotation_axis->get(1), rotation_axis->get(2) ); if (obj_size < 0) obj_size = 0; gl_state->matrix_scale_f( obj_size*0.8*0.01, obj_size*0.01, obj_size*0.01 ); int l_align = align->get(); float l_leading = leading->get(); float ypos = 0; if (cur_render_type == 0) glEnable(GL_TEXTURE_2D); glColor4f(red->get(),green->get(),blue->get(),text_alpha->get()); for (unsigned long i = 0; i < lines.size(); ++i) { float ll = limit_line->get(); if (ll != -1.0f) { if (trunc(ll) != i) continue; } gl_state->matrix_push(); if (l_align == 0) { gl_state->matrix_translate_f( 0, ypos, 0 ); } else if (l_align == 1) { gl_state->matrix_translate_f( -lines[i].size_x*0.5f,ypos,0 ); } if (l_align == 2) { gl_state->matrix_translate_f( -lines[i].size_x,ypos,0 ); } if (cur_render_type == 1) { if (outline_alpha->get() > 0.0f && ftfont2) { float pre_linew; pre_linew = gl_state->line_width_get(); gl_state->line_width_set( outline_thickness->get() ); glColor4f(outline_color->get(0),outline_color->get(1),outline_color->get(2),outline_alpha->get()*outline_color->get(3)); ftfont2->Render(lines[i].string.c_str()); gl_state->line_width_set( pre_linew ); } glColor4f(red->get(),green->get(),blue->get(),text_alpha->get()); } ftfont->Render(lines[i].string.c_str()); gl_state->matrix_pop(); ypos += l_leading; } if (cur_render_type == 0) glDisable(GL_TEXTURE_2D); gl_state->matrix_pop(); render_result->set(1); loading_done = true; }
bool activate_offscreen() { #if defined(VSXU_OPENGL_ES) || defined (__APPLE__) glGetIntegerv (GL_VIEWPORT, viewport); #endif bool rebuild = false; if (alpha_channel->get() != alpha_channel_int) { alpha_channel_int = alpha_channel->get(); rebuild = true; } if (float_texture->get() != float_texture_int) { float_texture_int = float_texture->get(); rebuild = true; } if (multisample->get() != multisample_int) { multisample_int = multisample->get(); rebuild = true; } if (multisample->get() != multisample_int) { multisample_int = multisample->get(); rebuild = true; } if (texture_size->get() >= 10) { glGetIntegerv (GL_VIEWPORT, viewport); int t_res_x = abs(viewport[2] - viewport[0]); int t_res_y = abs(viewport[3] - viewport[1]); if (texture_size->get() == 10) { if (t_res_x != res_x || t_res_y != res_y) rebuild = true; } if (texture_size->get() == 11) { if (t_res_x / 2 != res_x || t_res_y / 2 != res_y) rebuild = true; } if (texture_size->get() == 12) { if (t_res_x / 4 != res_x || t_res_y / 4 != res_y) rebuild = true; } if (texture_size->get() == 13) { if (t_res_x * 2 != res_x || t_res_y * 2 != res_y) rebuild = true; } if (texture_size->get() == 14) { if (t_res_x * 4 != res_x || t_res_y * 4 != res_y) rebuild = true; } } if (texture_size->get() != tex_size_internal || rebuild) { //printf("generating new framebuffer\n"); tex_size_internal = texture_size->get(); switch (tex_size_internal) { case 0: res_y = res_x = 2048; break; case 1: res_y = res_x = 1024; break; case 2: res_y = res_x = 512; break; case 3: res_y = res_x = 256; break; case 4: res_y = res_x = 128; break; case 5: res_y = res_x = 64; break; case 6: res_y = res_x = 32; break; case 7: res_y = res_x = 16; break; case 8: res_y = res_x = 8; break; case 9: res_y = res_x = 4; break; case 10: res_x = abs(viewport[2] - viewport[0]); res_y = abs(viewport[3] - viewport[1]); break; case 11: res_x = abs(viewport[2] - viewport[0]) / 2; res_y = abs(viewport[3] - viewport[1]) / 2; break; case 12: res_x = abs(viewport[2] - viewport[0]) / 4; res_y = abs(viewport[3] - viewport[1]) / 4; break; case 13: res_x = abs(viewport[2] - viewport[0]) * 2; res_y = abs(viewport[3] - viewport[1]) * 2; break; case 14: res_x = abs(viewport[2] - viewport[0]) * 4; res_y = abs(viewport[3] - viewport[1]) * 4; break; }; texture->reinit_color_depth_buffer ( res_x, res_y, float_texture_int, alpha_channel_int, multisample_int ); } texture->begin_capture_to_buffer(); //printf("changing viewport to %d\n",res_x); glViewport(0,0,res_x,res_y); glDepthMask(GL_TRUE); glEnable(GL_BLEND); glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&glsl_prog); if ( atof((char*)glGetString(GL_VERSION)) >= 2.0 ) glUseProgram(0); else glUseProgramObjectARB(0); loading_done = true; return true; }
bool activate_offscreen() { #if defined(VSXU_OPENGL_ES) || defined (__APPLE__) glGetIntegerv (GL_VIEWPORT, viewport); #endif bool rebuild = false; if (support_feedback->get() != support_feedback_int) { support_feedback_int = support_feedback->get(); rebuild = true; } if (alpha_channel->get() != alpha_channel_int) { alpha_channel_int = alpha_channel->get(); rebuild = true; } if (float_texture->get() != float_texture_int) { float_texture_int = float_texture->get(); rebuild = true; } if (multisample->get() != multisample_int) { multisample_int = multisample->get(); rebuild = true; } if (multisample->get() != multisample_int) { multisample_int = multisample->get(); rebuild = true; } if (texture_size->get() >= 10) { glGetIntegerv (GL_VIEWPORT, viewport); int t_res_x = abs(viewport[2] - viewport[0]); int t_res_y = abs(viewport[3] - viewport[1]); if (texture_size->get() == 10) { if (t_res_x != res_x || t_res_y != res_y) rebuild = true; } if (texture_size->get() == 11) { if (t_res_x / 2 != res_x || t_res_y / 2 != res_y) rebuild = true; } if (texture_size->get() == 12) { if (t_res_x / 4 != res_x || t_res_y / 4 != res_y) rebuild = true; } if (texture_size->get() == 13) { if (t_res_x * 2 != res_x || t_res_y * 2 != res_y) rebuild = true; } if (texture_size->get() == 14) { if (t_res_x * 4 != res_x || t_res_y * 4 != res_y) rebuild = true; } } if (texture_size->get() != tex_size_internal || rebuild) { //printf("generating new framebuffer\n"); tex_size_internal = texture_size->get(); switch (tex_size_internal) { case 0: res_y = res_x = 2048; break; case 1: res_y = res_x = 1024; break; case 2: res_y = res_x = 512; break; case 3: res_y = res_x = 256; break; case 4: res_y = res_x = 128; break; case 5: res_y = res_x = 64; break; case 6: res_y = res_x = 32; break; case 7: res_y = res_x = 16; break; case 8: res_y = res_x = 8; break; case 9: res_y = res_x = 4; break; case 10: res_x = abs(viewport[2] - viewport[0]); res_y = abs(viewport[3] - viewport[1]); break; case 11: res_x = abs(viewport[2] - viewport[0]) / 2; res_y = abs(viewport[3] - viewport[1]) / 2; break; case 12: res_x = abs(viewport[2] - viewport[0]) / 4; res_y = abs(viewport[3] - viewport[1]) / 4; break; case 13: res_x = abs(viewport[2] - viewport[0]) * 2; res_y = abs(viewport[3] - viewport[1]) * 2; break; case 14: res_x = abs(viewport[2] - viewport[0]) * 4; res_y = abs(viewport[3] - viewport[1]) * 4; break; }; if (0 == support_feedback_int) { texture->reinit_color_depth_buffer ( res_x, res_y, float_texture_int, alpha_channel_int, multisample_int ); texture->bind(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,0); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); texture->_bind(); } if (1 == support_feedback_int) { // feedback textures ignores foreign depth buffer... texture->reinit_color_depth_buffer ( res_x, res_y, float_texture_int, alpha_channel_int, multisample_int ); texture->bind(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,0); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); texture->_bind(); texture2->reinit_color_depth_buffer ( res_x, res_y, float_texture_int, alpha_channel_int, multisample_int ); texture2->bind(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,0); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); texture2->_bind(); } } if (!which_buffer || support_feedback->get() == 0) texture->begin_capture_to_buffer(); else texture2->begin_capture_to_buffer(); //printf("changing viewport to %d\n",res_x); glViewport(0,0,res_x,res_y); glDepthMask(GL_TRUE); glClearColor(clear_color->get(0),clear_color->get(1),clear_color->get(2),clear_color->get(3)); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer glEnable(GL_BLEND); glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&glsl_prog); if ( atof((char*)glGetString(GL_VERSION)) >= 2.0 ) glUseProgram(0); else glUseProgramObjectARB(0); loading_done = true; return true; }
void run() { if (filename->get() != current_filename) { if (!verify_filesuffix(filename->get(),"obj")) { filename->set(current_filename); message = "module||ERROR! This is not a OBJ mesh file!"; return; } else message = "module||ok"; current_filename = filename->get(); vsxf_handle *fp; //printf("a\n"); if ((fp = engine->filesystem->f_open(current_filename.c_str(), "r")) == NULL) { return; } char buf[65535]; vsx_string line; vsx_array<vsx_vector> vertices; //vertices.set_allocation_increment(15000); vsx_array<vsx_vector> normals; //normals.set_allocation_increment(15000); vsx_array<vsx_tex_coord> texcoords; //texcoords.set_allocation_increment(15000); //mesh->data->vertex_tex_coords.reset_used(); mesh->data->clear(); //mesh->data->vertices.set_allocation_increment(15000); //mesh->data->vertex_normals.set_allocation_increment(15000); //mesh->data->vertex_tex_coords.set_allocation_increment(15000); //mesh->data->faces.set_allocation_increment(15000); int face_cur = 0; //printf("b\n"); bool found_normals = false; bool found_texcoords = false; if (preserve_uv_coords->get()) { mesh->data->vertices.reset_used(); mesh->data->vertex_tex_coords.reset_used(); mesh->data->vertex_normals.reset_used(); mesh->data->faces.reset_used(); while (engine->filesystem->f_gets(buf,65535,fp)) { line = buf; if (line[line.size()-1] == 0x0A) line.pop_back(); if (line[line.size()-1] == 0x0D) line.pop_back(); //printf("reading line: %s\n",line.c_str()); //printf("c\n"); if (line.size()) { vsx_avector<vsx_string> parts; vsx_string deli = " "; explode(line, deli, parts); if (parts[0] == "v") { //printf("v\n"); //mesh->data->vertices.push_back(vsx_vector(s2f(parts[1]),s2f(parts[2]),s2f(parts[3]))); vertices.push_back(vsx_vector(s2f(parts[1]),s2f(parts[2]),s2f(parts[3]))); } else if (parts[0] == "vt") { //printf("vt\n"); vsx_tex_coord a; a.s = (s2f(parts[1])); a.t = (s2f(parts[2])); //printf("%f :: %f\n",a.s,a.t); texcoords.push_back(a); //vsx_vector__(s2f(parts[1]),s2f(parts[2]),s2f(parts[3]))); found_texcoords = true; } else if (parts[0] == "vn") { //printf("vn\n"); //printf("normal\n"); normals.push_back(vsx_vector(s2f(parts[1]),s2f(parts[2]),s2f(parts[3]))); found_normals = true; //mesh->data->vertex_normals.push_back(vsx_vector__(s2f(parts[1]),s2f(parts[2]),s2f(parts[3]))); } else if (parts[0] == "f") { //printf("f1\n"); //printf("face\n"); //if (parts.size() == 4) { //printf("num texcoords %d\n",texcoords.size()); vsx_face ff; // vsx_avector<vsx_string> parts2; vsx_string deli2 = "/"; /* explode(parts[1], deli2, parts2); ff.c = s2i(parts2[0])-1; mesh->data->vertex_normals[ff.c] = normals[s2i(parts2[1])-1]; mesh->data->vertex_tex_coords[ff.c] = texcoords[s2i(parts2[1])-1]; explode(parts[2], deli2, parts2); ff.b = s2i(parts2[0])-1; mesh->data->vertex_normals[ff.b] = normals[s2i(parts2[1])-1]; mesh->data->vertex_tex_coords[ff.b] = texcoords[s2i(parts2[1])-1]; explode(parts[3], deli2, parts2); ff.a = s2i(parts2[0])-1; mesh->data->vertex_normals[ff.a] = normals[s2i(parts2[1])-1]; mesh->data->vertex_tex_coords[ff.a] = texcoords[s2i(parts2[1])-1];*/ vsx_avector<vsx_string> parts2; explode(parts[1], deli2, parts2); vsx_avector<vsx_string> parts3; explode(parts[2], deli2, parts3); vsx_avector<vsx_string> parts4; explode(parts[3], deli2, parts4); ff.c = face_cur; //s2i(parts2[0])-1; ff.b = face_cur+1; //s2i(parts3[0])-1; ff.a = face_cur+2; //s2i(parts4[0])-1; //printf("f2\n"); //printf("reading line: %s\n",line.c_str()); int id; id = s2i(parts2[0])-1; if (id < 0) id=0; mesh->data->vertices[ff.a] = vertices[id]; id = s2i(parts3[0])-1; if (id < 0) id=0; mesh->data->vertices[ff.b] = vertices[id]; id = s2i(parts4[0])-1; if (id < 0) id=0; mesh->data->vertices[ff.c] = vertices[id]; if (found_texcoords && found_normals) { if (parts2[1] != "") { mesh->data->vertex_tex_coords[ff.a] = texcoords[s2i(parts2[1])-1]; mesh->data->vertex_tex_coords[ff.b] = texcoords[s2i(parts3[1])-1]; mesh->data->vertex_tex_coords[ff.c] = texcoords[s2i(parts4[1])-1]; } if (parts2[2] != "") { mesh->data->vertex_normals[ff.a] = normals[s2i(parts2[2])-1]; mesh->data->vertex_normals[ff.b] = normals[s2i(parts3[2])-1]; mesh->data->vertex_normals[ff.c] = normals[s2i(parts4[2])-1]; } } else if (found_normals) { if (parts2[2] != "") { mesh->data->vertex_normals[ff.a] = normals[s2i(parts2[2])-1]; mesh->data->vertex_normals[ff.b] = normals[s2i(parts3[2])-1]; mesh->data->vertex_normals[ff.c] = normals[s2i(parts4[2])-1]; } } else if (found_texcoords) { if (parts2[1] != "") { mesh->data->vertex_tex_coords[ff.a] = texcoords[s2i(parts2[1])-1]; mesh->data->vertex_tex_coords[ff.b] = texcoords[s2i(parts3[1])-1]; mesh->data->vertex_tex_coords[ff.c] = texcoords[s2i(parts4[1])-1]; } } //printf("%d ",s2i(parts2[1])); //printf("%d ",s2i(parts3[1])); //printf("%d\n",s2i(parts4[1])); //printf("f3\n"); /*printf("ida: %d\n",s2i(parts2[1])); printf("orig coords: %f %f\n",texcoords[s2i(parts2[1])-1].s,texcoords[s2i(parts2[1])-1].t); printf("texcoord s: %f %f\n",mesh->data->vertex_tex_coords[ff.a].s,mesh->data->vertex_tex_coords[ff.a].t); printf("idb: %d\n",s2i(parts3[1])); printf("orig coords: %f %f\n",texcoords[s2i(parts3[1])-1].s,texcoords[s2i(parts3[1])-1].t); printf("texcoord s: %f %f\n",mesh->data->vertex_tex_coords[ff.a].s,mesh->data->vertex_tex_coords[ff.a].t); printf("idc: %d\n",s2i(parts4[1])); printf("orig coords: %f %f\n",texcoords[s2i(parts4[1])-1].s,texcoords[s2i(parts4[1])-1].t); printf("texcoord s: %f %f\n",mesh->data->vertex_tex_coords[ff.a].s,mesh->data->vertex_tex_coords[ff.a].t); */ face_cur += 3; mesh->data->faces.push_back(ff); //printf("f4\n"); //} } } } } else { while (engine->filesystem->f_gets(buf,65535,fp)) { line = buf; if (line[line.size()-1] == 0x0A) line.pop_back(); if (line[line.size()-1] == 0x0D) line.pop_back(); if (line.size()) { vsx_avector<vsx_string> parts; vsx_string deli = " "; explode(line, deli, parts); if (parts[0] == "v") { mesh->data->vertices.push_back(vsx_vector(s2f(parts[1]),s2f(parts[2]),s2f(parts[3]))); } else if (parts[0] == "f") { vsx_face ff; vsx_string deli2 = "/"; vsx_avector<vsx_string> parts2; explode(parts[1], deli2, parts2); vsx_avector<vsx_string> parts3; explode(parts[2], deli2, parts3); vsx_avector<vsx_string> parts4; explode(parts[3], deli2, parts4); ff.c = s2i(parts2[0])-1; ff.b = s2i(parts3[0])-1; ff.a = s2i(parts4[0])-1; //printf("face %d %d %d %d\n", mesh->data->faces.size(), ff.a, ff.b, ff.c); mesh->data->faces.push_back(ff); } } } } engine->filesystem->f_close(fp); loading_done = true; mesh->timestamp = (int)(engine->real_vtime*1000.0f); #ifdef VSXU_DEBUG //printf("mesh timestamp: %d\n", (int)mesh->timestamp); #endif } result->set_p(mesh); }