/* * StartSaveExit - prepare to do save & exit of file */ vi_rc StartSaveExit( void ) { vi_key key; vi_key levent; /* * get the next key */ levent = LastEvent; key = GetNextEvent( FALSE ); if( key != levent ) { if( key == VI_KEY( ESC ) ) { return( ERR_NO_ERR ); } return( InvalidKey() ); } return( SaveAndExit( NULL ) ); } /* StartSaveExit */
/* * DoLastEvent - process the last keystroke event */ vi_rc DoLastEvent( void ) { event *event; vi_rc rc; bool keep_sel; if( LastEvent >= MAX_EVENTS ) { rc = InvalidKey(); } else if( !EditFlags.Modeless && EditFlags.InsertModeActive ) { // UnselectRegion(); if( EditFlags.EscapedInsertChar ) { rc = IMChar(); } else if( InputKeyMaps[LastEvent].data != NULL && !InputKeyMaps[LastEvent].inuse ) { rc = StartInputKeyMap( LastEvent ); } else { rc = (EventList[LastEvent].ins)(); } } else if( !EditFlags.Modeless && KeyMaps[LastEvent].data != NULL && !KeyMaps[LastEvent].inuse ) { rc = DoKeyMap( LastEvent ); } else { event = &EventList[LastEvent]; keep_sel = event->b.keep_selection; if( event->b.keep_selection_maybe ) { if( SelRgn.selected ) { keep_sel = true; } } if( !keep_sel && !EditFlags.ScrollCommand ) { UnselectRegion(); } if( !EditFlags.ScrollCommand ) { ensureCursorDisplayed(); } rc = ERR_NO_ERR; switch( event->b.type ) { case EVENT_INS: if( EditFlags.Modeless ) { /* don't allow following cursor movements to affect seln */ keep_sel = SelRgn.selected; DeleteSelectedRegion(); SelRgn.selected = keep_sel; InsertLikeLast(); rc = event->rtn.ins(); DoneCurrentInsert( false ); SelRgn.selected = false; } else { if( !EditFlags.InsertModeActive ) { InsertLikeLast(); } rc = event->rtn.ins(); } break; case EVENT_OP: DoneCurrentInsert( true ); rc = doOperator( event ); break; case EVENT_REL_MOVE: case EVENT_ABS_MOVE: DoneCurrentInsert( true ); rc = DoMove( event ); break; case EVENT_MISC: DoneCurrentInsert( true ); rc = event->rtn.old(); break; } } return( rc ); } /* DoLastEvent */
const TerrainLod::_IndexData & TerrainLod::GetIndexData(const _Key & k) { d_assert(!InvalidKey(k)); Map<_Key, _IndexData>::Iterator iter = mMIndexBuffer.Find(k); if (iter == mMIndexBuffer.End()) { _IndexData data; data.start = 0; data.index_count = 0; data.prim_count = 0; data.prim_type = PRIM_TRIANGLESTRIP; const _IndexPool & body = mBodyIndex[k.level]; const _IndexPool & north = mConecterIndex[k.level][k.north][__NorthIndex]; const _IndexPool & south = mConecterIndex[k.level][k.south][__SouthIndex]; const _IndexPool & west = mConecterIndex[k.level][k.west][__WestIndex]; const _IndexPool & east = mConecterIndex[k.level][k.east][__EastIndex]; if (body.indeces) data.index_count += body.size + 2; if (north.indeces) data.index_count += north.size + 2; if (south.indeces) data.index_count += south.size + 2; if (west.indeces) data.index_count += west.size + 2; if (east.indeces) data.index_count += east.size; d_assert (data.index_count > 0 && data.index_count < 65536); data.index_buffer = VideoBufferManager::Instance()->CreateIndexBuffer(data.index_count * sizeof(short)); int index = 0; bool flag = false; short * indeces = (short *)data.index_buffer->Lock(0, 0, LOCK_NORMAL); if (body.indeces) { Memcpy(indeces + index, body.indeces, body.size * sizeof(short)); index += body.size; flag = true; } if (north.indeces) { if (flag) { indeces[index++] = indeces[index - 1]; indeces[index++] = north.indeces[0]; } Memcpy(indeces + index, north.indeces, north.size * sizeof(short)); index += north.size; flag = true; } if (south.indeces) { if (flag) { indeces[index++] = indeces[index - 1]; indeces[index++] = south.indeces[0]; } Memcpy(indeces + index, south.indeces, south.size * sizeof(short)); index += south.size; flag = true; } if (west.indeces) { if (flag) { indeces[index++] = indeces[index - 1]; indeces[index++] = west.indeces[0]; } Memcpy(indeces + index, west.indeces, west.size * sizeof(short)); index += west.size; flag = true; } if (east.indeces) { if (flag) { indeces[index++] = indeces[index - 1]; indeces[index++] = east.indeces[0]; } Memcpy(indeces + index, east.indeces, east.size * sizeof(short)); index += east.size; flag = true; } data.index_buffer->Unlock(); data.prim_count = index - 2; iter = mMIndexBuffer.Insert(k, data); } return iter->second; }