////////////////////////////////////////////////////////////////////// // Set Functions ////////////////////////////////////////////////////////////////////// bool GLC_WorldTo3ds::exportToFile(const QString& fileName, bool useAbsolutePosition) { m_ReferenceToMesh.clear(); m_NameToMaterial.clear(); m_pRootLib3dsNode= NULL; m_CurrentNodeId= 0; m_OccIdToNodeId.clear(); m_CurrentMeshIndex= 0; m_UseAbsolutePosition= useAbsolutePosition; m_TextureToFileName.clear(); m_FileName= fileName; bool subject= false; { QFile exportFile(m_FileName); subject= exportFile.open(QIODevice::WriteOnly); exportFile.close(); } if (subject) { m_pLib3dsFile= lib3ds_file_new(); saveWorld(); subject= lib3ds_file_save(m_pLib3dsFile, fileName.toLocal8Bit().data()); } return subject; }
int main(int argc, char **argv) { Lib3dsFile *f=0; parse_args(argc, argv); lib3ds_chunk_enable_dump(flags&LIB3DSDUMP_STRUCTURE, flags&LIB3DSDUMP_UNKNOWN); f=lib3ds_file_load(filename); if (!f) { fprintf(stderr, "***ERROR***\nLoading file %s failed\n", filename); exit(1); } if (flags&LIB3DSDUMP_MATERIALS) { printf("Dumping materials:\n"); lib3ds_file_dump_materials(f); printf("\n"); } if (flags&LIB3DSDUMP_TRIMESHES) { printf("Dumping meshes:\n"); lib3ds_file_dump_meshes(f); printf("\n"); } if (flags&LIB3DSDUMP_INSTANCES) { printf("Dumping instances:\n"); lib3ds_file_dump_instances(f); printf("\n"); } if (flags&LIB3DSDUMP_CAMERAS) { printf("Dumping cameras:\n"); lib3ds_file_dump_cameras(f); printf("\n"); } if (flags&LIB3DSDUMP_LIGHTS) { printf("Dumping lights:\n"); lib3ds_file_dump_lights(f); printf("\n"); } if (flags&LIB3DSDUMP_NODES) { printf("Dumping node hierarchy:\n"); lib3ds_file_dump_nodes(f); printf("\n"); } if (output && (flags&LIB3DSDUMP_WRITE_3DS)) { if (!lib3ds_file_save(f, output)) { printf("***ERROR**** Writing %s\n", output); } } lib3ds_file_free(f); return(0); }
int LD3dsExporter::doExport(LDLModel *pTopModel) { int retVal = 1; TCFloat matrix[16]; TCVector::initIdentityMatrix(matrix); matrix[5] = 0.0; matrix[6] = -1.0; matrix[9] = 1.0; matrix[10] = 0.0; m_topModel = pTopModel; m_file = lib3ds_file_new(); m_names.clear(); m_meshes.clear(); m_meshCount = 0; doExport(pTopModel, NULL, matrix, 7, false, true, false); //if (m_includeCamera) //{ // Lib3dsCamera *pCamera = lib3ds_camera_new("Default"); // Lib3dsCameraNode *pCameraNode; // TCVector cameraLoc(m_camera.getPosition().transformPoint(matrix)); // pCamera->position[0] = cameraLoc[0]; // pCamera->position[1] = cameraLoc[1]; // pCamera->position[2] = cameraLoc[2]; // pCamera->fov = m_fov; // pCameraNode = lib3ds_node_new_camera(pCamera); // lib3ds_file_append_node(m_file, (Lib3dsNode *)pCameraNode, NULL); //} if (!lib3ds_file_save(m_file, m_filename.c_str())) { retVal = 0; } lib3ds_file_free(m_file); return retVal; }
int main(int argc, char **argv) { FILE *file; Lib3dsFile *f = 0; Lib3dsIo io; int result; int i; parse_args(argc, argv); file = fopen(filename, "rb"); if (!file) { fprintf(stderr, "***ERROR***\nFile not found: %s\n", filename); exit(1); } f = lib3ds_file_new(); memset(&io, 0, sizeof(io)); io.self = file; io.seek_func = fileio_seek_func; io.tell_func = fileio_tell_func; io.read_func = fileio_read_func; io.write_func = fileio_write_func; io.log_func = fileio_log_func; result = lib3ds_file_read(f, &io); fclose(file); if (!result) { fprintf(stderr, "***ERROR***\nLoading file failed: %s\n", filename); exit(1); } if (flags & LIB3DSDUMP_MATERIALS) { printf("Dumping materials:\n"); for (i = 0; i < f->nmaterials; ++i) material_dump(f->materials[i]); printf("\n"); } if (flags & LIB3DSDUMP_TRIMESHES) { printf("Dumping meshes:\n"); for (i = 0; i < f->nmeshes; ++i) mesh_dump(f->meshes[i]); printf("\n"); } if (flags & LIB3DSDUMP_INSTANCES) { Lib3dsNode *p; printf("Dumping instances:\n"); for (p = f->nodes; p != 0; p = p->next) { dump_instances(p, ""); } printf("\n"); } if (flags & LIB3DSDUMP_CAMERAS) { printf("Dumping cameras:\n"); for (i = 0; i < f->ncameras; ++i) camera_dump(f->cameras[i]); printf("\n"); } if (flags & LIB3DSDUMP_LIGHTS) { printf("Dumping lights:\n"); for (i = 0; i < f->nlights; ++i) light_dump(f->lights[i]); printf("\n"); } if (flags & LIB3DSDUMP_NODES) { Lib3dsNode *p; printf("Dumping node hierarchy:\n"); for (p = f->nodes; p != 0; p = p->next) { node_dump(p, 1); } printf("\n"); } if (output) { if (!lib3ds_file_save(f, output)) { printf("***ERROR**** Writing %s\n", output); } } lib3ds_file_free(f); return 0; }
static void dump_to_3ds(Lib3dsFile *f, FILE *fp) { Lib3dsMesh *m = lib3ds_mesh_new("Warzone Mesh"); Lib3dsMaterial *material = lib3ds_material_new("Warzone texture"); Lib3dsTextureMap *texture = &material->texture1_map; int i, num, x, y, levels; char s[200]; num = fscanf(fp, "PIE %d\n", &i); if (num != 1) { fprintf(stderr, "Bad PIE file %s\n", input); exit(1); } fprintf(stdout, "PIE version %d\n", i); num = fscanf(fp, "TYPE %d\n", &i); // ignore if (num != 1) { fprintf(stderr, "Bad TYPE directive in %s\n", input); exit(1); } num = fscanf(fp, "TEXTURE %d %s %d %d\n", &i, s, &x, &y); if (num != 4) { fprintf(stderr, "Bad TEXTURE directive in %s\n", input); exit(1); } strcpy(texture->name, s); num = fscanf(fp, "LEVELS %d\n", &levels); if (num != 1) { fprintf(stderr, "Bad LEVELS directive in %s\n", input); exit(1); } f->frames = levels; f->meshes = m; f->materials = material; for (i = 0; i < levels; i++) { int j, points, faces, faces3DS, faceCount, points3DS, pointCount; WZ_FACE *faceList; WZ_POSITION *posList; num = fscanf(fp, "LEVEL %d\n", &x); if (num != 1 || (i + 1) != x) { fprintf(stderr, "Bad LEVEL directive in %s, was %d should be %d\n", input, x, i + 1); exit(1); } num = fscanf(fp, "POINTS %d\n", &points); if (num != 1) { fprintf(stderr, "Bad POINTS directive in %s frame %d\n", input, i); exit(1); } posList = malloc(sizeof(WZ_POSITION) * points); for (j = 0; j < points; j++) { if (swapYZ) { num = fscanf(fp, "%d %d %d\n", &posList[j].x, &posList[j].z, &posList[j].y); } else { num = fscanf(fp, "%d %d %d\n", &posList[j].x, &posList[j].y, &posList[j].z); } if (num != 3) { fprintf(stderr, "Bad POINTS entry frame %d, number %d\n", i, j); exit(1); } } num = fscanf(fp, "POLYGONS %d", &faces); if (num != 1) { fprintf(stderr, "Bad POLYGONS directive in %s frame %d\n", input, i); exit(1); } faces3DS = faces; // for starters faceList = malloc(sizeof(WZ_FACE) * faces); points3DS = 0; for (j = 0; j < faces; ++j) { int k; unsigned int flags; num = fscanf(fp, "\n%x", &flags); if (num != 1) { fprintf(stderr, "Bad POLYGONS texture flag entry frame %d, number %d\n", i, j); exit(1); } if (!(flags & iV_IMD_TEX)) { fprintf(stderr, "Bad texture flag entry frame %d, number %d - no texture flag!\n", i, j); exit(1); } num = fscanf(fp, "%d", &faceList[j].vertices); if (num != 1) { fprintf(stderr, "Bad POLYGONS vertices entry frame %d, number %d\n", i, j); exit(1); } assert(faceList[j].vertices <= MAX_POLYGON_SIZE); // larger polygons not supported assert(faceList[j].vertices >= 3); // points and lines not supported if (faceList[j].vertices > 3) { // since they are triangle fans already, we get to do easy tessellation faces3DS += (faceList[j].vertices - 3); } points3DS += faceList[j].vertices; // Read in vertex indices and texture coordinates for (k = 0; k < faceList[j].vertices; k++) { num = fscanf(fp, "%d", &faceList[j].index[k]); if (num != 1) { fprintf(stderr, "Bad vertex position entry frame %d, number %d\n", i, j); exit(1); } } if (flags & iV_IMD_TEXANIM) { // read in and discard animation values for now int frames, rate, width, height; num = fscanf(fp, "%d %d %d %d", &frames, &rate, &width, &height); if (num != 4) { fprintf(stderr, "Bad texture animation entry frame %d, number %d\n", i, j); exit(1); } } for (k = 0; k < faceList[j].vertices; k++) { num = fscanf(fp, "%d %d", &faceList[j].texCoord[k][0], &faceList[j].texCoord[k][1]); if (num != 2) { fprintf(stderr, "Bad texture coordinate entry frame %d, number %d\n", i, j); exit(1); } } } // Calculate position list. Since positions hold texture coordinates in 3DS, unlike in Warzone, // we need to use some black magic to transfer them over here. lib3ds_mesh_new_point_list(m, points3DS); lib3ds_mesh_new_texel_list(m, points3DS); pointCount = 0; for (j = 0; j < faces; j++) { int k; for (k = 0; k < faceList[j].vertices; k++) { Lib3dsVector pos; pos[0] = posList[faceList[j].index[k]].x; pos[1] = posList[faceList[j].index[k]].y; pos[2] = posList[faceList[j].index[k]].z; lib3ds_vector_copy(m->pointL[pointCount].pos, pos); faceList[j].index[k] = pointCount; // use new position list if (invertUV) { m->texelL[pointCount][0] = ((float)faceList[j].texCoord[k][0] / 256.0f); m->texelL[pointCount][1] = 1.0f - ((float)faceList[j].texCoord[k][1] / 256.0f); } else { m->texelL[pointCount][0] = ((float)faceList[j].texCoord[k][0] / 256.0f); m->texelL[pointCount][1] = ((float)faceList[j].texCoord[k][1] / 256.0f); } pointCount++; } } lib3ds_mesh_new_face_list(m, faces3DS); faceCount = 0; // TODO reverse winding afterwards for (j = 0; j < faces; j++) { int k, key, previous; key = m->faceL[faceCount].points[0] = faceList[j].index[0]; m->faceL[faceCount].points[1] = faceList[j].index[1]; previous = m->faceL[faceCount].points[2] = faceList[j].index[2]; faceCount++; // Generate triangles from the Warzone triangle fans (PIEs, get it?) for (k = 3; k < faceList[j].vertices; k++) { m->faceL[faceCount].points[0] = key; m->faceL[faceCount].points[1] = previous; previous = m->faceL[faceCount].points[0] = faceList[j].index[k]; } // Since texture coordinates are properties of positions, not indices, // we do not need a similar expansion of these } free(faceList); free(posList); } if (!lib3ds_file_save(f, output)) { fprintf(stderr, "Cannot open \"%s\" for writing: %s", output, strerror(errno)); exit(1); } }
int main(int argc, char **argv) { Lib3dsFile *file = lib3ds_file_new(); file->frames = 360; { Lib3dsMaterial *mat = lib3ds_material_new("c_tex"); lib3ds_file_insert_material(file, mat, -1); strcpy(mat->texture1_map.name, "cube.tga"); mat->texture1_map.percent = 1.0; mat = lib3ds_material_new("c_red"); lib3ds_file_insert_material(file, mat, -1); mat->diffuse[0] = 1.0; mat->diffuse[1] = 0.0; mat->diffuse[2] = 0.0; mat = lib3ds_material_new("c_blue"); lib3ds_file_insert_material(file, mat, -1); mat->diffuse[0] = 0.0; mat->diffuse[1] = 0.0; mat->diffuse[2] = 1.0; } { int i, j; Lib3dsMesh *mesh = lib3ds_mesh_new("cube"); Lib3dsMeshInstanceNode *inst; lib3ds_file_insert_mesh(file, mesh, -1); lib3ds_mesh_resize_vertices(mesh, 8, 1, 0); for (i = 0; i < 8; ++i) { lib3ds_vector_copy(mesh->vertices[i], g_vertices[i]); mesh->texcos[i][0] = g_texcoords[i][0]; mesh->texcos[i][1] = g_texcoords[i][1]; } lib3ds_mesh_resize_faces(mesh, 12); for (i = 0; i < 12; ++i) { for (j = 0; j < 3; ++j) { mesh->faces[i].index[j] = g_indices[i][j]; } } for (i = 0; i < 8; ++i) { mesh->faces[i].material = 0; } for (i = 0; i < 2; ++i) { mesh->faces[8+i].material = 1; } for (i = 0; i < 2; ++i) { mesh->faces[10+i].material = 2; } inst = lib3ds_node_new_mesh_instance(mesh, "01", NULL, NULL, NULL); lib3ds_file_append_node(file, (Lib3dsNode*)inst, NULL); } { Lib3dsCamera *camera; Lib3dsCameraNode *n; Lib3dsTargetNode *t; int i; camera = lib3ds_camera_new("camera01"); lib3ds_file_insert_camera(file, camera, -1); lib3ds_vector_make(camera->position, 0.0, -100, 0.0); lib3ds_vector_make(camera->target, 0.0, 0.0, 0.0); n = lib3ds_node_new_camera(camera); t = lib3ds_node_new_camera_target(camera); lib3ds_file_append_node(file, (Lib3dsNode*)n, NULL); lib3ds_file_append_node(file, (Lib3dsNode*)t, NULL); lib3ds_track_resize(&n->pos_track, 37); for (i = 0; i <= 36; i++) { n->pos_track.keys[i].frame = 10 * i; lib3ds_vector_make(n->pos_track.keys[i].value, (float)(100.0 * cos(2 * M_PI * i / 36.0)), (float)(100.0 * sin(2 * M_PI * i / 36.0)), 50.0 ); } } if (!lib3ds_file_save(file, "cube.3ds")) { fprintf(stderr, "ERROR: Saving 3ds file failed!\n"); } lib3ds_file_free(file); }
// TODO: Build own exporter class void objectExporter::on_buttonBox_accepted() { QString fileName = QFileDialog::getSaveFileName(gloParent, "Save 3ds Object", ".", "3D Object (*.3ds)", 0, 0); QList<trackHandler*> trackList = gloParent->getTrackList(); trackHandler* curTrack = trackList[ui->trackBox->currentIndex()]; trackMesh* mesh = curTrack->mMesh; QVector<float> *vertices = new QVector<float>(); QVector<unsigned int> *indices = new QVector<unsigned int>(); QVector<unsigned int> *borders = new QVector<unsigned int>(); Lib3dsFile *file = lib3ds_file_new(); file->frames = 360; { Lib3dsMaterial* mat = lib3ds_material_new("coaster"); lib3ds_file_insert_material(file, mat, -1); mat->diffuse[0] = curTrack->trackColors[0].red()/255.f; mat->diffuse[1] = curTrack->trackColors[0].green()/255.f; mat->diffuse[2] = curTrack->trackColors[0].blue()/255.f; } { for(int section = 0; section < curTrack->trackData->lSections.size(); ++section) { vertices->clear(); indices->clear(); borders->clear(); mesh->build3ds(section, vertices, indices, borders); float* fvertices = new float[vertices->size()]; for(int i = 0; i < vertices->size()/3; ++i) { fvertices[3*i+0] = vertices->at(3*i+0); fvertices[3*i+1] = -vertices->at(3*i+2); fvertices[3*i+2] = vertices->at(3*i+1); //exportScreen->doFastExport(); } for(int subIndex = 0; subIndex < borders->size()-2; subIndex+= 2) { int fromVIndex = borders->at(subIndex)/3; int toVIndex = borders->at(subIndex+2)/3; int fromIIndex = borders->at(subIndex+1)/3; int toIIndex = borders->at(subIndex+3)/3; int i, j; QString name = QString::number(section).append(QString("_").append(QString::number(subIndex/2))); Lib3dsMesh *mesh = lib3ds_mesh_new(name.toLocal8Bit().data()); Lib3dsMeshInstanceNode *inst; lib3ds_file_insert_mesh(file, mesh, -1); lib3ds_mesh_resize_vertices(mesh, toVIndex-fromVIndex, 1, 0); for (i = 0; i < toVIndex-fromVIndex; ++i) { lib3ds_vector_copy(mesh->vertices[i], &fvertices[(i+fromVIndex)*3]); mesh->texcos[i][0] = 0.f; mesh->texcos[i][1] = 0.f; } lib3ds_mesh_resize_faces(mesh, toIIndex-fromIIndex); for (i = 0; i < toIIndex-fromIIndex; ++i) { for (j = 0; j < 3; ++j) { mesh->faces[i].index[j] = indices->at(3*(i+fromIIndex)+j)-fromVIndex; mesh->faces[i].material = 0; } } inst = lib3ds_node_new_mesh_instance(mesh, name.toLocal8Bit().data(), NULL, NULL, NULL); lib3ds_file_append_node(file, (Lib3dsNode*)inst, NULL); } delete[] fvertices; } } { Lib3dsCamera *camera; Lib3dsCameraNode *n; Lib3dsTargetNode *t; int i; camera = lib3ds_camera_new("camera01"); lib3ds_file_insert_camera(file, camera, -1); lib3ds_vector_make(camera->position, 0.0, -100, 0.0); lib3ds_vector_make(camera->target, 0.0, 0.0, 0.0); n = lib3ds_node_new_camera(camera); t = lib3ds_node_new_camera_target(camera); lib3ds_file_append_node(file, (Lib3dsNode*)n, NULL); lib3ds_file_append_node(file, (Lib3dsNode*)t, NULL); lib3ds_track_resize(&n->pos_track, 37); for (i = 0; i <= 36; i++) { n->pos_track.keys[i].frame = 10 * i; lib3ds_vector_make(n->pos_track.keys[i].value, (float)(100.0 * cos(2 * F_PI * i / 36.0)), (float)(100.0 * sin(2 * F_PI * i / 36.0)), 50.0 ); } } if (!lib3ds_file_save(file, fileName.toLocal8Bit().data())) { qDebug("ERROR: Saving 3ds file failed!\n"); } lib3ds_file_free(file); delete indices; delete vertices; }