Example #1
0
        public override void Render(SSRenderConfig renderConfig)
        {
            if (textures == null) return;

            base.Render(renderConfig);

            GL.MatrixMode(MatrixMode.Modelview);
            GL.ActiveTexture(TextureUnit.Texture0);
            GL.Enable(EnableCap.Texture2D);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS,
                (int)TextureWrapMode.Clamp);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT,
                (int)TextureWrapMode.Clamp);

            Matrix4 scaleAndPosMat = Matrix4.CreateScale(this.Scale)
                * Matrix4.CreateTranslation(0f, 0f, -this.Scale.X/2f);

            for (int i = 0; i < (int)Face.NumFaces; ++i) {
            //for (int i = 0; i < 1; ++i) {
                var tex = textures [i];
                if (tex != null) {
                    var mvMat = scaleAndPosMat * orientations [i] * renderConfig.invCameraViewMatrix;
                    GL.LoadMatrix(ref mvMat);

                    GL.BindTexture(TextureTarget.Texture2D, textures [i].TextureID);

                    SSTexturedQuad.singleFaceInstance.drawSingle(renderConfig, PrimitiveType.Triangles);
                }
            }
        }
 public override void Render(SSRenderConfig renderConfig)
 {
     if (_burningObject != null) {
         this.worldMat = _burningObject.worldMat;
     }
     base.Render(renderConfig);
 }
Example #3
0
        public override void Render(SSRenderConfig renderConfig)
        {
            if (_attachTo != null && !_attachTo.renderState.toBeDeleted)
            {
                this.worldMat = _attachTo.worldMat;
            }

            base.Render(renderConfig);
        }
Example #4
0
        public void setupInput()
        {
            // hook mouse drag input...
            this.MouseDown += (object sender, MouseButtonEventArgs e) => {
                this.mouseButtonDown = true;

                // cast ray for mouse click
                var     clientRect = new System.Drawing.Size(ClientRectangle.Width, ClientRectangle.Height);
                Vector2 mouseLoc   = new Vector2(e.X, e.Y);

                SSRay ray = OpenTKHelper.MouseToWorldRay(
                    this.scene.ProjectionMatrix, this.scene.InvCameraViewMatrix, clientRect, mouseLoc);

                // Console.WriteLine("mouse ({0},{1}) unproject to ray ({2})",e.X,e.Y,ray);
                // scene.addObject(new SSObjectRay(ray));

                selectedObject = scene.Intersect(ref ray);
            };
            this.MouseUp += (object sender, MouseButtonEventArgs e) => {
                this.mouseButtonDown = false;
            };
            this.MouseMove += (object sender, MouseMoveEventArgs e) => {
                if (this.mouseButtonDown)
                {
                    // Console.WriteLine("mouse dragged: {0},{1}",e.XDelta,e.YDelta);
                    this.scene.ActiveCamera.MouseDeltaOrient(e.XDelta, e.YDelta);
                    // this.activeModel.MouseDeltaOrient(e.XDelta,e.YDelta);
                }
            };
            this.MouseWheel += (object sender, MouseWheelEventArgs e) => {
                // Console.WriteLine("mousewheel {0} {1}",e.Delta,e.DeltaPrecise);
                SSCameraThirdPerson ctp = scene.ActiveCamera as SSCameraThirdPerson;
                if (ctp != null)
                {
                    ctp.followDistance += -e.DeltaPrecise;
                }
            };

            this.KeyPress += (object sender, KeyPressEventArgs e) => {
                switch (e.KeyChar)
                {
                case 'w':
                    scene.DrawWireFrameMode = SSRenderConfig.NextWireFrameMode(scene.DrawWireFrameMode);
                    updateWireframeDisplayText(scene.DrawWireFrameMode);

                    // if we need single-pass wireframes, set the GLSL uniform variable
                    shaderPgm.Activate();
                    shaderPgm.u_ShowWireframes = (scene.DrawWireFrameMode == WireframeMode.GLSL_SinglePass);
                    break;
                }
            };
        }
