Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.04;
Скачать: CL | DM;

Вниз

Фатальная ошибка при вызове CollisionManager.CheckCollisions   Найти похожие ветки 

 
Fosgen   (2005-07-20 09:06) [0]

Вопрос:
Никто не сталкивался с появлением ошибки 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 09:55) [1]

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


 
DeadMeat ©   (2005-07-20 10:17) [2]

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


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


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-ти, с указанными проблемами. Я был, мягко говоря, неприятно удивлен. Думаю проблема в "доработке" поздней версии.


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.12.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.044 c
14-1130773681
Piter
2005-10-31 18:48
2005.12.04
Знатокам JavaScript


3-1129644747
DancerMan
2005-10-18 18:12
2005.12.04
DBGridEh. Как изменить цвет строки по клику на ней?


14-1132012657
ronyn
2005-11-15 02:57
2005.12.04
Как создать эмуляцию Win в *.nix?


1-1131126666
Arazel
2005-11-04 20:51
2005.12.04
Control "has no parent window"


2-1132216256
Creator__
2005-11-17 11:30
2005.12.04
Глюк Delphi 2005 или я чего-то недопонимаю...