ソースを参照

Dynamic Shadows

added dynamic shadow map object
marauder2k7 5 年 前
コミット
48600313f7

+ 3 - 0
engine/compilers/VisualStudio 2017/Torque 2D.vcxproj

@@ -276,6 +276,7 @@
     <ClCompile Include="..\..\source\2d\sceneobject\SceneObjectList.cc" />
     <ClCompile Include="..\..\source\2d\sceneobject\SceneObjectSet.cc" />
     <ClCompile Include="..\..\source\2d\sceneobject\Scroller.cc" />
+    <ClCompile Include="..\..\source\2d\sceneobject\ShadowMap.cc" />
     <ClCompile Include="..\..\source\2d\sceneobject\ShapeVector.cc" />
     <ClCompile Include="..\..\source\2d\sceneobject\SkeletonObject.cc" />
     <ClCompile Include="..\..\source\2d\sceneobject\Sprite.cc" />
@@ -727,6 +728,8 @@
     <ClInclude Include="..\..\source\2d\sceneobject\SceneObject_ScriptBinding.h" />
     <ClInclude Include="..\..\source\2d\sceneobject\Scroller.h" />
     <ClInclude Include="..\..\source\2d\sceneobject\Scroller_ScriptBinding.h" />
+    <ClInclude Include="..\..\source\2d\sceneobject\ShadowMap.h" />
+    <ClInclude Include="..\..\source\2d\sceneobject\ShadowMap_ScriptBinding.h" />
     <ClInclude Include="..\..\source\2d\sceneobject\ShapeVector.h" />
     <ClInclude Include="..\..\source\2d\sceneobject\ShapeVector_ScriptBinding.h" />
     <ClInclude Include="..\..\source\2d\sceneobject\SkeletonObject.h" />

+ 9 - 0
engine/compilers/VisualStudio 2017/Torque 2D.vcxproj.filters

@@ -1459,6 +1459,9 @@
     <ClCompile Include="..\..\source\Box2D\Common\b2TrackedBlock.cpp">
       <Filter>Box2D\Common</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\source\2d\sceneobject\ShadowMap.cc">
+      <Filter>2d\sceneobject</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\source\audio\audio.h">
@@ -3243,6 +3246,12 @@
     <ClInclude Include="..\..\source\Box2D\Common\b2TrackedBlock.h">
       <Filter>Box2D\Common</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\source\2d\sceneobject\ShadowMap.h">
+      <Filter>2d\sceneobject</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\source\2d\sceneobject\ShadowMap_ScriptBinding.h">
+      <Filter>2d\sceneobject</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <CustomBuild Include="..\..\source\math\mMath_ASM.asm">

+ 5 - 0
engine/source/2d/core/ParticleSystem.h

@@ -67,6 +67,11 @@ public:
         F32                     mRandomMotion;
         ColorF                  mColor;    
 
+        /// Physics particles
+        bool                    mPhysicsParticles;
+        b2ParticleGroupDef      mParticleGroup;
+        b2ParticleSystem*       mParticleSystem;
+
         /// Interpolated Tick Position.
         Vector2                 mPreTickPosition;
         Vector2                 mPostTickPosition;

+ 0 - 1
engine/source/2d/sceneobject/ParticlePlayer.cc

