Esempio n. 1
0
        public override void Draw()
        {
            SetupDrawing();

            Color color    = projDef.graphicData.color;
            Color colorTwo = projDef.graphicData.colorTwo;

            color.a    *= Opacity;
            colorTwo.a *= (Opacity * projDef.flareOpacityMod);
            LaserBeamGraphic.BeamMatPropertyBlock.SetColor(ShaderPropertyIDs.Color, color);
            LaserBeamGraphic.FlareMatPropertyBlock.SetColor(ShaderPropertyIDs.Color, colorTwo);
            LaserBeamGraphic.FlareMatPropertyBlock.SetColor(ShaderPropertyIDs.ColorTwo, color);
            if (Lightning)
            {
                Vector3 vector;
                vector.x = (float)b.x;
                vector.y = (float)b.y;
                vector.z = (float)b.z;
                float distance = Vector3.Distance(a, b);

                for (int i = 0; i < projDef.ArcCount; i++)
                {
                    if (this.projDef.graphicData != null)
                    {
                        if (this.projDef.graphicData.graphicClass != null)
                        {
                            if (!Find.TickManager.Paused && Find.TickManager.TicksGame % this.projDef.flickerFrameTime == 0)
                            {
                                if (this.projDef.graphicData.graphicClass == typeof(Graphic_Flicker))
                                {
                                    //    Log.Message("Graphic_Flicker get mat for arc " + (i + 1));
                                    mats[i] = projDef.GetBeamMaterial((this.projDef.materials.IndexOf(mats[i]) + 1 < this.projDef.materials.Count ? this.projDef.materials.IndexOf(mats[i]) + 1 : 0)) ?? projDef.graphicData.Graphic.MatSingle;
                                }
                                else if (this.projDef.graphicData.graphicClass == typeof(Graphic_Random))
                                {
                                    //    Log.Message("Graphic_Random get mat for arc " + (i + 1));
                                    mats[i] = this.projDef.materials.RandomElement() ?? projDef.graphicData.Graphic.MatSingle;
                                }
                            }
                        }
                    }
                    float mult = Mathf.InverseLerp(projDef.lifetime, 0f, ticks);
                    //    if (Find.TickManager.TicksGame % this.projDef.flickerFrameTime != 0)  Log.Message("Mult for Arc "+(i+1)+" : "+mult);
                    if (!Find.TickManager.Paused && Find.TickManager.TicksGame % this.projDef.LightningFrameTime == 0)
                    {
                        if (projDef.lightningArcVarianceDistCurve != null && projDef.lightningArcWidthDistCurve != null)
                        {
                            meshes[i] = meshes[i] != null && Static ? meshes[i] : LightningLaserBoltMeshMaker.NewBoltMesh(new Vector2(0, -(distance + 0.25f)), projDef.lightningArcVarianceDistCurve, projDef.lightningArcWidthDistCurve, projDef.lightningArcVarianceTimeCurve, projDef.lightningArcWidthTimeCurve, i == 0 ? 0f : 0.5f, projDef.capSize);
                        }
                        else
                        {
                            meshes[i] = meshes[i] != null && Static ? meshes[i] : LightningLaserBoltMeshMaker.NewBoltMesh(new Vector2(0, -(distance + 0.25f)), projDef.LightningVariance, beamWidth * mult, i == 0 ? 0f : 0.5f, projDef.capSize);
                        }
                    }
                    Graphics.DrawMesh(this.meshes[i], this.b, Quaternion.LookRotation((vector - this.a).normalized), FadedMaterialPool.FadedVersionOf(mats[i], Opacity), 0, null, 0, LaserBeamGraphic.BeamMatPropertyBlock, 0);
                    Graphics.DrawMesh(this.meshes[i], this.b, Quaternion.LookRotation((vector - this.a).normalized), FadedMaterialPool.FadedVersionOf(projDef.flareMat ?? FlareMat, Opacity * 0.5f), 0, null, 0, LaserBeamGraphic.FlareMatPropertyBlock, 0);
                }
            }
            else
            {
                if (this.projDef.graphicData != null)
                {
                    if (this.projDef.graphicData.graphicClass != null)
                    {
                        if (!Find.TickManager.Paused && Find.TickManager.TicksGame % this.projDef.flickerFrameTime == 0)
                        {
                            if (this.projDef.graphicData.graphicClass == typeof(Graphic_Flicker))
                            {
                                //    Log.Message("Graphic_Flicker get mat for beam ");
                                materialBeam = projDef.GetBeamMaterial((this.projDef.materials.IndexOf(materialBeam) + 1 < this.projDef.materials.Count ? this.projDef.materials.IndexOf(materialBeam) + 1 : 0)) ?? projDef.graphicData.Graphic.MatSingle;
                            }
                            if (this.projDef.graphicData.graphicClass == typeof(Graphic_Random))
                            {
                                //    Log.Message("Graphic_Random get mat for beam ");
                                materialBeam = projDef.GetBeamMaterial(0) ?? projDef.graphicData.Graphic.MatSingle;
                            }
                        }
                    }
                }
                Graphics.DrawMesh(mesh, drawingMatrixBeam, FadedMaterialPool.FadedVersionOf(materialBeam, Opacity), 0, null, 0, LaserBeamGraphic.BeamMatPropertyBlock);
                Graphics.DrawMesh(mesh, drawingMatrixFlare, projDef.flareMat ?? FlareMat, 0, null, 0, LaserBeamGraphic.FlareMatPropertyBlock);
                //    Graphics.DrawMesh(mesh, drawingMatrix, FadedMaterialPool.FadedVersionOf(materialBeam, opacity), 0);
            }
        }
