Foam map - vertex colors

Max scripts

Moderatorer: Super Moderatorer, Admins

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » ons 08 okt, 2014

Synes det ser nice ut så langt! Jeg ble tipset om fix til minnelekasjen og kan poste reparert versjon etter jobb. Andre ting du kan fargelegge etter er vinkel og farten på verticene.

I maxscriptet så fikk jeg ikke den render-callbacken til å fungere, så meshen blir ikke fargelagt når du rendrer. Regner med det er en enkel feil jeg har gjort der.
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet
http://folk.ntnu.no/havardsc/site/wordpress/

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » tor 09 okt, 2014

Ny versjon som ikke lekker minne og som også er en del raskere.

Kode: Velg alt

using Autodesk.Max;
using Autodesk.Max.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FoamMapUtils
{
    public class VertexColorGrading
    {
        IGlobal global;
        IInterface14 ip;
        IINode node;

        public int Channel { get; set; }
        public float HeightThreshold { get; set; }
        public float FadeInValue { get; set; }
        public float FadeOutValue { get; set; }

        public VertexColorGrading(uint nodeHandle)
        {
            try
            {
                global = GlobalInterface.Instance;
                if (global == null)
                    throw new ArgumentNullException("Global");
               
                ip = global.COREInterface14;
                node = ip.GetINodeByHandle(nodeHandle);
                if (node == null)
                    throw new Exception("Invalid node handle");
               
                /*
                triMesh = node.ObjectRef as ITriObject;
                if (triMesh == null)
                {
                    IIDerivedObject iDerived = node.ObjectRef as IIDerivedObject;
                    if (iDerived != null)
                        triMesh = iDerived.ObjRef as ITriObject;
                    if (triMesh == null)
                        throw new Exception("Object is not a tri mesh");
                }
                */
                Channel = 0;
                HeightThreshold = 5;
                FadeInValue = 60;
                FadeOutValue = 5;
            }
            catch (Exception e)
            {
                if (global != null)
                    global.TheListener.EditStream.Printf(e.ToString() + Environment.NewLine);
            }
        }

        public void GradeMesh()
        {
            IObject obj = node.EvalWorldState(ip.Time, true).Obj;
            IClass_ID cid = global.Class_ID.Create((uint)BuiltInClassIDA.TRIOBJ_CLASS_ID, 0);
            if (obj.CanConvertToType(cid) != 0)
            {
                ITriObject triMesh = obj.ConvertToType(ip.Time, cid) as ITriObject;
                IMesh mesh = triMesh.Mesh;
                IList<IPoint3> mapVerts = mesh.MapVerts(Channel);
                int numMapVerts = mesh.GetNumMapVerts(Channel);

                IPoint3 p0 = global.Point3.Create(1, 1, 1);
               
                for (int i = 0; i < numMapVerts; i++)
                {
                    IPoint3 vertex = mesh.GetVert(i);
                    IPoint3 mapVert = mapVerts[i];

                    //float r = mapVert.X * 255.0f;
                    float g = mapVert.Y * 255.0f;
                    float b = mapVert.Z * 255.0f;

                    if (vertex.Z > HeightThreshold)
                    {
                        mapVert.X = 1;
                        mapVert.Y = Math.Max(0, (g - FadeInValue) / 255);
                        mapVert.Z = Math.Max(0, (b - FadeInValue) / 255);
                        mapVerts[i] = mapVert;
                    }
                    else if (g < 255)
                    {
                        if (g + FadeOutValue > 255)
                            mapVerts[i] = p0;
                        else
                        {
                            mapVert.X = 1;
                            mapVert.Y = (g + FadeOutValue) / 255;
                            mapVert.Z = (g + FadeOutValue) / 255;
                            mapVerts[i] = mapVert;
                        }
                    }
                }
                p0.Dispose();
                triMesh.Dispose();
                mesh.Dispose();
            }
            obj.Dispose();
        }
    }
}
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/


3dhue
Innlegg: 4249
Registrert: tor 02 jun, 2005
Sted: Slemmestad
Kontakt:

Legg innav 3dhue » søn 12 okt, 2014

Veldig kult :D Kan noen poste en dll? Kan teste med materialer for vray her også. Skal teste om dette kan mikses med Phoenix fd.
Visualization/ Animation
Aker Solutions

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » søn 12 okt, 2014

Link til dll: http://havardsc.com/scripts/FoamMapUtils.rar

Litt oppdatert kode:
[spoiler]
Oppdatert maxscript. Fikset rendercallback. For å hente maska ut så må du bruke et vertex color-map.

