Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Фатальная ошибка при вызове CollisionManager.CheckCollisions [Delphi, GLScene, Windows]


Fosgen ©   (2005-07-20 09:06:00) 

Вопрос:
Никто не сталкивался с появлением ошибки Access Violationпри вызове CollisionManager.CheckCollisionsпосле перехода на более "свежие" версии GLScene? Ошибка возникает даже если обработчик CheckCollisions - "пустой" - т.е. кроме комментарием между begin ... end;ничего нет.

Подробности:
В столкновениях участвуют FreeForms с построенным Octree (BuildOctree). Для определения конкретной точки соприкосновения объектов. При рассчитанных Octree отладчик стопорится в модуле VectorLists.
При отключении расчета Octree отладчик вообще не указывает какое-либо место. Просто возникает Access Violation.

В обоих случаях:
Обработчик CheckCollision - пустой.
Если даже по счастливому совпадению программа запустилась - идут страшные тормоза (видюха - GF6800GT PCI-Ex, P-3000, 1Gb RAM) - порядка 2 FPS!!! При выходе из программы корректным способом - возникает все тот же Access Violation.
Помогите, кто чем может! Заранее - спасибо!


Fosgen   (2005-07-20 11:03:00) [1]

Насчет "пустого" обработчика TForm1.MisCollision(Sender: TObject; object1,
object2: TGLBaseSceneObject); - Если закоментировать ВСЕ что есть между begin...end; - ничего в работе кода не меняется.


Fosgen   (2005-07-20 11:01:00) [2]


procedure TForm1.GLCadencer1Progress(Sender: TObject; DeltaTime,
 NewTime: Double);
begin
  MissileCollision.CheckCollision;
end;

procedure TForm1.MisCollision(Sender: TObject; object1,
 object2: TGLBaseSceneObject);
var i: Byte;
 Dis1, Dis2: Single;
 rayStart, rayVector, iPoint, iNormal: TVector;
 CurrentObj: TGLFreeForm;
 CurrentShield: TShield;