@@ -1152,7 +1152,6 @@ void ParticlePlayer::configureParticle( EmitterNode* pEmitterNode, ParticleSyste
            Vector2 tPos = pParticleAssetEmitter->getTargetPosition();
            Vector2 pPos = pParticleNode->mPosition;
            Vector2 subVec = tPos - pPos;
-           //Vector2 subVecF = subVec.getUnitDirection();
            F32 vecN = mAtan(subVec.x, subVec.y);
            F32 vecDeg = mRadToDeg(vecN);
            emissionAngle = vecDeg;

+ 175 - 0
engine/source/2d/sceneobject/ShadowMap.cc

@@ -0,0 +1,175 @@
+#include "graphics/dgl.h"
+#include "console/consoleTypes.h"
+#include "2d/core/Utility.h"
+#include "ShadowMap.h"
+
+// Script bindings.
+#include "ShadowMap_ScriptBinding.h"
+
+IMPLEMENT_CONOBJECT(ShadowMap);
+
+ShadowMap::ShadowMap()
+{
+   // Use a static body by default.
+   mBodyDefinition.type = b2_staticBody;
+}
+
+ShadowMap::~ShadowMap()
+{
+
+}
+
+bool ShadowMap::onAdd()
+{
+   // Call Parent.
+   if (!Parent::onAdd())
+      return false;
+
+   // Return Okay.
+   return true;
+}
+
+//----------------------------------------------------------------------------
+
+void ShadowMap::onRemove()
+{
+   // Call Parent.
+   Parent::onRemove();
+}
+
+void ShadowMap::initPersistFields()
+{
+   Parent::initPersistFields();
+}
+
+void ShadowMap::safeDelete(void)
+{
+   Parent::safeDelete();
+}
+
+void ShadowMap::sceneRender(const SceneRenderState * sceneRenderState, const SceneRenderRequest * sceneRenderRequest, BatchRender * batchRender)
+{
+   Vector2 worldPos = getPosition();
+   F32 radius = getSize().x * 0.5f;
+   glDisable(GL_TEXTURE_2D);
+   glPushMatrix();
+   glTranslatef(worldPos.x, worldPos.y, 0);
+   glPolygonMode(GL_FRONT, GL_FILL);
+
+   glBlendFunc(GL_DST_COLOR, GL_ZERO);
+   // Creates the fading dark region.
+   glBegin(GL_TRIANGLE_FAN);
+   glColor4f(1, 1, 1, 1);
+   glVertex2f(0, 0);
+   glColor4f(0, 0, 0, 1);
+   glEnd();
+
+   glBegin(GL_TRIANGLE_STRIP);
+   glColor4f(0, 0, 0, 1);
+   glVertex2f(10, 10);
+   glEnd();
+   Scene* scene = getScene();
+
+   U32 objCount = scene->getSceneObjectCount();
+   for (U32 i = 0; i < objCount; i++)
+   {
+      SceneObject *tObj = scene->getSceneObject(i);
+      Vector2 distancePos = worldPos - tObj->getPosition();
+
+      const F32 distanceSqr = distancePos.LengthSquared();
+      const F32 radiusSqr = radius * radius;
+      if (distanceSqr < radiusSqr || distanceSqr == radiusSqr)
+      {
+         Con::printf("Found object to shadow");
+         processObject(tObj);
+      }
+   }
+
+   glPopMatrix();
+
+}
+
+void ShadowMap::OnRegisterScene(Scene* mScene)
+{
+   Parent::OnRegisterScene(mScene);
+   Con::printf("we are atleast here");
+   mScene->getWorldQuery()->addAlwaysInScope(this);
+
+}
+
+void ShadowMap::OnUnregisterScene(Scene* mScene)
+{
+   mScene->getWorldQuery()->removeAlwaysInScope(this);
+   Parent::OnUnregisterScene(mScene);
+}
+
+void ShadowMap::processObject(SceneObject *obj)
+{
+   Vector2 pos = getPosition();
+   Vector<Vector2> verts;
+   U32 shapeCount = obj->getCollisionShapeCount();
+   for (U32 i = 0; i < shapeCount; i++)
+   {
+      if (obj->getCollisionShapeType(i) == b2Shape::e_polygon)
+      {
+         Con::printf("We have a polygonshape on this sceneobject");
+         U32 pointCount = obj->getPolygonCollisionShapePointCount(i);
+         for (U32 n = 0; n < pointCount; n++)
+         {
+            Vector2 locPoint = obj->getPolygonCollisionShapeLocalPoint(i, n);
+            Vector2 wPoint = obj->getWorldPoint(locPoint);
+
+            verts.push_back(wPoint);
+         }
+
+         renderShadow(verts, pos);
+      }
+   }
+}
+
+void ShadowMap::renderShadow(const Vector<Vector2>& verts, const Vector2& lightPos)
+{
+   Con::printf("renderShadow");
+   Con::printf("glBegin in rendershadow");
+   S32 startVert = 0;
+   S32 endVert = 0;
+   for(S32 i = 1; i < verts.size() + 1; i++)
+   {
+      S32 vert0 = (i - 1) % verts.size();
+      S32 vert1 = (i) % verts.size();
+      S32 vert2 = (i + 1) % verts.size();
+      Vector2 normal0(verts[vert0] - verts[vert1]);
+      normal0.perp();
+      Vector2 normal1(verts[vert1] - verts[vert2]);
+      normal1.perp();
+      Vector2 ray(verts[vert1] - lightPos);
+      F32 n0 = ray.dot(normal0);
+      F32 n1 = ray.dot(normal1);
+      if (n0 <= 0 && n1 > 0)
+      {
+         startVert = vert1;
+      }
+      if (n0 > 0 && n1 <= 0)
+      {
+         endVert = vert1;
+      }
+   }
+   glEnable(GL_BLEND);
+   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+   //glDisable(GL_TEXTURE_2D);
+   glColor4f(0, 0, 0, 1);
+   glBegin(GL_TRIANGLE_STRIP);
+   for (S32 i = 0; i < verts.size(); i++)
+   {
+      S32 vert = (startVert + i) % verts.size();
+      Vector2 ray(verts[vert] - lightPos); ray.Normalize(600.0f);
+      glVertex2f(verts[vert].x, verts[vert].y);
+      glVertex2f(verts[vert].x + ray.x, verts[vert].y + ray.y);
+      if (vert == endVert) break;
+   }
+   //glVertex2f(verts[0].x, verts[0].y);
+   //glVertex2f(verts[1].x, verts[1].y);
+   //glVertex2f(lightPos.x, lightPos.y);
+   //glVertex2f(verts[3].x, verts[3].y);
+   glEnd();
+}

+ 48 - 0
engine/source/2d/sceneobject/ShadowMap.h

@@ -0,0 +1,48 @@
+#ifndef _SHADOWMAP_H_
+#define _SHADOWMAP_H_
+
+#ifndef _SCENE_OBJECT_H_
+#include "2d/sceneobject/SceneObject.h"
+#endif
+
+class ShadowMap : public SceneObject
+
+{
+   typedef SceneObject Parent;
+
+protected:
+   F32            mLightRadius;
+
+public:
+   ShadowMap();
+   ~ShadowMap();
+
+   static void initPersistFields();
+
+   inline void setLightRadius(const F32 lightRadius) { mLightRadius = lightRadius; }
+   inline F32 getLightRadius(void) const { return mLightRadius; }
+
+   virtual bool onAdd();
+   virtual void onRemove();
+
+   virtual void safeDelete(void);
+   virtual void sceneRender(const SceneRenderState* sceneRenderState, const SceneRenderRequest* sceneRenderRequest, BatchRender* batchRender);
+   //virtual bool validRender(void) const {}
+   virtual bool shouldRender(void) const { return true; }
+
+   void processObject(SceneObject *obj);
+   void renderShadow(const Vector<Vector2>& verts, const Vector2& lightPos);
+
+   DECLARE_CONOBJECT(ShadowMap);
+
+
+   protected:
+      virtual void OnRegisterScene(Scene* mScene);
+      virtual void OnUnregisterScene(Scene* mScene);
+
+private:
+
+};
+
+
+#endif //_SHADOWMAP_H_

+ 1 - 0
engine/source/2d/sceneobject/ShadowMap_ScriptBinding.h

@@ -0,0 +1 @@
+#pragma once

+ 10 - 1
modules/PyramidToy/1/main.cs

@@ -88,7 +88,8 @@ function PyramidToy::setBlockSize(%this, %value)
 //-----------------------------------------------------------------------------
 
 function PyramidToy::createBackground( %this )
-{    
+{ 
+
     // Create the sprite.
     %object = new Sprite();
     
@@ -125,6 +126,7 @@ function PyramidToy::createGround( %this )
     %ground.setSize(PyramidToy.GroundWidth, 6);
     %ground.setRepeatX(PyramidToy.GroundWidth / 60);   
     %ground.createEdgeCollisionShape(PyramidToy.GroundWidth/-2, 3, PyramidToy.GroundWidth/2, 3);
+	%ground.SceneLayer = 10;
     SandboxScene.add(%ground);  
     
     // Create the grass.
@@ -133,6 +135,7 @@ function PyramidToy::createGround( %this )
     %grass.Image = "ToyAssets:grassForeground";
     %grass.setPosition(0, -8.5);
     %grass.setSize(PyramidToy.GroundWidth, 2); 
+	%grass.SceneLayer = 10;
     SandboxScene.add(%grass);       
 }
 
@@ -180,9 +183,15 @@ function PyramidToy::createPyramid( %this )
             %obj.setImageFrame( getRandom(0,55) );
             %obj.setDefaultFriction( 1.0 );
             %obj.createPolygonBoxCollisionShape( %blockSize, %blockSize );
+			%obj.SceneLayer = 15;
             
             // Add to the scene.
             SandboxScene.add( %obj );          
         }
     }
+	
+	%map = new ShadowMap();
+	%map.setSize("15 15");
+	%map.setBodyType(Static);
+	SandboxScene.add(%map);
 }