00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 INLINE GeomVertexReader::
00025 GeomVertexReader(Thread *current_thread) :
00026 _vertex_data(NULL),
00027 _current_thread(current_thread)
00028 {
00029 initialize();
00030 }
00031
00032
00033
00034
00035
00036
00037
00038 INLINE GeomVertexReader::
00039 GeomVertexReader(const GeomVertexData *vertex_data,
00040 Thread *current_thread) :
00041 _vertex_data(vertex_data),
00042 _current_thread(current_thread)
00043 {
00044 initialize();
00045 }
00046
00047
00048
00049
00050
00051
00052
00053
00054 INLINE GeomVertexReader::
00055 GeomVertexReader(const GeomVertexData *vertex_data, const string &name,
00056 Thread *current_thread) :
00057 _vertex_data(vertex_data),
00058 _current_thread(current_thread)
00059 {
00060 initialize();
00061 set_column(name);
00062 }
00063
00064
00065
00066
00067
00068
00069
00070
00071 INLINE GeomVertexReader::
00072 GeomVertexReader(const GeomVertexData *vertex_data,
00073 const InternalName *name,
00074 Thread *current_thread) :
00075 _vertex_data(vertex_data),
00076 _current_thread(current_thread)
00077 {
00078 initialize();
00079 set_column(name);
00080 }
00081
00082
00083
00084
00085
00086
00087
00088 INLINE GeomVertexReader::
00089 GeomVertexReader(const GeomVertexArrayData *array_data,
00090 Thread *current_thread) :
00091 _array_data(array_data),
00092 _current_thread(current_thread)
00093 {
00094 initialize();
00095 }
00096
00097
00098
00099
00100
00101
00102
00103 INLINE GeomVertexReader::
00104 GeomVertexReader(const GeomVertexArrayData *array_data, int column,
00105 Thread *current_thread) :
00106 _array_data(array_data),
00107 _current_thread(current_thread)
00108 {
00109 initialize();
00110 set_column(column);
00111 }
00112
00113
00114
00115
00116
00117
00118
00119
00120 INLINE GeomVertexReader::
00121 GeomVertexReader(const GeomVertexDataPipelineReader *data_reader,
00122 const InternalName *name, bool force) :
00123 _vertex_data(data_reader->get_object()),
00124 _current_thread(data_reader->get_current_thread())
00125 {
00126 initialize();
00127 _force = force;
00128 const GeomVertexFormat *format = data_reader->get_format();
00129 set_vertex_column(format->get_array_with(name),
00130 format->get_column(name),
00131 data_reader);
00132 }
00133
00134
00135
00136
00137
00138
00139 INLINE GeomVertexReader::
00140 GeomVertexReader(const GeomVertexReader ©) :
00141 _vertex_data(copy._vertex_data),
00142 _array(copy._array),
00143 _array_data(copy._array_data),
00144 _current_thread(copy._current_thread),
00145 _packer(copy._packer),
00146 _stride(copy._stride),
00147 _handle(copy._handle),
00148 _pointer_begin(copy._pointer_begin),
00149 _pointer_end(copy._pointer_end),
00150 _pointer(copy._pointer),
00151 _start_row(copy._start_row),
00152 _force(copy._force)
00153 {
00154 }
00155
00156
00157
00158
00159
00160
00161 INLINE void GeomVertexReader::
00162 operator = (const GeomVertexReader ©) {
00163 _vertex_data = copy._vertex_data;
00164 _array = copy._array;
00165 _array_data = copy._array_data;
00166 _current_thread = copy._current_thread;
00167 _packer = copy._packer;
00168 _stride = copy._stride;
00169 _handle = copy._handle;
00170 _pointer_begin = copy._pointer_begin;
00171 _pointer_end = copy._pointer_end;
00172 _pointer = copy._pointer;
00173 _start_row = copy._start_row;
00174 _force = copy._force;
00175 }
00176
00177
00178
00179
00180
00181
00182 INLINE GeomVertexReader::
00183 ~GeomVertexReader() {
00184 }
00185
00186
00187
00188
00189
00190
00191
00192
00193 INLINE const GeomVertexData *GeomVertexReader::
00194 get_vertex_data() const {
00195 return _vertex_data;
00196 }
00197
00198
00199
00200
00201
00202
00203
00204 INLINE const GeomVertexArrayData *GeomVertexReader::
00205 get_array_data() const {
00206 return _array_data;
00207 }
00208
00209
00210
00211
00212
00213
00214
00215
00216 INLINE const GeomVertexArrayDataHandle *GeomVertexReader::
00217 get_array_handle() const {
00218 return _handle;
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 INLINE size_t GeomVertexReader::
00230 get_stride() const {
00231 return _stride;
00232 }
00233
00234
00235
00236
00237
00238
00239
00240 INLINE Thread *GeomVertexReader::
00241 get_current_thread() const {
00242 return _current_thread;
00243 }
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 INLINE void GeomVertexReader::
00262 set_force(bool force) {
00263 _force = force;
00264 }
00265
00266
00267
00268
00269
00270
00271
00272 INLINE bool GeomVertexReader::
00273 get_force() const {
00274 return _force;
00275 }
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290 INLINE bool GeomVertexReader::
00291 set_column(int column) {
00292 if (_vertex_data != (const GeomVertexData *)NULL) {
00293 GeomVertexDataPipelineReader reader(_vertex_data, _current_thread);
00294 reader.check_array_readers();
00295 const GeomVertexFormat *format = reader.get_format();
00296 return set_vertex_column(format->get_array_with(column),
00297 format->get_column(column),
00298 &reader);
00299 }
00300 if (_array_data != (const GeomVertexArrayData *)NULL) {
00301 return set_array_column(_array_data->get_array_format()->get_column(column));
00302 }
00303 return false;
00304 }
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 INLINE bool GeomVertexReader::
00320 set_column(const string &name) {
00321 return set_column(InternalName::make(name));
00322 }
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337 INLINE bool GeomVertexReader::
00338 set_column(const InternalName *name) {
00339 if (_vertex_data != (const GeomVertexData *)NULL) {
00340 GeomVertexDataPipelineReader reader(_vertex_data, _current_thread);
00341 reader.check_array_readers();
00342 const GeomVertexFormat *format = reader.get_format();
00343 return set_vertex_column(format->get_array_with(name),
00344 format->get_column(name),
00345 &reader);
00346 }
00347 if (_array_data != (const GeomVertexArrayData *)NULL) {
00348 return set_array_column(_array_data->get_array_format()->get_column(name));
00349 }
00350
00351 return false;
00352 }
00353
00354
00355
00356
00357
00358
00359 INLINE void GeomVertexReader::
00360 clear() {
00361 (*this) = GeomVertexReader(_current_thread);
00362 }
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372 INLINE bool GeomVertexReader::
00373 has_column() const {
00374 return (_packer != (GeomVertexColumn::Packer *)NULL);
00375 }
00376
00377
00378
00379
00380
00381
00382
00383 INLINE int GeomVertexReader::
00384 get_array() const {
00385 return _array;
00386 }
00387
00388
00389
00390
00391
00392
00393
00394 INLINE const GeomVertexColumn *GeomVertexReader::
00395 get_column() const {
00396 if (_packer != (GeomVertexColumn::Packer *)NULL) {
00397 return _packer->_column;
00398 }
00399 return NULL;
00400 }
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413 INLINE void GeomVertexReader::
00414 set_row_unsafe(int row) {
00415 _start_row = row;
00416 if (has_column()) {
00417 quick_set_pointer(_start_row);
00418 }
00419 }
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430 INLINE void GeomVertexReader::
00431 set_row(int row) {
00432 _start_row = row;
00433 if (has_column()) {
00434 bool result = set_pointer(_start_row);
00435 nassertv(result);
00436 }
00437 }
00438
00439
00440
00441
00442
00443
00444
00445
00446 INLINE int GeomVertexReader::
00447 get_start_row() const {
00448 return _start_row;
00449 }
00450
00451
00452
00453
00454
00455
00456
00457 INLINE int GeomVertexReader::
00458 get_read_row() const {
00459 return (int)(_pointer - _pointer_begin) / _stride;
00460 }
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470 INLINE bool GeomVertexReader::
00471 is_at_end() const {
00472 return _pointer >= _pointer_end;
00473 }
00474
00475
00476
00477
00478
00479
00480
00481
00482 INLINE float GeomVertexReader::
00483 get_data1f() {
00484 nassertr(has_column(), 0.0f);
00485 return _packer->get_data1f(inc_pointer());
00486 }
00487
00488
00489
00490
00491
00492
00493
00494
00495 INLINE const LVecBase2f &GeomVertexReader::
00496 get_data2f() {
00497 nassertr(has_column(), LVecBase2f::zero());
00498 return _packer->get_data2f(inc_pointer());
00499 }
00500
00501
00502
00503
00504
00505
00506
00507
00508 INLINE const LVecBase3f &GeomVertexReader::
00509 get_data3f() {
00510 nassertr(has_column(), LVecBase3f::zero());
00511 return _packer->get_data3f(inc_pointer());
00512 }
00513
00514
00515
00516
00517
00518
00519
00520
00521 INLINE const LVecBase4f &GeomVertexReader::
00522 get_data4f() {
00523 nassertr(has_column(), LVecBase4f::zero());
00524 return _packer->get_data4f(inc_pointer());
00525 }
00526
00527
00528
00529
00530
00531
00532
00533
00534 INLINE double GeomVertexReader::
00535 get_data1d() {
00536 nassertr(has_column(), 0.0f);
00537 return _packer->get_data1d(inc_pointer());
00538 }
00539
00540
00541
00542
00543
00544
00545
00546
00547 INLINE const LVecBase2d &GeomVertexReader::
00548 get_data2d() {
00549 nassertr(has_column(), LVecBase2d::zero());
00550 return _packer->get_data2d(inc_pointer());
00551 }
00552
00553
00554
00555
00556
00557
00558
00559
00560 INLINE const LVecBase3d &GeomVertexReader::
00561 get_data3d() {
00562 nassertr(has_column(), LVecBase3d::zero());
00563 return _packer->get_data3d(inc_pointer());
00564 }
00565
00566
00567
00568
00569
00570
00571
00572
00573 INLINE const LVecBase4d &GeomVertexReader::
00574 get_data4d() {
00575 nassertr(has_column(), LVecBase4d::zero());
00576 return _packer->get_data4d(inc_pointer());
00577 }
00578
00579
00580
00581
00582
00583
00584
00585
00586 INLINE PN_stdfloat GeomVertexReader::
00587 get_data1() {
00588 #ifndef STDFLOAT_DOUBLE
00589 return get_data1f();
00590 #else
00591 return get_data1d();
00592 #endif
00593 }
00594
00595
00596
00597
00598
00599
00600
00601
00602 INLINE const LVecBase2 &GeomVertexReader::
00603 get_data2() {
00604 #ifndef STDFLOAT_DOUBLE
00605 return get_data2f();
00606 #else
00607 return get_data2d();
00608 #endif
00609 }
00610
00611
00612
00613
00614
00615
00616
00617
00618 INLINE const LVecBase3 &GeomVertexReader::
00619 get_data3() {
00620 #ifndef STDFLOAT_DOUBLE
00621 return get_data3f();
00622 #else
00623 return get_data3d();
00624 #endif
00625 }
00626
00627
00628
00629
00630
00631
00632
00633
00634 INLINE const LVecBase4 &GeomVertexReader::
00635 get_data4() {
00636 #ifndef STDFLOAT_DOUBLE
00637 return get_data4f();
00638 #else
00639 return get_data4d();
00640 #endif
00641 }
00642
00643
00644
00645
00646
00647
00648
00649
00650 INLINE int GeomVertexReader::
00651 get_data1i() {
00652 nassertr(has_column(), 0);
00653 return _packer->get_data1i(inc_pointer());
00654 }
00655
00656
00657
00658
00659
00660
00661
00662
00663 INLINE const int *GeomVertexReader::
00664 get_data2i() {
00665 nassertr(has_column(), 0);
00666 return _packer->get_data2i(inc_pointer());
00667 }
00668
00669
00670
00671
00672
00673
00674
00675
00676 INLINE const int *GeomVertexReader::
00677 get_data3i() {
00678 nassertr(has_column(), 0);
00679 return _packer->get_data3i(inc_pointer());
00680 }
00681
00682
00683
00684
00685
00686
00687
00688
00689 INLINE const int *GeomVertexReader::
00690 get_data4i() {
00691 nassertr(has_column(), 0);
00692 return _packer->get_data4i(inc_pointer());
00693 }
00694
00695
00696
00697
00698
00699
00700 INLINE GeomVertexColumn::Packer *GeomVertexReader::
00701 get_packer() const {
00702 return _packer;
00703 }
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717 INLINE bool GeomVertexReader::
00718 set_pointer(int row) {
00719 _pointer_begin = _handle->get_read_pointer(_force);
00720 if (_pointer_begin == NULL && _handle->get_data_size_bytes() != 0) {
00721
00722 set_column(0, NULL);
00723 return false;
00724 }
00725
00726
00727 _pointer_end = _pointer_begin + _handle->get_data_size_bytes();
00728 quick_set_pointer(row);
00729 return true;
00730 }
00731
00732
00733
00734
00735
00736
00737
00738
00739 INLINE void GeomVertexReader::
00740 quick_set_pointer(int row) {
00741 nassertv(has_column() && (_pointer_begin != NULL || row == 0));
00742
00743 #if defined(_DEBUG)
00744
00745 nassertv(_pointer_begin == _handle->get_read_pointer(true));
00746 #endif
00747
00748 _pointer = _pointer_begin + _packer->_column->get_start() + _stride * row;
00749
00750 #if defined(_DEBUG)
00751
00752
00753
00754 nassertv(_pointer_begin == _pointer_end || (_pointer - _packer->_column->get_start()) <= _pointer_end);
00755 #endif
00756 }
00757
00758
00759
00760
00761
00762
00763
00764 INLINE const unsigned char *GeomVertexReader::
00765 inc_pointer() {
00766 #if defined(_DEBUG)
00767 nassertr(_pointer < _pointer_end, empty_buffer);
00768
00769 nassertr(_pointer_begin == _handle->get_read_pointer(true), empty_buffer);
00770 nassertr(_pointer < _pointer_begin + _handle->get_data_size_bytes(), empty_buffer);
00771 #endif
00772
00773 const unsigned char *orig_pointer = _pointer;
00774 _pointer += _stride;
00775 return orig_pointer;
00776 }