begin
// GLCadencer1.Enabled:=False;
if Sender=MissileCollision then
begin
//===Missile=================================================================
 if (object2.ClassName = 'TMissileForm') and (object1.ClassName <> 'TShotForm') and (object1.ClassName <> 'TGLPlane') and (Missile[object2.Tag] <> nil) then
 begin
   if (object1.ClassName = 'TShield') then
   begin
     CurrentShield := object1 as TShield;
     if (CurrentShield.RaceOwner <> Missile[object2.tag].RaceOwner) then
     begin
       Missile[object2.tag].Detonate := True;
       Missile[object2.tag].HitedObj := object1 as TGLCustomSceneObject;
       //CurrentShield.FlashHit(CurrentShield.ShieldPower - Missile[object2.tag].Power);
       AddHit(iPoint, iNormal, tsPlasma, 40, True);
       CurrentShield.ShieldPower := CurrentShield.ShieldPower - Missile[object2.tag].Power;
       if CurrentShield.ShieldPower <= 0 then
         with TGLBCollision(CurrentShield.Behaviours.GetByClass(TGLBCollision)) do
           GroupIndex := -1;
     end;
   end else
   begin
     Missile[object2.tag].Detonate := True;
     Missile[object2.tag].HitedObj := object1 as TGLCustomSceneObject;
   end;
 end;
 //=====Shot=======================================================================
 if (object2.ClassName = 'TShotForm') and (object1.ClassName <> 'TShotForm') and (object1.ClassName <> 'TMissileForm') and (object1.ClassName <> 'TGLPlane') and (Shot[object2.Tag] <> nil) then
 begin
   Shot[object2.Tag].HitedObj := object1 as TGLCustomSceneObject;
   rayStart := object2.AbsolutePosition;
   rayVector := object2.Direction.AsVector;
   NegateVector(rayVector);
   NormalizeVector(rayVector);
   CurrentObj := object1 as TGLFreeForm;
   if CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal) then
   begin
     NormalizeVector(iNormal);
     if (object1.ClassName = 'TShield') then
     begin
       CurrentShield := object1 as TShield;
       if (CurrentShield.RaceOwner <> Shot[object2.tag].RaceOwner) then
       begin
         AddHit(iPoint, iNormal, tsPlasma, 40, True);
         Shot[object2.tag].Detonate := True;
         Shot[object2.tag].fmodel.Visible := False;
           //CurrentShield.FlashHit(CurrentShield.ShieldPower - Shot[object2.tag].Power);
         CurrentShield.ShieldPower := CurrentShield.ShieldPower - Shot[object2.tag].Power;
         if CurrentShield.ShieldPower <= 0 then
           with CurrentShield.Behaviours.Behaviour[0] as TGLBCollision do
             GroupIndex := -1;
       end;
     end else
     begin
       AddHit(iPoint, iNormal, tsPlasma, 40, False);
       Shot[object2.tag].Detonate := True;
       Shot[object2.tag].fmodel.Visible := False;
     end;
   end;
 end;
 //======Beam======================================================================
 if (object1.ClassName = 'TBeamForm') and (object2.ClassName <> 'TBeamForm') and (object2.ClassName <> 'TShotForm') and (object2.ClassName <> 'TGLPlane') and (object2.ClassName <> 'TGLSprite') then
 begin
   if Beam[object1.tag] <> nil then begin
     SetVector(rayStart, Beam[object1.tag].StartVector);
     SetVector(rayVector, Beam[object1.tag].TrgVector);
       {NormalizeVector(RayVector);
       //ScaleVector(RayVector, 15);
       AddVector(rayVector, rayStart);
       SetVector(rayVector, object1.AbsoluteDirection); }
       //ScaleVector(rayVector,991);

     CurrentObj := object2 as TGLFreeForm;
     if (not Beam[object1.tag].Detonate) and (CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal)) then
     begin
       NormalizeVector(iNormal);
       with Beam[object1.tag] do begin
         Beam[object1.Tag].HitedObj := object2 as TGLCustomSceneObject;
         tdummy := TGLDummyCube(GLcadencer1.Scene.Objects.AddNewChild(TGLDummyCube));
         tdummy.Position.AsVector := iPoint;
         tdummy.Direction.AsVector := iNormal;
         Detonate := True;
         Hit;
         with Beam[object1.tag].fHitSprite do begin //Creating flare of firing
           Material.BlendingMode := bmAdditive;
           Material.MaterialLibrary := Sfx_Textures;
           Material.LibMaterialName := 'beamHit';
           ObjectsSorting := osNone;
         end;
       end;
     end;
   end;
 end;
 if (object2.ClassName = 'TBeamForm') and (object1.ClassName <> 'TBeamForm') and (object1.ClassName <> 'TShotForm') and (object1.ClassName <> 'TGLPlane') and (object1.ClassName <> 'TGLSprite') then
 begin
   if Beam[object2.tag] <> nil then begin
     SetVector(rayStart, Beam[object2.tag].helper.AbsolutePosition);
     SetVector(rayVector, Beam[object2.tag].TrgVector);
       {NormalizeVector(RayVector);
       ScaleVector(RayVector, 15);
       AddVector(rayVector, rayStart);
       SetVector(rayVector, object2.AbsoluteDirection);
       ScaleVector(rayVector,991);  }

     CurrentObj := object1 as TGLFreeForm;
     if (not Beam[object2.Tag].Detonate) and (CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal)) then
     begin
       NormalizeVector(iNormal);
       with Beam[object2.tag] do begin
         Beam[object2.Tag].HitedObj := object1 as TGLCustomSceneObject;
         tdummy := TGLDummyCube(GLcadencer1.Scene.Objects.AddNewChild(TGLDummyCube));
         tdummy.Position.AsVector := iPoint;
         tdummy.Direction.AsVector := iNormal;
         Detonate := True;
         Hit;
         with Beam[object2.tag].fHitSprite do begin //Creating flare of firing
           Material.BlendingMode := bmAdditive;
           Material.MaterialLibrary := Sfx_Textures;
           Material.LibMaterialName := 'beamHit';
           ObjectsSorting := osNone;
         end;
       end;
     end;
   end;
 end;
// GLCadencer1.Enabled:=True; }
end;
end;


Цели:
Через CollisionManager - определяется факт столкновения и взаимодейстующие объекты. Потом через OctreeRayCastIntersect - точка столкновения и нормаль для создания "спецэффектов".
Повторюсь - под старой версией GLScene все работало. Отлажены были блоки Shot и Missile. После "апгрейда" GLScene престали отрабатывать столкновения и стало безумно тормозить. Работает 1 раз из 10-ти, с указанными проблемами. Я был, мягко говоря, неприятно удивлен. Думаю проблема в "доработке" поздней версии.


DeadMeat   (2005-07-20 10:17:00) [3]

Код..? И если можно цели.. Может есть другой способ..


Fosgen   (2005-07-20 09:55:00) [4]

Еще хотелось бы добавить - под старой версией GLScene (в которой еще не было GLLensFlare, GLTrail и PerlinGFX) весь имеющийся алгоритм совершенно корректно работал и давал порядка 170 FPS. Проблемы начались именно после перехода на более "совершенную" версию. :(((


Наверх

Титульная страница Поиск, карта сайта Написать письмо