00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "fltMeshPrimitive.h"
00016 #include "fltRecordReader.h"
00017 #include "fltRecordWriter.h"
00018 #include "fltHeader.h"
00019 #include "fltMaterial.h"
00020
00021 TypeHandle FltMeshPrimitive::_type_handle;
00022
00023
00024
00025
00026
00027
00028 FltMeshPrimitive::
00029 FltMeshPrimitive(FltHeader *header) : FltBead(header) {
00030 _primitive_type = PT_tristrip;
00031 }
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 bool FltMeshPrimitive::
00042 extract_record(FltRecordReader &reader) {
00043 if (!FltBead::extract_record(reader)) {
00044 return false;
00045 }
00046
00047 nassertr(reader.get_opcode() == FO_mesh_primitive, false);
00048 DatagramIterator &iterator = reader.get_iterator();
00049
00050 _primitive_type = (PrimitiveType)iterator.get_be_int16();
00051
00052 int vertex_width = iterator.get_be_int16();
00053 int num_vertices = iterator.get_be_int32();
00054
00055 if (vertex_width == 1) {
00056 for (int i = 0; i < num_vertices; i++) {
00057 _vertices.push_back(iterator.get_uint8());
00058 }
00059
00060 } else if (vertex_width == 2) {
00061 for (int i = 0; i < num_vertices; i++) {
00062 _vertices.push_back(iterator.get_be_uint16());
00063 }
00064
00065 } else if (vertex_width == 4) {
00066 for (int i = 0; i < num_vertices; i++) {
00067 _vertices.push_back(iterator.get_be_int32());
00068 }
00069
00070 } else {
00071 nout << "Invalid vertex width in mesh primitive: " << vertex_width
00072 << "\n";
00073 return false;
00074 }
00075
00076 check_remaining_size(iterator);
00077 return true;
00078 }
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 bool FltMeshPrimitive::
00089 build_record(FltRecordWriter &writer) const {
00090 if (!FltBead::build_record(writer)) {
00091 return false;
00092 }
00093
00094 writer.set_opcode(FO_mesh_primitive);
00095 Datagram &datagram = writer.update_datagram();
00096
00097 datagram.add_be_int16(_primitive_type);
00098
00099
00100
00101 int max_index = 0;
00102 Vertices::const_iterator vi;
00103 for (vi = _vertices.begin(); vi != _vertices.end(); ++vi) {
00104 max_index = max(max_index, (*vi));
00105 }
00106
00107 int vertex_width;
00108 if (max_index < 0x100) {
00109 vertex_width = 1;
00110 } else if (max_index < 0x10000) {
00111 vertex_width = 2;
00112 } else {
00113 vertex_width = 4;
00114 }
00115
00116 datagram.add_be_int16(vertex_width);
00117 datagram.add_be_int32(_vertices.size());
00118
00119 if (vertex_width == 1) {
00120 for (vi = _vertices.begin(); vi != _vertices.end(); ++vi) {
00121 datagram.add_uint8(*vi);
00122 }
00123
00124 } else if (vertex_width == 2) {
00125 for (vi = _vertices.begin(); vi != _vertices.end(); ++vi) {
00126 datagram.add_be_uint16(*vi);
00127 }
00128
00129 } else {
00130 for (vi = _vertices.begin(); vi != _vertices.end(); ++vi) {
00131 datagram.add_be_int32(*vi);
00132 }
00133 }
00134
00135 return true;
00136 }