Example #5
0
        public void renderCells(SSRenderConfig renderConfig, ssBVHNode <SSObject> n, ref SSAABB parentbox, int depth)
        {
            float nudge = 0f;

            if (parentbox.Equals(n.box))
            {
                // attempt to nudge out of z-fighting
                nudge = 0.2f;
            }

            if (highlightNodes.Contains(n))
            {
                if (n.gobjects == null)
                {
                    GL.Color4(Color.FromArgb(255, 25, 25, 100));
                }
                else
                {
                    GL.Color4(Color.Green);
                }
            }
            else
            {
                if (n.gobjects == null)
                {
                    GL.Color4(Color.FromArgb(255, 20, 20, 20));
                }
                else
                {
                    GL.Color4(Color.DarkRed);
                }
            }

            Vector3 nudgeVect = new Vector3(nudge);
            Vector3 scale     = n.box.Max - n.box.Min - 2f * nudgeVect;
            Matrix4 mat       = Matrix4.CreateScale(scale) * Matrix4.CreateTranslation(n.box.Min + nudgeVect);

            GL.PushMatrix();
            GL.MultMatrix(ref mat);
            ibo.DrawElements(renderConfig, PrimitiveType.Lines, false);
            GL.PopMatrix();

            if (n.right != null)
            {
                renderCells(renderConfig, n.right, ref n.box, depth: depth + 1);
            }
            if (n.left != null)
            {
                renderCells(renderConfig, n.left, ref n.box, depth: depth + 1);
            }
        }
 protected virtual void beforeRenderObjectHandler(Object obj, SSRenderConfig renderConfig)
 {
     if (autoWireframeMode)
     {
         if (obj == selectedObject)
         {
             renderConfig.drawWireframeMode = WireframeMode.GLSL_SinglePass;
         }
         else
         {
             renderConfig.drawWireframeMode = WireframeMode.None;
         }
     }
 }
Example #7
0
        public override void Render(SSRenderConfig renderConfig)
        {
            var        rc         = cameraScene3d.renderConfig;
            RectangleF clientRect = OpenTKHelper.GetClientRect();
            var        cameraPos
                = (cameraScene3d.ActiveCamera != null) ? cameraScene3d.ActiveCamera.Pos
                  //: Vector3.Transform(-Vector3.UnitZ, rc.invCameraViewMatrix.Inverted()).Normalized();
                : Vector3.Transform(Vector3.Zero, rc.invCameraViewMatrix.Inverted()).Normalized();

            foreach (var updater in _spriteUpdaters)
            {
                updater.updateSprites(this.instanceData, ref clientRect,
                                      ref cameraPos, ref rc.invCameraViewMatrix, ref rc.projectionMatrix);
            }

            base.Render(renderConfig);
        }
Example #8
0
                public override void Render(SSRenderConfig renderConfig)
                {
                    this.Pos = _missile.position;
                    base.Render(renderConfig);
                    SSShaderProgram.DeactivateAll();
                    GL.LineWidth(3f);
                    GL.Begin(PrimitiveType.Lines);
                    GL.Color4(Color4.LightCyan);
                    GL.Vertex3(Vector3.Zero);
                    GL.Vertex3(_missile._lataxDebug);
                    GL.Color4(Color4.Magenta);
                    GL.Vertex3(Vector3.Zero);
                    GL.Vertex3(_missile._hitTimeCorrAccDebug);
                    GL.End();

                    viewProjMat = renderConfig.invCameraViewMatrix * renderConfig.projectionMatrix;
                }
Example #9
0
        public override void Render(SSRenderConfig renderConfig)
        {
            if (renderConfig.drawingShadowMap)
            {
                return;
            }
            base.Render(renderConfig);
            SSShaderProgram.DeactivateAll();
            GL.Disable(EnableCap.Texture2D);
            GL.LineWidth(1.0f);

            GL.MatrixMode(MatrixMode.Modelview);
            ibo.Bind();
            vbo.DrawBind(renderConfig);
            this.renderCells(renderConfig, bvh.rootBVH, ref bvh.rootBVH.box, 0);
            vbo.DrawUnbind();
            ibo.Unbind();
        }
