• R/O
  • SSH
  • HTTPS

marathon: コミット


コミットメタ情報

リビジョン343 (tree)
日時2007-06-22 19:23:21
作者hogepiyo

ログメッセージ

*** empty log message ***

変更サマリ

差分

--- marathon/trunk/HPLLib/HPLStockManager.cpp (revision 342)
+++ marathon/trunk/HPLLib/HPLStockManager.cpp (revision 343)
@@ -45,32 +45,56 @@
4545 具体的にはdynamic_worldの値に合わせて要素数を増加させます
4646 増加分は削除対象ではないのですべてfalseです。
4747 次に、実際のデータを調べて関連性があるものをさらに削除します。
48- ・点削除→
49- 端点になっている線を消す
50- (ポリゴンを消す←線の部分で行う)
51- (Side、Objectは無関係)
48+ -endpoint_data
49+ [delete point]
50+ lines depend this -> delete line
51+ polygon depends this -> delete polygon (but no need to do, because deleted line will delete polygon)
52+ <jp>依存している線を消すときにポリゴンを消してくれるので無視します
53+ [no delete]
54+ polygon_index -> set NONE when polygon is to be deleted
5255
53- 依存項目はない
56+ -line_data
57+ [delete line]
58+ endpoints depend this -> none necessity to do
59+ <jp>点は残ります。
60+ polygon depends this -> delete
61+ sides depend this -> delete
5462
55- ・線削除→
56- Sideも削除
57- ポリゴンを消す
58- (点はこれ以上消さない。オブジェクトは無関係)
63+ [no delete]
64+ *_polygon_owner -> set NONE when polygon is to be deleted
65+ *_polygon_side_owner -> set NONE when side is to be deleted
5966
60- 依存項目なし
67+ -polygon_data
68+ [delete polygon]
69+ points depend this -> nope
70+ <jp>点は残るんよ
71+ lines depend this -> nope
72+ sides depend this -> delete side
73+ objects depend this -> delete them
6174
62- ・Side削除→
63- 存在としては他と独立しているので、他に消すものはない
75+ [no delete]
76+ endpoint_indexes, line_indexes -> no to do
77+ side_indexes -> set NONE when sides are to be deleted
78+ first_object_index -> set NONE when no objects are on this
6479
65- 線のSideをNONEに
66- ポリゴンのside_indexesの該当部分をNONEに
67-
68- ・ポリゴン削除→
69- 空間になるので、Sideも削除(line_data::clockwise_polygon_ownerなどで調べる)
70- 乗っているオブジェクトを削除
71-
72- 点、線、Sideのポリゴン番号をNONEに
80+ TODO lineを全てsolidにする
7381
82+ -side_data
83+ [delete side]
84+ nope
85+
86+ [no delete]
87+ line_index -> nope
88+ <jp>線が消えていればSideも消されるので何もしなくてよい
89+ polygon_index -> nope
90+
91+ -map_object
92+ [delete object]
93+ nope
94+
95+ [no delete]
96+ polygon_index -> nope
97+
7498 */
7599 void hpl::aleph::HPLStockManager::updateDeletes()
76100 {
@@ -91,106 +115,178 @@
91115 delObjects.push_back(false);
92116 }
93117
94- //点関連の削除対象整理
118+ //点関連の削除対象整理 <en> endpoints
95119 for(int i = 0; i < (int)delPoints.size(); i ++){
96120 if(delPoints[i]){
97121 //削除対象
98- //所有している線も削除する
122+ //所有している線も削除する (線と強依存関係 strong depenence -> lines )
99123 std::vector<int> lineIndexes = hpl::aleph::map::getLineIndexesIncludePoint(i);
100124 for(int j = 0; j < (int)lineIndexes.size(); j ++){
101125 delLines[lineIndexes[i]] = true;
102126 }
127+ //ポリゴンも強依存関係だが、線から消えていくので放置
103128 }else{
104129 //残る
105130 endpoint_data* ep = get_endpoint_data(i);
106- if(ep->supporting_polygon_index != NONE &&
107- get_polygon_data(ep->supporting_polygon_index) != NULL &&
108- delPolygon[ep->supporting_polygon_index])
109- {
110- //関連ポリゴンが消されるならば対応を切っておく
111- ep->supporting_polygon_index = NONE;
131+ if(ep->supporting_polygon_index != NONE){
132+ assert(get_polygon_data(ep->supporting_polygon_index));
133+ if(delPolygon[ep->supporting_polygon_index]){
134+ //関連ポリゴンが消されるならば対応を切っておく
135+ ep->supporting_polygon_index = NONE;
136+ }
112137 }
113138 }
114139 }
140+
141+ //線 <en> lines
115142 for(int i = 0; i < (int)delLines.size(); i ++){
116143 line_data* line = get_line_data(i);
144+ assert(line);
117145 if(delLine[i]){
118146 //関連するポリゴンを削除する
119147 if(line->clockwise_polygon_owner != NONE){
148+ assert(get_polygon_data(line->clockwise_polygon_owner));
120149 delPolygons[line->clockwise_polygon_owner] = true;
121150 }
122151 if(line->counterclockwise_polygon_owner != NONE){
152+ assert(get_polygon_data(line->counterclockwise_polygon_owner));
123153 delPolygons[line->counterclockwise_polygon_owner] = true;
124154 }
155+ //線のSideを消す
156+ if(line->clockwise_polygon_side_index != NONE){
157+ assert(get_side_data(line->clockwise_polygon_side_index));
158+ delSide[line->clockwise_polygon_side_index] = true;
159+ }
160+ if(line->counterclockwise_polygon_side_index != NONE){
161+ assert(get_side_data(line->counterclockwise_polygon_side_index));
162+ delSide[line->counterclockwise_polygon_side_index] = true;
163+ }
125164 }else{
126165 //残る
127166 //点が消えていたら残っているわけがないので考慮しなくてよい
128- //Sideが消えていたら関連を切る
129- if(delSides.at(line->clockwise_polygon_side_index)){
130- line->clockwise_polygon_side_index = NONE;
167+
168+ //ポリゴンが消えていたら関連を切る
169+ if(line->clockwise_polygon_owner != NONE){
170+ assert(get_polygon_data(line->clockwise_polygon_owner));
171+ if(delPolygons.at(line->clockwise_polygon_owner)){
172+ line->clockwise_polygon_owner = NONE;
173+ }
131174 }
132- if(delSides[line->counterclockwise_polygon_side_index]){
133- line->counterclockwise_polygon_side_index = NONE;
175+ if(line->counterclockwise_polygon_owner != NONE){
176+ assert(get_polygon_data(line->counterclockwise_polygon_owner));
177+ if(delPolygons[line->counterclockwise_polygon_owner]){
178+ line->counterclockwise_polygon_owner = NONE;
179+ }
134180 }
135- }
136- }
137181
138- //Side
139- for(int i = 0; i < (int)delSides.size(); i ++){
140- side_data* side = get_side_data(i);
141- if(delSides[i]){
142- //消す
143- //線からリンクを外させる
144- //…のはすでに終わっている
145- }else{
146- //残る
147- //関連するインデックスをNONEにする
148- if(delLines[side->line_index]){
149- side->line_index = NONE;
182+ //Sideが消えていたら関連を切る
183+ if(line->clockwise_polygon_side_index != NONE){
184+ assert(get_side_data(line->clockwise_polygon_side_index));
185+ if(delSides.at(line->clockwise_polygon_side_index)){
186+ line->clockwise_polygon_side_index = NONE;
187+ }
150188 }
151- if(delPolygon[side->polygon_index]){
152- //自身も削除する
153- side->polygon_index = NONE;
189+ if(line->counterclockwise_polygon_side_index != NONE){
190+ assert(get_side_data(line->counterclockwise_polygon_side_index));
191+ if(delSides[line->counterclockwise_polygon_side_index]){
192+ line->counterclockwise_polygon_side_index = NONE;
193+ }
154194 }
155195 }
156196 }
197+
157198 //ポリゴン
158199 for(int i = 0; i < (int)delPolygons.size(); i ++){
159200 polygon_data* poly = get_polygon_data(i);
201+ int n = poly->vertex_count;
160202 if(delPolygons[i]){
161203 //削除対象
204+ //関連するsideも消す
205+ for(int j = 0; j < n; j ++){
206+ if(poly->side_indexes[j] != NONE){
207+ assert(get_side_data(poly->side_indexes[j]));
208+ delSides[poly->side_indexes[j]] = true;
209+ }
210+ }
211+
162212 //オブジェクトも消す
163-
213+ for(int j = 0; j < (int)SavedObjectList.size(); j ++){
214+ map_object* obj = &SavedObjectList[j];
215+ assert(obj);
216+ if(obj->polygon_index == i){
217+ delObjects[j] = true;
218+ }
219+ }
164220 }else{
165221 //残る
222+ for(int j = 0; j < n; j ++){
223+ if(poly->side_indexes[j] != NONE){
224+ assert(get_side_data(poly->side_indexes[j]));
225+ if(delSides[poly->side_indexes[j]]){
226+ poly->side_indexes[j] = NONE;
227+ }
228+ }
229+ }
166230 }
167231 }
232+
233+ //Side
234+ for(int i = 0; i < (int)delSides.size(); i ++){
235+ side_data* side = get_side_data(i);
236+ if(delSides[i]){
237+ //消す
238+ }else{
239+ //消さない
240+ }
241+ }
242+
243+ //objects
244+ for(int i = 0; i < (int)delObjects.size(); i ++){
245+ if(delObjects[i]){
246+ //消さない
247+ }else{
248+ //消さない
249+ }
250+ }
168251 }
169252
170253 /**
171254 削除情報を初期化
172- 実際にはclearした後にdaupteDeletes()を呼んでるだけ
255+ 実際にはclearした後にupdateDeletes()を呼んでるだけ
173256 */
174257 void hpl::aleph::HPLStockManager::resetDeletes()
175258 {
259+ delPoints.clear();
260+ delLines.clear();
261+ delSides.clear();
262+ delPolygons.clear();
263+ delObjects.clear();
264+
265+ this->updateDeletes();
176266 }
177267
178268 bool hpl::aleph::HPLStockManager::deletePoint(int index)
179269 {
180- if(get_endpoint_data(index) == NULL){
181- return false;
182- }
270+ assert(get_endpoint_data(index));
183271 this->delPoints[index] = true;
184272 }
185273 bool hpl::aleph::HPLStockManager::deleteLine(int index)
186274 {
275+ assert(get_line_data(index));
276+ this->delLines[index] = true;
187277 }
188278 bool hpl::aleph::HPLStockManager::deletePolygon(int index)
189279 {
280+ assert(get_polygon_data(index));
281+ this->delPolygons[index] = true;
190282 }
191283 bool hpl::aleph::HPLStockManager::deleteSide(int index)
192284 {
285+ assert(get_side_data(index));
286+ this->delSides[index] = true;
193287 }
194288 bool hpl::aleph::HPLStockManager::deleteObject(int index)
195289 {
290+ assert(index >= 0 && index < SavedObjectList.size());
291+ this->delObjects[index] = true;
196292 }
旧リポジトリブラウザで表示