Kode: Velg alt

(
   global VertexColorHeightAnimator
   (
      struct VertexColorHeightAnimatorStruct
      (
      private
         isOpen = false,
         vertexColorGrading,
         opened = false,
         callbackId = #VertexColorHeightAnimatorTime,
         dllPath = @"E:\Visual Studio Projects temp\FoamMapUtils\FoamMapUtils\bin\Debug\FoamMapUtils.dll",
      
      public
         dialog =
         (
            rollout dialog "VertexColorHeightAnimator"
            (
               fn pickFilter obj = canConvertTo obj Editable_mesh--classof obj == Editable_mesh
                  
               pickbutton pbPickObject "Pick object" align:#right filter:pickFilter
               spinner spnHeightThreshold "Offset" range:[-1e4, 1e4, 0] enabled:false align:#right
               spinner spnFadeIn "Fade in" range:[0, 255, 60] enabled:false align:#right
               spinner spnFadeOut "Fade out" range:[0, 255, 5] enabled:false align:#right
               checkButton cbActiveTimeCallback "Enable" enabled:false align:#right
               
               on spnHeightThreshold changed val do
                  (VertexColorHeightAnimator.getVertexColorGrading()).HeightThreshold = val
                              
               on spnFadeIn changed val do
                  (VertexColorHeightAnimator.getVertexColorGrading()).FadeInValue = val / 255.
               
               on spnFadeOut changed val do
                  (VertexColorHeightAnimator.getVertexColorGrading()).FadeOutValue = val / 255.
               
               on cbActiveTimeCallback changed isChecked do
               (
                  if isChecked then
                     VertexColorHeightAnimator.addTimeCallback()
                  else
                     VertexColorHeightAnimator.removeTimeCallback()
               )
               
               on pbPickObject picked obj do
               (
                  if classOf obj.baseobject == Editable_Mesh or querybox "Convert to mesh to continue" then
                  (
                     if classOf obj != Editable_Mesh then
                        convertTo obj Editable_mesh
                     
                     pbPickObject.text = obj.name
                     cbActiveTimeCallback.enabled = true
                     spnHeightThreshold.enabled = true
                     spnFadeIn.enabled = true
                     spnFadeOut.enabled = true
                     
                     obj.showVertexColors = true
                     
                     VertexColorHeightAnimator.createVertexColorGrading obj.handle
                     meshop.setMapSupport obj \
                        (VertexColorHeightAnimator.getVertexColorGrading()).Channel true
                  )
               )
               
               on dialog open do VertexColorHeightAnimator.open()
               on dialog close do VertexColorHeightAnimator.close()
            )
         ),
         
         fn getVertexColorGrading =
         (
            vertexColorGrading
         ),
         
         fn addTimeCallback =
         (
            print "Adding time callback"
            registerTimeCallback VertexColorHeightAnimator.gradeMeshParallelCallback
         ),
         
         fn removeTimeCallback =
         (
            print "Removing time callback"
            unregisterTimeCallback VertexColorHeightAnimator.gradeMeshParallelCallback
         ),
         
         fn addRenderCallback =
         (
            print "Adding render callback"
            callbacks.addScript #postRenderFrame "::VertexColorHeightAnimator.gradeMeshParallelRenderCallback()" id:callbackId
         ),
         
         fn removeRenderCallback =
         (
            print "Removing render callback"
            callbacks.removeScripts id:callbackId
         ),
         
         fn createVertexColorGrading handle =
         (
            vertexColorGrading = dotnetObject "FoamMapUtils.VertexColorGrading" handle
         ),
         
         fn gradeMeshCallback =
         (
            vertexColorGrading.gradeMesh currentTime.ticks
         ),
         
         fn gradeMeshParallelCallback =
         (
            vertexColorGrading.gradeMeshParallel currentTime.ticks
         ),
         
         fn gradeMeshRenderCallback =
         (
            vertexColorGrading.gradeMesh callbacks.notificationparam()[13].ticks
         ),
         
         fn gradeMeshParallelRenderCallback =
         (
            callbackParams = callbacks.notificationParam()
            vertexColorGrading.gradeMeshParallel callBackParams[13].ticks
         ),
         
         fn open =
         (
            print "Opening"
            addRenderCallback()
            opened = true
            createDialog dialog
         ),
         
         fn close =
         (
            print "Closing"
            removeRenderCallback()
            opened = false
            destroyDialog dialog
         ),
         
         on create do
         (
            dotnet.loadassembly dllPath
            
            if isStruct VertexColorHeightAnimator do
               VertexColorHeightAnimator.close()
         )
      )
      VertexColorHeightAnimator = VertexColorHeightAnimatorStruct()
      OK
   )
)
VertexColorHeightAnimator.open()