Example #10
0
        public override void Render(SSRenderConfig renderConfig)
        {
            base.Render(renderConfig);
            SSShaderProgram.DeactivateAll();

            GL.Disable(EnableCap.Texture2D);
            GL.Disable(EnableCap.Lighting);

            GL.Enable(EnableCap.PointSmooth);

            GL.PointSize(1.5f);
            GL.Begin(BeginMode.Points);
            for (int i = 0; i < this.numstars; i++)
            {
                GL.Color3(Color.FromArgb(vertices[i].DiffuseColor));
                GL.Normal3(vertices[i].Normal);
                GL.Vertex3(vertices[i].Position);
            }
            GL.End();
        }
        public override void renderMesh(SSRenderConfig renderConfig)
        {
            // apply animation channels
            _hierarchy.applySkeletalControllers(_channelControllers);

            SSAABB totalAABB = new SSAABB(float.PositiveInfinity, float.NegativeInfinity);

            foreach (var sub in _renderSubMeshes)
            {
                SSAABB aabb = sub.ComputeVertices();
                sub.renderMesh(renderConfig);
                totalAABB.ExpandBy(aabb);
            }
            // update the bounding sphere
            var sphere = totalAABB.ToSphere();

            base.boundingSphereCenter = sphere.center;
            base.boundingSphereRadius = sphere.radius;
            NotifyMeshPositionOrSizeChanged();
        }
        public override void renderMesh(SSRenderConfig renderConfig)
        {
            SSShaderProgram.DeactivateAll();

            GL.Disable(EnableCap.Texture2D);
            GL.Disable(EnableCap.Lighting);

            GL.Enable(EnableCap.PointSmooth);
            GL.Enable(EnableCap.Blend);
            GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);

            GL.PointSize(1.5f);
            GL.Begin(BeginMode.Points);
            for (int i = 0; i < this.numstars; i++)
            {
                GL.Color3(Color.FromArgb(vertices[i].DiffuseColor));
                GL.Normal3(vertices[i].Normal);
                GL.Vertex3(vertices[i].Position);
            }
            GL.End();

            GL.Disable(EnableCap.Blend);
        }
Example #13
0
        public override void Render(SSRenderConfig renderConfig)
        {
            if (_attachTo != null && !_attachTo.renderState.toBeDeleted) {
                this.worldMat = _attachTo.worldMat;
            }

            base.Render(renderConfig);
        }