Esempio n. 2
0
        public void SetupDrawing()
        {
            if (mesh != null)
            {
                return;
            }

            materialBeam = projDef.GetBeamMaterial(colorIndex) ?? LaserBeamGraphic.BeamMat;

            if (this.projDef.graphicData != null)
            {
                if (this.projDef.graphicData.graphicClass != null)
                {
                    if (this.projDef.graphicData.graphicClass == typeof(Graphic_Flicker))
                    {
                        //    Log.Message("Graphic_Flicker get mat for arc " + (i + 1));
                        materialBeam = projDef.GetBeamMaterial((this.projDef.materials.IndexOf(materialBeam) + 1 < this.projDef.materials.Count ? this.projDef.materials.IndexOf(materialBeam) + 1 : 0)) ?? projDef.graphicData.Graphic.MatSingle;
                    }
                    if (this.projDef.graphicData.graphicClass == typeof(Graphic_Random))
                    {
                        materialBeam = projDef.GetBeamMaterial(0) ?? projDef.graphicData.Graphic.MatSingle;
                    }
                }
            }
            beamWidth      = projDef.beamWidth;
            flareWidth     = projDef.flareWidth;
            flareWidthMod  = projDef.flareWidthMod;
            flareLength    = projDef.flareLength;
            flareLengthMod = projDef.flareLengthMod;
            Quaternion rotation = Quaternion.LookRotation(a - b);
            //    Quaternion rotation = Quaternion.LookRotation(b - a);
            Vector3 dir = (b - a).normalized;

            beamLength = (b - a).magnitude;

            Vector3 drawingScale    = new Vector3(beamWidth, 1f, beamLength);
            Vector3 drawingPosition = (a + b) / 2;

            //    drawingPosition.y = AltitudeLayer.MetaOverlays.AltitudeFor();
            drawingMatrixBeam.SetTRS(drawingPosition, rotation, drawingScale);
            if (flareWidth == -1)
            {
                flareWidth = beamWidth * flareWidthMod;
            }
            if (flareLength == -1)
            {
                flareLength = beamLength * flareLengthMod;
            }
            Quaternion rotationFlare        = Quaternion.LookRotation(a - b);
            Vector3    drawingScaleFlare    = new Vector3(flareWidth, 1f, flareLength);
            Vector3    drawingPositionFlare = a + (dir * flareLength) / 2; //FlarePos(a,b, 0.1f);

            drawingMatrixFlare.SetTRS(drawingPositionFlare, rotationFlare, drawingScaleFlare);
            float textureRatio = 1.0f * materialBeam.mainTexture.width / materialBeam.mainTexture.height;
            float seamTexture  = projDef.seam < 0 ? textureRatio : projDef.seam;
            float capLength    = beamWidth / textureRatio / 2f * seamTexture;
            float seamGeometry = beamLength <= capLength * 2 ? 0.5f : capLength * 2 / beamLength;

            if (Lightning && meshes.Count < projDef.ArcCount * (Static ? 1 :  (projDef.lifetime / projDef.LightningFrameTime)))
            {
                float distance = Vector3.Distance(a, b);
                for (int i = 0; i < projDef.ArcCount; i++)
                {
                    if (projDef.lightningArcVarianceDistCurve != null && projDef.lightningArcWidthDistCurve != null)
                    {
                        meshes.Add(LightningLaserBoltMeshMaker.NewBoltMesh(new Vector2(0, -(distance + 0.25f)), projDef.lightningArcVarianceDistCurve, projDef.lightningArcWidthDistCurve, projDef.lightningArcVarianceTimeCurve, projDef.lightningArcWidthTimeCurve, i == 0 ? 0f : 0.5f, projDef.capSize));
                    }
                    else
                    {
                        meshes.Add(LightningLaserBoltMeshMaker.NewBoltMesh(new Vector2(0, -(distance + 0.25f)), projDef.LightningVariance, beamWidth, i * 0.1f, projDef.capSize));
                    }
                    mats.Add(projDef.GetBeamMaterial(i) ?? LaserBeamGraphic.BeamMat);
                }
                //    this.mesh = LightningBoltMeshMakerOG.NewBoltMesh(new Vector2(0, -(distance + 0.25f)), def.LightningVariance);
            }
            else
            {
                this.mesh = MeshMakerLaser.Mesh(seamTexture, seamGeometry);
            }
        }