Oppdatert kode. Litt mer optimalisert og støtte for å kjøre det multithreadet.

Kode: Velg alt

using Autodesk.Max;
using Autodesk.Max.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FoamMapUtils
{
    public class VertexColorGrading
    {
        IGlobal global;
        IInterface14 ip;
        IINode node;

        public int Channel { get; set; }
        public float HeightThreshold { get; set; }
        public float FadeInValue { get; set; }
        public float FadeOutValue { get; set; }

        public VertexColorGrading(uint nodeHandle)
        {
            try
            {
                global = GlobalInterface.Instance;
                if (global == null)
                    throw new ArgumentNullException("Global");
               
                ip = global.COREInterface14;
                node = ip.GetINodeByHandle(nodeHandle);
                if (node == null)
                    throw new Exception("Invalid node handle");
               
                /*
                triMesh = node.ObjectRef as ITriObject;
                if (triMesh == null)
                {
                    IIDerivedObject iDerived = node.ObjectRef as IIDerivedObject;
                    if (iDerived != null)
                        triMesh = iDerived.ObjRef as ITriObject;
                    if (triMesh == null)
                        throw new Exception("Object is not a tri mesh");
                }
                */
                Channel = 0;
                HeightThreshold = 5;
                FadeInValue = 60;
                FadeOutValue = 5;
            }
            catch (Exception e)
            {
                if (global != null)
                    global.TheListener.EditStream.Printf(e.ToString() + Environment.NewLine);
            }
        }

        public void GradeMesh(int time)
        {
            IObject obj = node.EvalWorldState(time, true).Obj;
            IClass_ID cid = global.Class_ID.Create((uint)BuiltInClassIDA.TRIOBJ_CLASS_ID, 0);
            if (obj.CanConvertToType(cid) != 0)
            {
                ITriObject triMesh = obj.ConvertToType(time, cid) as ITriObject;
                IMesh mesh = triMesh.Mesh;
                IList<IPoint3> mapVerts = mesh.MapVerts(Channel);
                int numMapVerts = mesh.GetNumMapVerts(Channel);

                IPoint3 p0 = global.Point3.Create(1, 1, 1);
               
                for (int i = 0; i < numMapVerts; i++)
                {
                    IPoint3 vertex = mesh.GetVert(i);
                    IPoint3 mapVert = mapVerts[i];
                   
                    mapVert.X = 1;

                    if (vertex.Z > HeightThreshold)
                        mapVert.Z = Math.Max(0, mapVert.Z - FadeInValue);
                    else
                        mapVert.Z = Math.Min(1, mapVert.Z + FadeOutValue);

                    mapVert.X = mapVert.Y = mapVert.Z;
                    mapVerts[i] = mapVert;
                }
                p0.Dispose();
                triMesh.Dispose();
                mesh.Dispose();
            }
            obj.Dispose();
        }

        public void GradeMeshParallel(int time)
        {
            IObject obj = node.EvalWorldState(time, true).Obj;
            IClass_ID cid = global.Class_ID.Create((uint)BuiltInClassIDA.TRIOBJ_CLASS_ID, 0);
            if (obj.CanConvertToType(cid) != 0)
            {
                ITriObject triMesh = obj.ConvertToType(time, cid) as ITriObject;
                IMesh mesh = triMesh.Mesh;
                IList<IPoint3> mapVerts = mesh.MapVerts(Channel);
                int numMapVerts = mesh.GetNumMapVerts(Channel);

                IPoint3 p0 = global.Point3.Create(1, 1, 1);

                Parallel.For(0, numMapVerts, i =>
                {
                    IPoint3 vertex = mesh.GetVert(i);
                    IPoint3 mapVert = mapVerts[i];

                    mapVert.X = 1;

                    if (vertex.Z > HeightThreshold)
                        mapVert.Z = Math.Max(0, mapVert.Z - FadeInValue);
                    else
                        mapVert.Z = Math.Min(1, mapVert.Z + FadeOutValue);

                    mapVert.X = mapVert.Y = mapVert.Z;
                    mapVerts[i] = mapVert;
                });


                p0.Dispose();
                triMesh.Dispose();
                mesh.Dispose();
            }
            obj.Dispose();
        }
    }
}

[/spoiler]
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/


Gå tilbake til «Max scripts»

Hvem er online

Brukere i dette forumet: Ingen registrerte brukere og 1 gjest

cron