Example #14
0
        public override void Render(SSRenderConfig renderConfig)
        {
            int queryResult = sunBillboard.OcclusionQueueryResult;
            if (queryResult <= 0) return;

            // Begin the quest to update VBO vertices
            Matrix4 viewInverted = sunScene.renderConfig.invCameraViewMatrix.Inverted();
            Vector3 viewRight = Vector3.Transform(new Vector3 (1f, 0f, 0f), viewInverted);
            Vector3 viewUp = Vector3.Transform(new Vector3 (0f, 1f, 0f), viewInverted);
            Vector3 sunRightMost = sunBillboard.Pos + viewRight.Normalized() * sunBillboard.Scale.X;
            Vector3 sunTopMost = sunBillboard.Pos + viewUp.Normalized() * sunBillboard.Scale.Y;

            int[] viewport = new int[4];
            GL.GetInteger(GetPName.Viewport, viewport);
            Vector2 screenOrig = new Vector2 (viewport [0], viewport [1]);
            clientRect = new Vector2 (viewport [2], viewport [3]) / 2f;
            screenCenter = screenOrig + clientRect / 2f;
            sunSceneViewProj = sunScene.renderConfig.invCameraViewMatrix * sunScene.renderConfig.projectionMatrix;
            Vector2 sunScreenPos = worldToScreen(sunBillboard.Pos);
            Vector2 sunScreenRightMost = worldToScreen(sunRightMost);
            Vector2 sunScreenTopMost = worldToScreen(sunTopMost);
            Vector2 towardsCenter = screenCenter - sunScreenPos;

            Vector2 tileVecBase = new Vector2 (sunScreenRightMost.X - sunScreenPos.X, sunScreenPos.Y - sunScreenTopMost.Y);
            float sunFullEstimate = (float)Math.PI * tileVecBase.X * tileVecBase.Y;
            float intensityFraction = Math.Min((float)queryResult / sunFullEstimate, 1f);

            // modulate sprite size with the intensity fraction
            tileVecBase *= Math.Min(1f / (1f - intensityFraction), 1.5f);

            // allow simple scaling
            tileVecBase.X *= Scale.X;
            tileVecBase.Y *= Scale.Y;

            for (int i = 0; i < numElements; ++i) {
                //assign positions
                Vector2 center = sunScreenPos + towardsCenter * 2.5f / (float)numElements * (float)i;
                Vector2 tileVec = tileVecBase * spriteScales [i];

                int baseIdx = i * 4;
                vertices [baseIdx].Position.X = center.X - tileVec.X;
                vertices [baseIdx].Position.Y = center.Y - tileVec.Y;

                vertices [baseIdx+1].Position.X = center.X + tileVec.X;
                vertices [baseIdx+1].Position.Y = center.Y - tileVec.Y;

                vertices [baseIdx+2].Position.X = center.X + tileVec.X;
                vertices [baseIdx+2].Position.Y = center.Y + tileVec.Y;

                vertices [baseIdx+3].Position.X = center.X - tileVec.X;
                vertices [baseIdx+3].Position.Y = center.Y + tileVec.Y;
            }
            Mesh.UpdateVertices(vertices);

            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();
            SSShaderProgram.DeactivateAll(); // disable shaders

            // modulate color alpha with the intensity fraction
            this.MainColor = sunBillboard.MainColor;
            this.MainColor.A = intensityFraction;

            // now, actually draw
            base.Render(renderConfig);
        }
                public override void Render (SSRenderConfig renderConfig)
                {
                    this.Pos = _missile.position;
                    base.Render(renderConfig);
                    SSShaderProgram.DeactivateAll();
                    GL.LineWidth(3f);
                    GL.Begin(PrimitiveType.Lines);
                    GL.Color4(Color4.LightCyan);
                    GL.Vertex3(Vector3.Zero);
                    GL.Vertex3(_missile._lataxDebug);
                    GL.Color4(Color4.Magenta);
                    GL.Vertex3(Vector3.Zero);
                    GL.Vertex3(_missile._hitTimeCorrAccDebug);
                    GL.End();

                    viewProjMat = renderConfig.invCameraViewMatrix * renderConfig.projectionMatrix;
                }
        public override void Render(SSRenderConfig renderConfig)
        {
            int queryResult = sunBillboard.OcclusionQueueryResult;

            if (queryResult <= 0)
            {
                return;
            }

            // Begin the quest to update VBO vertices
            Matrix4 viewInverted = sunScene.renderConfig.invCameraViewMatrix.Inverted();
            Vector3 viewRight    = Vector3.Transform(new Vector3(1f, 0f, 0f), viewInverted);
            Vector3 viewUp       = Vector3.Transform(new Vector3(0f, 1f, 0f), viewInverted);
            Vector3 sunRightMost = sunBillboard.Pos + viewRight.Normalized() * sunBillboard.Scale.X;
            Vector3 sunTopMost   = sunBillboard.Pos + viewUp.Normalized() * sunBillboard.Scale.Y;

            int[] viewport = new int[4];
            GL.GetInteger(GetPName.Viewport, viewport);
            Vector2 screenOrig = new Vector2(viewport [0], viewport [1]);

            clientRect       = new Vector2(viewport [2], viewport [3]) / 2f;
            screenCenter     = screenOrig + clientRect / 2f;
            sunSceneViewProj = sunScene.renderConfig.invCameraViewMatrix * sunScene.renderConfig.projectionMatrix;
            Vector2 sunScreenPos       = worldToScreen(sunBillboard.Pos);
            Vector2 sunScreenRightMost = worldToScreen(sunRightMost);
            Vector2 sunScreenTopMost   = worldToScreen(sunTopMost);
            Vector2 towardsCenter      = screenCenter - sunScreenPos;

            Vector2 tileVecBase       = new Vector2(sunScreenRightMost.X - sunScreenPos.X, sunScreenPos.Y - sunScreenTopMost.Y);
            float   sunFullEstimate   = (float)Math.PI * tileVecBase.X * tileVecBase.Y;
            float   intensityFraction = Math.Min((float)queryResult / sunFullEstimate, 1f);

            // modulate sprite size with the intensity fraction
            tileVecBase *= Math.Min(1f / (1f - intensityFraction), 1.5f);

            // allow simple scaling
            tileVecBase.X *= Scale.X;
            tileVecBase.Y *= Scale.Y;

            for (int i = 0; i < numElements; ++i)
            {
                //assign positions
                Vector2 center  = sunScreenPos + towardsCenter * 2.5f / (float)numElements * (float)i;
                Vector2 tileVec = tileVecBase * spriteScales [i];

                int baseIdx = i * 4;
                vertices [baseIdx].Position.X = center.X - tileVec.X;
                vertices [baseIdx].Position.Y = center.Y - tileVec.Y;

                vertices [baseIdx + 1].Position.X = center.X + tileVec.X;
                vertices [baseIdx + 1].Position.Y = center.Y - tileVec.Y;

                vertices [baseIdx + 2].Position.X = center.X + tileVec.X;
                vertices [baseIdx + 2].Position.Y = center.Y + tileVec.Y;

                vertices [baseIdx + 3].Position.X = center.X - tileVec.X;
                vertices [baseIdx + 3].Position.Y = center.Y + tileVec.Y;
            }
            Mesh.UpdateVertices(vertices);

            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();
            SSShaderProgram.DeactivateAll(); // disable shaders

            // modulate color alpha with the intensity fraction
            this.MainColor   = sunBillboard.MainColor;
            this.MainColor.A = intensityFraction;

            // now, actually draw
            base.Render(renderConfig);
        }
        public override void Render(SSRenderConfig renderConfig)
        {
            var beam = _laser.beam(_beamId);
            if (beam == null) return;

            base.Render (renderConfig);

            // step: setup render settings
            SSShaderProgram.DeactivateAll ();
            GL.ActiveTexture (TextureUnit.Texture0);
            GL.Enable (EnableCap.Texture2D);

            var laserParams = _laser.parameters;

            var startView = Vector3.Transform(beam.startPos, renderConfig.invCameraViewMatrix);
            var endView = Vector3.Transform (beam.endPos, renderConfig.invCameraViewMatrix);
            var middleView = (startView + endView) / 2f;

            // step: draw middle section:
            Vector3 diff = endView - startView;
            float diff_xy = diff.Xy.LengthFast;
            float phi = -(float)Math.Atan2 (diff.Z, diff_xy);
            float theta = (float)Math.Atan2 (diff.Y, diff.X);
            Matrix4 backgroundOrientMat = Matrix4.CreateRotationY (phi) * Matrix4.CreateRotationZ (theta);
            Matrix4 middlePlacementMat = backgroundOrientMat * Matrix4.CreateTranslation (middleView);
            //Matrix4 startPlacementMat = Matrix4.CreateTranslation (startView);

            float laserLength = diff.LengthFast;
            float middleWidth = laserParams.middleBackgroundWidth * _laser.envelopeIntensity;

            Vector3 cameraDir = Vector3.Transform(
                -Vector3.UnitZ, _cameraScene.renderConfig.invCameraViewMatrix).Normalized();
            float dot = Vector3.Dot (cameraDir, _laser.direction());
            dot = Math.Max (dot, 0f);
            float interferenceWidth = middleWidth * laserParams.middleInterferenceScale;

            GL.Color4 (1f, 1f, 1f, beam.periodicIntensity * beam.periodicIntensity);

            _updateMiddleMesh (laserLength, middleWidth);

            #if true
            // stretched middle background sprite
            if (middleBackgroundSprite != null) {
                _updateMiddleMesh (laserLength, middleWidth);

                GL.Material(MaterialFace.Front, MaterialParameter.Emission, laserParams.backgroundColor);
                GL.BindTexture (TextureTarget.Texture2D, middleBackgroundSprite.TextureID);

                foreach (var oriX in xOrientationPresets)
                {
                    Matrix4 rotated = oriX * middlePlacementMat;
                    GL.LoadMatrix (ref rotated);
                    _middleMesh.renderMesh (renderConfig);
                }
            }
            #endif
            #if true
            // stretched middle overlay sprite
            if (middleOverlayTexture != null) {
                GL.Material(MaterialFace.Front, MaterialParameter.Emission, laserParams.overlayColor);
                GL.BindTexture (TextureTarget.Texture2D, middleOverlayTexture.TextureID);

                _middleMesh.renderMesh (renderConfig);

                foreach (var oriX in xOrientationPresets)
                {
                    Matrix4 rotated = oriX * middlePlacementMat;
                    GL.LoadMatrix (ref rotated);
                    _middleMesh.renderMesh (renderConfig);
                }
            }
            #endif
            #if true
            // interference sprite with a moving U-coordinate offset
            if (laserParams.middleInterferenceScale > 0f && interferenceTexture != null)
            {
                _updateInterfernenceVertices(laserLength, interferenceWidth);

                GL.Material(MaterialFace.Front, MaterialParameter.Emission, laserParams.middleInterferenceColor);
                //GL.BindTexture(TextureTarget.Texture2D, interferenceSprite.TextureID);
                GL.BindTexture(TextureTarget.Texture2D, interferenceTexture.TextureID);
                var scaleMat = Matrix4.CreateScale(laserLength + middleWidth/2f, interferenceWidth, 1f);

                foreach (var oriX in xOrientationPresets) {
                    Matrix4 rotated = scaleMat * oriX * middlePlacementMat;
                    GL.LoadMatrix(ref rotated);
                    _interferenceMesh.renderMesh(renderConfig);
                }
            }
            #endif
        }
        public override void Render(SSRenderConfig renderConfig)
        {
            var beam = _laser.beam(_beamId);

            if (beam == null)
            {
                return;
            }

            base.Render(renderConfig);

            // step: setup render settings
            SSShaderProgram.DeactivateAll();
            GL.ActiveTexture(TextureUnit.Texture0);
            GL.Enable(EnableCap.Texture2D);

            var laserParams = _laser.parameters;

            var startView  = Vector3.Transform(beam.startPosWorld, renderConfig.invCameraViewMatrix);
            var endView    = Vector3.Transform(beam.endPosWorld, renderConfig.invCameraViewMatrix);
            var middleView = (startView + endView) / 2f;

            // step: draw middle section:
            Vector3 diff                = endView - startView;
            float   diff_xy             = diff.Xy.Length;
            float   phi                 = -(float)Math.Atan2(diff.Z, diff_xy);
            float   theta               = (float)Math.Atan2(diff.Y, diff.X);
            Matrix4 backgroundOrientMat = Matrix4.CreateRotationY(phi) * Matrix4.CreateRotationZ(theta);
            Matrix4 middlePlacementMat  = backgroundOrientMat * Matrix4.CreateTranslation(middleView);
            //Matrix4 startPlacementMat = Matrix4.CreateTranslation (startView);

            float laserLength = diff.Length;
            float middleWidth = laserParams.middleBackgroundWidth * _laser.envelopeIntensity;

            Vector3 cameraDir = Vector3.Transform(
                -Vector3.UnitZ, _cameraScene.renderConfig.invCameraViewMatrix).Normalized();
            float dot = Vector3.Dot(cameraDir, beam.directionWorld());

            dot = Math.Max(dot, 0f);
            float interferenceWidth = middleWidth * laserParams.middleInterferenceScale;

            GL.Color4(1f, 1f, 1f, beam.periodicIntensity * beam.periodicIntensity);

            _updateMiddleMesh(laserLength, middleWidth);

                        #if true
            // stretched middle background sprite
            if (middleBackgroundSprite != null)
            {
                GL.Material(MaterialFace.Front, MaterialParameter.Emission, laserParams.backgroundColor);
                GL.BindTexture(TextureTarget.Texture2D, middleBackgroundSprite.TextureID);

                foreach (var oriX in xOrientationPresets)
                {
                    Matrix4 rotated = oriX * middlePlacementMat;
                    GL.LoadMatrix(ref rotated);
                    _middleMesh.renderMesh(renderConfig);
                }
            }
                        #endif
                        #if true
            // stretched middle overlay sprite
            if (middleOverlayTexture != null)
            {
                GL.Material(MaterialFace.Front, MaterialParameter.Emission, laserParams.overlayColor);
                GL.BindTexture(TextureTarget.Texture2D, middleOverlayTexture.TextureID);

                _middleMesh.renderMesh(renderConfig);

                foreach (var oriX in xOrientationPresets)
                {
                    Matrix4 rotated = oriX * middlePlacementMat;
                    GL.LoadMatrix(ref rotated);
                    _middleMesh.renderMesh(renderConfig);
                }
            }
                        #endif
                        #if true
            // interference sprite with a moving U-coordinate offset
            if (laserParams.middleInterferenceScale > 0f && interferenceTexture != null)
            {
                _updateInterfernenceVertices(laserLength, interferenceWidth);

                GL.Material(MaterialFace.Front, MaterialParameter.Emission, laserParams.middleInterferenceColor);
                //GL.BindTexture(TextureTarget.Texture2D, interferenceSprite.TextureID);
                GL.BindTexture(TextureTarget.Texture2D, interferenceTexture.TextureID);
                var scaleMat = Matrix4.CreateScale(laserLength + middleWidth / 2f, interferenceWidth, 1f);

                foreach (var oriX in xOrientationPresets)
                {
                    Matrix4 rotated = scaleMat * oriX * middlePlacementMat;
                    GL.LoadMatrix(ref rotated);
                    _interferenceMesh.renderMesh(renderConfig);
                }
            }
                        #endif
        }
 public void drawSingle(SSRenderConfig renderConfig, PrimitiveType primType)
 {
     renderMesh(renderConfig);
 }