Commit 22e702b1 authored by Alexandre Delanoë's avatar Alexandre Delanoë

Merge remote-tracking branch 'origin/395-dev-ps-0.15-update' into dev-graph-multipartite

parents 757a3597 37e3a1b0
Pipeline #3273 failed with stage
in 0 seconds
...@@ -57,7 +57,8 @@ ...@@ -57,7 +57,8 @@
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
"react-tooltip": "^4.2.8", "react-tooltip": "^4.2.8",
"secp256k1": "^4.0.2", "secp256k1": "^4.0.2",
"sigma": "^2.3.1" "sigma": "^2.3.1",
"twgl.js": "^5.0.4"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.15.0", "@babel/core": "^7.15.0",
......
...@@ -25,6 +25,7 @@ import Gargantext.Components.GraphExplorer.Toolbar.Controls as Controls ...@@ -25,6 +25,7 @@ import Gargantext.Components.GraphExplorer.Toolbar.Controls as Controls
import Gargantext.Components.GraphExplorer.TopBar as GETB import Gargantext.Components.GraphExplorer.TopBar as GETB
import Gargantext.Components.GraphExplorer.Types (GraphSideDoc) import Gargantext.Components.GraphExplorer.Types (GraphSideDoc)
import Gargantext.Components.GraphExplorer.Types as GET import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Components.GraphExplorer.Utils as GEU
import Gargantext.Config (defaultFrontends) import Gargantext.Config (defaultFrontends)
import Gargantext.Data.Louvain as Louvain import Gargantext.Data.Louvain as Louvain
import Gargantext.Hooks.Session (useSession) import Gargantext.Hooks.Session (useSession)
...@@ -289,7 +290,7 @@ graphViewCpt = R.memo' $ here.component "graphView" cpt where ...@@ -289,7 +290,7 @@ graphViewCpt = R.memo' $ here.component "graphView" cpt where
convert :: GET.GraphData -> Tuple (Maybe GET.MetaData) SigmaxT.SGraph convert :: GET.GraphData -> Tuple (Maybe GET.MetaData) SigmaxT.SGraph
convert (GET.GraphData r) = Tuple r.metaData $ SigmaxT.Graph {nodes, edges} convert (GET.GraphData r) = Tuple r.metaData $ SigmaxT.Graph {nodes, edges}
where where
nodes = foldMapWithIndex nodeFn r.nodes nodes = foldMapWithIndex nodeFn $ GEU.normalizeNodeSize 1 10000 r.nodes
nodeFn _i nn@(GEGT.Node n) = nodeFn _i nn@(GEGT.Node n) =
Seq.singleton { Seq.singleton {
borderColor: color borderColor: color
...@@ -302,6 +303,7 @@ convert (GET.GraphData r) = Tuple r.metaData $ SigmaxT.Graph {nodes, edges} ...@@ -302,6 +303,7 @@ convert (GET.GraphData r) = Tuple r.metaData $ SigmaxT.Graph {nodes, edges}
, id : n.id_ , id : n.id_
, label : n.label , label : n.label
, size : DN.log (toNumber n.size + 1.0) , size : DN.log (toNumber n.size + 1.0)
--, size: toNumber n.size
, type : modeGraphType gargType , type : modeGraphType gargType
, x : n.x -- cos (toNumber i) , x : n.x -- cos (toNumber i)
, y : n.y -- sin (toNumber i) , y : n.y -- sin (toNumber i)
......
...@@ -207,26 +207,26 @@ drawGraphCpt = R.memo' $ here.component "graph" cpt where ...@@ -207,26 +207,26 @@ drawGraphCpt = R.memo' $ here.component "graph" cpt where
type SigmaSettings = type SigmaSettings =
( animationsTime :: Number ( --animationsTime :: Number
, autoRescale :: Boolean --, autoRescale :: Boolean
, autoResize :: Boolean --, autoResize :: Boolean
, batchEdgesDrawing :: Boolean --, batchEdgesDrawing :: Boolean
, borderSize :: Number --, borderSize :: Number
-- , canvasEdgesBatchSize :: Number -- , canvasEdgesBatchSize :: Number
-- , clone :: Boolean -- , clone :: Boolean
-- , defaultEdgeColor :: String -- , defaultEdgeColor :: String
, defaultEdgeHoverColor :: String --, defaultEdgeHoverColor :: String
, defaultEdgeType :: String defaultEdgeType :: String
, defaultHoverLabelBGColor :: String --, defaultHoverLabelBGColor :: String
, defaultHoverLabelColor :: String --, defaultHoverLabelColor :: String
, defaultLabelColor :: String --, defaultLabelColor :: String
-- , defaultLabelHoverColor :: String -- , defaultLabelHoverColor :: String
, defaultLabelSize :: Number , defaultLabelSize :: Number
, defaultNodeBorderColor :: String --, defaultNodeBorderColor :: String
, defaultNodeColor :: String , defaultNodeColor :: String
-- , defaultNodeHoverColor :: String -- , defaultNodeHoverColor :: String
-- , defaultNodeType :: String -- , defaultNodeType :: String
, doubleClickEnabled :: Boolean --, doubleClickEnabled :: Boolean
-- , doubleClickTimeout :: Number -- , doubleClickTimeout :: Number
-- , doubleClickZoomDuration :: Number -- , doubleClickZoomDuration :: Number
-- , doubleClickZoomingRatio :: Number -- , doubleClickZoomingRatio :: Number
...@@ -234,20 +234,20 @@ type SigmaSettings = ...@@ -234,20 +234,20 @@ type SigmaSettings =
-- , dragTimeout :: Number -- , dragTimeout :: Number
-- , drawEdgeLabels :: Boolean -- , drawEdgeLabels :: Boolean
-- , drawEdges :: Boolean -- , drawEdges :: Boolean
, drawLabels :: Boolean -- , drawLabels :: Boolean
, drawNodes :: Boolean -- , drawNodes :: Boolean
-- , edgeColor :: String -- , edgeColor :: String
, edgeHoverColor :: String -- , edgeHoverColor :: String
, edgeHoverExtremities :: Boolean -- , edgeHoverExtremities :: Boolean
, edgeHoverPrecision :: Number -- , edgeHoverPrecision :: Number
, edgeHoverSizeRatio :: Number -- , edgeHoverSizeRatio :: Number
-- , edgesPowRatio :: Number -- , edgesPowRatio :: Number
-- , enableCamera :: Boolean -- , enableCamera :: Boolean
, enableEdgeHovering :: Boolean , enableEdgeHoverEvents :: Boolean
, enableHovering :: Boolean -- , enableHovering :: Boolean
-- , eventsEnabled :: Boolean -- , eventsEnabled :: Boolean
, font :: String -- , font :: String
, fontStyle :: String -- , fontStyle :: String
, hideEdgesOnMove :: Boolean , hideEdgesOnMove :: Boolean
-- , hoverFont :: String -- , hoverFont :: String
-- , hoverFontStyle :: String -- , hoverFontStyle :: String
...@@ -257,117 +257,120 @@ type SigmaSettings = ...@@ -257,117 +257,120 @@ type SigmaSettings =
-- , labelHoverColor :: String -- , labelHoverColor :: String
-- , labelHoverShadow :: String -- , labelHoverShadow :: String
-- , labelHoverShadowColor :: String -- , labelHoverShadowColor :: String
, labelSize :: String -- , labelSize :: String
, labelSizeRatio :: Number -- , labelSizeRatio :: Number
, labelThreshold :: Number , labelRenderedSizeThreshold :: Number
, maxEdgeSize :: Number --, labelThreshold :: Number
, maxNodeSize :: Number -- , maxEdgeSize :: Number
-- , maxNodeSize :: Number
-- , minArrowSize :: Number -- , minArrowSize :: Number
, minEdgeSize :: Number -- , minEdgeSize :: Number
, minNodeSize :: Number -- , minNodeSize :: Number
, mouseEnabled :: Boolean -- , mouseEnabled :: Boolean
-- , mouseInertiaDuration :: Number -- , mouseInertiaDuration :: Number
-- , mouseInertiaRatio :: Number -- , mouseInertiaRatio :: Number
, mouseSelectorSize :: Number -- , mouseSelectorSize :: Number
-- , mouseWheelEnabled :: Boolean -- , mouseWheelEnabled :: Boolean
, mouseZoomDuration :: Number -- , mouseZoomDuration :: Number
, nodeBorderColor :: String -- , nodeBorderColor :: String
-- , nodeHoverColor :: String -- , nodeHoverColor :: String
--, nodesPowRatio :: Number --, nodesPowRatio :: Number
, rescaleIgnoreSize :: Boolean -- , rescaleIgnoreSize :: Boolean
-- , scalingMode :: String -- , scalingMode :: String
-- , sideMargin :: Number -- , sideMargin :: Number
, singleHover :: Boolean -- , singleHover :: Boolean
-- , skipErrors :: Boolean -- , skipErrors :: Boolean
, touchEnabled :: Boolean -- , touchEnabled :: Boolean
-- , touchInertiaDuration :: Number -- , touchInertiaDuration :: Number
-- , touchInertiaRatio :: Number -- , touchInertiaRatio :: Number
, twBorderGreyColor :: String -- , twBorderGreyColor :: String
, twEdgeDefaultOpacity :: Number -- , twEdgeDefaultOpacity :: Number
, twEdgeGreyColor :: String -- , twEdgeGreyColor :: String
, twNodeRendBorderColor :: String -- , twNodeRendBorderColor :: String
, twNodeRendBorderSize :: Number -- , twNodeRendBorderSize :: Number
, twNodesGreyOpacity :: Number -- , twNodesGreyOpacity :: Number
, twSelectedColor :: String -- , twSelectedColor :: String
, verbose :: Boolean -- , verbose :: Boolean
-- , webglEdgesBatchSize :: Number -- , webglEdgesBatchSize :: Number
-- , webglOversamplingRatio :: Number -- , webglOversamplingRatio :: Number
, zoomMax :: Number -- , zoomMax :: Number
, zoomMin :: Number -- , zoomMin :: Number
, zoomingRatio :: Number -- , zoomingRatio :: Number
) )
-- not selected <=> (1-greyness) -- not selected <=> (1-greyness)
-- selected nodes <=> special label -- selected nodes <=> special label
sigmaSettings :: Themes.Theme -> {|SigmaSettings} sigmaSettings :: Themes.Theme -> {|SigmaSettings}
sigmaSettings theme = sigmaSettings theme =
{ animationsTime : 30000.0 { -- animationsTime : 30000.0
, autoRescale : true -- , autoRescale : true
, autoResize : true --, autoResize : true
, batchEdgesDrawing : true --, batchEdgesDrawing : true
, borderSize : 1.0 -- for ex, bigger border when hover --, borderSize : 1.0 -- for ex, bigger border when hover
, defaultEdgeHoverColor : "#f00" --, defaultEdgeHoverColor : "#f00"
, defaultEdgeType : "curve" -- 'curve' or 'line' (curve iff ourRendering) defaultEdgeType : "line" -- 'curve' or 'line' (curve iff ourRendering)
-- , defaultHoverLabelBGColor : "#fff" -- , defaultHoverLabelBGColor : "#fff"
-- , defaultHoverLabelColor : "#000" -- , defaultHoverLabelColor : "#000"
-- , defaultLabelColor : "#000" -- labels text color -- , defaultLabelColor : "#000" -- labels text color
, defaultLabelSize : 15.0 -- (old tina: showLabelsIfZoom) , defaultLabelSize : 15.0 -- (old tina: showLabelsIfZoom)
, defaultNodeBorderColor : "#000" -- <- if nodeBorderColor = 'default' --, defaultNodeBorderColor : "#000" -- <- if nodeBorderColor = 'default'
, defaultNodeColor : "#FFF" , defaultNodeColor : "#FFF"
, doubleClickEnabled : false -- indicates whether or not the graph can be zoomed on double-click --, doubleClickEnabled : false -- indicates whether or not the graph can be zoomed on double-click
-- , drawEdgeLabels : true -- , drawEdgeLabels : true
-- , drawEdges : true -- , drawEdges : true
, drawLabels : true --, drawLabels : true
, drawNodes : true --, drawNodes : true
, enableEdgeHovering : false -- , edgeHoverExtremities : true
, edgeHoverExtremities : true -- , edgeHoverColor : "edge"
, edgeHoverColor : "edge" -- , edgeHoverPrecision : 2.0
, edgeHoverPrecision : 2.0 -- , edgeHoverSizeRatio : 2.0
, edgeHoverSizeRatio : 2.0 , enableEdgeHoverEvents : false
, enableHovering : true -- , enableHovering : true
, font : "arial" -- , font : "arial"
, fontStyle : "" -- , fontStyle : ""
, hideEdgesOnMove : true , hideEdgesOnMove : true
, labelSize : "proportional" -- alt : proportional, fixed -- , labelSize : "proportional" -- alt : proportional, fixed
-- , labelSize : "fixed" -- , labelSize : "fixed"
, labelSizeRatio : 2.0 -- label size in ratio of node size -- , labelSizeRatio : 2.0 -- label size in ratio of node size
, labelThreshold : 9.0 -- 5.0 for more labels -- min node cam size to start showing label , labelRenderedSizeThreshold: 2.0
, maxEdgeSize : 1.0 --, labelThreshold : 5.0 -- 5.0 for more labels -- min node cam size to start showing label
, maxNodeSize : 10.0 -- , maxEdgeSize : 1.0
, minEdgeSize : 0.5 -- in fact used in tina as edge size -- , maxNodeSize : 10.0
, minNodeSize : 1.0 -- , minEdgeSize : 0.5 -- in fact used in tina as edge size
, mouseEnabled : true -- , minNodeSize : 1.0
, mouseSelectorSize : 15.0 -- , mouseEnabled : true
, mouseZoomDuration : 150.0 -- , mouseSelectorSize : 15.0
, nodeBorderColor : "default" -- choices: "default" color vs. "node" color -- , mouseZoomDuration : 150.0
-- , nodeBorderColor : "default" -- choices: "default" color vs. "node" color
--, nodesPowRatio : 10.8 --, nodesPowRatio : 10.8
, rescaleIgnoreSize : false -- , rescaleIgnoreSize : false
, singleHover : true -- , singleHover : true
, touchEnabled : true -- , touchEnabled : true
, twBorderGreyColor : "rgba(100, 100, 100, 0.9)" -- , twBorderGreyColor : "rgba(100, 100, 100, 0.9)"
, twEdgeDefaultOpacity : 0.4 -- initial opacity added to src/tgt colors -- , twEdgeDefaultOpacity : 0.4 -- initial opacity added to src/tgt colors
, twEdgeGreyColor : "rgba(100, 100, 100, 0.25)" -- , twEdgeGreyColor : "rgba(100, 100, 100, 0.25)"
, twNodeRendBorderColor : "#FFF" -- , twNodeRendBorderColor : "#FFF"
, twNodeRendBorderSize : 2.5 -- node borders (only iff ourRendering) -- , twNodeRendBorderSize : 2.5 -- node borders (only iff ourRendering)
, twNodesGreyOpacity : 5.5 -- smaller value: more grey -- , twNodesGreyOpacity : 5.5 -- smaller value: more grey
, twSelectedColor : "node" -- "node" for a label bg like the node color, "default" for white background -- , twSelectedColor : "node" -- "node" for a label bg like the node color, "default" for white background
, verbose : true -- , verbose : true
, zoomMax : 1.7 -- , zoomMax : 1.7
, zoomMin : 0.0 -- , zoomMin : 0.0
, zoomingRatio : 1.4 -- , zoomingRatio : 1.4
} `merge` themeSettings theme
where
themeSettings t
| eq t darksterTheme =
{ defaultHoverLabelBGColor: "#FFF"
, defaultHoverLabelColor : "#000"
, defaultLabelColor: "#FFF"
}
| otherwise =
{ defaultHoverLabelBGColor: "#FFF"
, defaultHoverLabelColor : "#000"
, defaultLabelColor: "#000"
} }
-- `merge` themeSettings theme
-- where
-- themeSettings t
-- | eq t darksterTheme =
-- { defaultHoverLabelBGColor: "#FFF"
-- , defaultHoverLabelColor : "#000"
-- , defaultLabelColor: "#FFF"
-- }
-- | otherwise =
-- { defaultHoverLabelBGColor: "#FFF"
-- , defaultHoverLabelColor : "#000"
-- , defaultLabelColor: "#000"
-- }
type ForceAtlas2Settings = type ForceAtlas2Settings =
( adjustSizes :: Boolean ( adjustSizes :: Boolean
......
...@@ -121,7 +121,7 @@ options = ...@@ -121,7 +121,7 @@ options =
-- Controls -- Controls
, multiSelectEnabled : false , multiSelectEnabled : false
, labelSize : 14.0 , labelSize : 14.0
, labelRenderedSizeThreshold : 6.0 , labelRenderedSizeThreshold : 2.0
, mouseSelectorSize : 15.0 , mouseSelectorSize : 15.0
, edgeConfluence : Range.Closed { min: 0.0, max: 1.0 } , edgeConfluence : Range.Closed { min: 0.0, max: 1.0 }
, graphStage : GET.Init , graphStage : GET.Init
......
module Gargantext.Components.GraphExplorer.Utils module Gargantext.Components.GraphExplorer.Utils
( stEdgeToGET, stNodeToGET ( stEdgeToGET, stNodeToGET
, normalizeNodes , normalizeNodes
, normalizeNodeSize
, takeGreatestNodeByCluster, countNodeByCluster , takeGreatestNodeByCluster, countNodeByCluster
) where ) where
...@@ -8,13 +9,17 @@ import Gargantext.Prelude ...@@ -8,13 +9,17 @@ import Gargantext.Prelude
import Data.Array as A import Data.Array as A
import Data.Foldable (maximum, minimum) import Data.Foldable (maximum, minimum)
import Data.Maybe (Maybe(..)) import Data.Lens (Lens', lens, over, traversed, (^.))
import Data.Int (floor, toNumber)
import Data.Maybe (Maybe(..), fromMaybe, maybe)
import Data.Newtype (wrap) import Data.Newtype (wrap)
import Data.Sequence as Seq import Data.Sequence as Seq
import Data.Traversable (class Traversable)
import Gargantext.Components.GraphExplorer.GraphTypes as GEGT import Gargantext.Components.GraphExplorer.GraphTypes as GEGT
import Gargantext.Components.GraphExplorer.Types as GET import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Hooks.Sigmax.Types as ST import Gargantext.Hooks.Sigmax.Types as ST
import Gargantext.Utils (getter) import Gargantext.Utils (getter)
import Gargantext.Utils.Lens as GUL
import Gargantext.Utils.Seq as GUS import Gargantext.Utils.Seq as GUS
stEdgeToGET :: Record ST.Edge -> GEGT.Edge stEdgeToGET :: Record ST.Edge -> GEGT.Edge
...@@ -34,31 +39,32 @@ stNodeToGET { id, label, x, y, _original: GEGT.Node { attributes, size, type_ } ...@@ -34,31 +39,32 @@ stNodeToGET { id, label, x, y, _original: GEGT.Node { attributes, size, type_ }
----------------------------------------------------------------------- -----------------------------------------------------------------------
normalizeNodes :: Seq.Seq GEGT.Node -> Seq.Seq GEGT.Node -- | Normalize nodes, i.e. set their {x, y} values so that they are in
normalizeNodes ns = Seq.map normalizeNode ns -- | range [0, 1].
normalizeNodes :: forall t. Traversable t => t GEGT.Node -> t GEGT.Node
normalizeNodes ns = GUL.normalizeLens xLens $ GUL.normalizeLens yLens ns
where where
xs = map (\(GEGT.Node { x }) -> x) ns xLens :: Lens' GEGT.Node Number
ys = map (\(GEGT.Node { y }) -> y) ns xLens = lens (\(GEGT.Node { x }) -> x) $ (\(GEGT.Node n) val -> GEGT.Node (n { x = val }))
mMinx = minimum xs yLens :: Lens' GEGT.Node Number
mMaxx = maximum xs yLens = lens (\(GEGT.Node { y }) -> y) $ (\(GEGT.Node n) val -> GEGT.Node (n { y = val }))
mMiny = minimum ys
mMaxy = maximum ys normalizeNodeSize :: forall t. Traversable t => Int -> Int -> t GEGT.Node -> t GEGT.Node
mXrange = do normalizeNodeSize minSize maxSize ns = over traversed (over sizeLens (\s -> toNumber minSize + (s - sizeMin') * quotient)) ns
minx <- mMinx where
maxx <- mMaxx sizes = over traversed (_ ^. sizeLens) ns
pure $ maxx - minx sizeMin = minimum sizes
mYrange = do sizeMax = maximum sizes
miny <- mMiny range = do
maxy <- mMaxy sMin <- sizeMin
pure $ maxy - miny sMax <- sizeMax
xdivisor = case mXrange of pure $ sMax - sMin
Nothing -> 1.0 sizeMin' = fromMaybe 0.0 sizeMin
Just xdiv -> 1.0 / xdiv divisor = maybe 1.0 (\r -> 1.0 / r) range
ydivisor = case mYrange of quotient :: Number
Nothing -> 1.0 quotient = (toNumber $ maxSize - minSize) * divisor
Just ydiv -> 1.0 / ydiv sizeLens :: Lens' GEGT.Node Number
normalizeNode (GEGT.Node n@{ x, y }) = GEGT.Node $ n { x = x * xdivisor sizeLens = lens (\(GEGT.Node { size }) -> toNumber size) $ (\(GEGT.Node n) val -> GEGT.Node (n { size = floor val }))
, y = y * ydivisor }
------------------------------------------------------------------------ ------------------------------------------------------------------------
......
...@@ -13,6 +13,7 @@ import Data.Tuple.Nested ((/\)) ...@@ -13,6 +13,7 @@ import Data.Tuple.Nested ((/\))
import Gargantext.Components.App.Store as AppStore import Gargantext.Components.App.Store as AppStore
import Gargantext.Components.Bootstrap as B import Gargantext.Components.Bootstrap as B
import Gargantext.Components.GraphExplorer.API as GraphAPI import Gargantext.Components.GraphExplorer.API as GraphAPI
import Gargantext.Components.GraphExplorer.GraphTypes as GEGT
import Gargantext.Components.GraphExplorer.Layout (convert, layout) import Gargantext.Components.GraphExplorer.Layout (convert, layout)
import Gargantext.Components.GraphExplorer.Store as GraphStore import Gargantext.Components.GraphExplorer.Store as GraphStore
import Gargantext.Components.GraphExplorer.Types as GET import Gargantext.Components.GraphExplorer.Types as GET
...@@ -116,7 +117,7 @@ type HydrateStoreProps = ...@@ -116,7 +117,7 @@ type HydrateStoreProps =
, cacheParams :: GET.CacheParams , cacheParams :: GET.CacheParams
) )
hydrateStore:: R2.Leaf HydrateStoreProps hydrateStore :: R2.Leaf HydrateStoreProps
hydrateStore = R2.leaf hydrateStoreCpt hydrateStore = R2.leaf hydrateStoreCpt
hydrateStoreCpt :: R.Component HydrateStoreProps hydrateStoreCpt :: R.Component HydrateStoreProps
hydrateStoreCpt = here.component "hydrateStore" cpt where hydrateStoreCpt = here.component "hydrateStore" cpt where
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
import Graph from 'graphology'; import Graph from 'graphology';
import Sigma from 'sigma'; import Sigma from 'sigma';
import { takeScreenshot } from '../../src/external-deps/sigmajs-screenshot.js';
let sigma = Sigma.Sigma; let sigma = Sigma.Sigma;
console.log('imported sigma', Sigma); console.log('imported sigma', Sigma);
...@@ -163,11 +164,13 @@ let sigmaMouseSelector = function(sigma, options) { ...@@ -163,11 +164,13 @@ let sigmaMouseSelector = function(sigma, options) {
function _sigma(left, right, el, opts) { function _sigma(left, right, el, opts) {
try { try {
let graph = new Graph(); let graph = new Graph();
let s = new sigma(graph, el, opts); let s = new sigma(graph, el, opts.settigns);
console.log('initializing sigma with el', el, 'opts', 'sigma', s); console.log('[_sigma] initializing sigma with el', el, 'opts', opts, 'sigma', s);
console.log('[_sigma] labelRenderedSizeThreshold', opts.settings.labelRenderedSizeThreshold);
sigmaMouseSelector(s); sigmaMouseSelector(s);
return right(s); return right(s);
} catch(e) { } catch(e) {
console.log('[_sigma] error', e);
return left(e); return left(e);
} }
} }
...@@ -190,17 +193,7 @@ function _bindMouseSelectorPlugin(left, right, sig) { ...@@ -190,17 +193,7 @@ function _bindMouseSelectorPlugin(left, right, sig) {
function _on(sigma, event, handler) { sigma.on(event, handler); } function _on(sigma, event, handler) { sigma.on(event, handler); }
function _takeScreenshot(sigma) { function _takeScreenshot(sigma) {
let c = sigma.renderers[0].container; return takeScreenshot(sigma);
let edges = c.getElementsByClassName('sigma-edges')[0];
let scene = c.getElementsByClassName('sigma-scene')[0];
// let sceneCtx = scene.getContext('2d');
// sceneCtx.globalAlpha = 1;
// sceneCtx.drawImage(edges, 0, 0);
// return scene.toDataURL('image/png');
let edgesCtx = edges.getContext('2d');
edgesCtx.globalAlpha = 1;
edgesCtx.drawImage(scene, 0, 0);
return edges.toDataURL('image/png');
} }
function _proxySetSettings(window, sigma, settings) { function _proxySetSettings(window, sigma, settings) {
......
module Gargantext.Utils.Lens where
import Gargantext.Prelude
import Data.Foldable (maximum, minimum)
import Data.Maybe (Maybe(..), fromMaybe, maybe)
import Data.Lens
import Data.Traversable
-- | Given a Traversable of entities and a lens for them, normalize
-- | over lens getter so that the value of lens setter is in range [0,
-- | 1].
normalizeLens :: forall a t. Traversable t => Lens' a Number -> t a -> t a
normalizeLens l ns = over traversed normalize' ns
where
values = over traversed (_ ^. l) ns
vMin = minimum values
vMax = maximum values
vRange = do
minv <- vMin
maxv <- vMax
pure $ maxv - minv
divisor = maybe 1.0 (\r -> 1.0 / r) vRange
min = fromMaybe 0.0 vMin
normalize' n = over l (\v -> (v - min) * divisor) n
import * as twgl from 'twgl.js';
const vertexShader = `
attribute vec2 a_position;
attribute vec2 a_texCoord;
uniform vec2 u_resolution;
varying vec2 v_texCoord;
void main() {
// convert the rectangle from pixels to 0.0 to 1.0
vec2 zeroToOne = a_position / u_resolution;
// convert from 0->1 to 0->2
vec2 zeroToTwo = zeroToOne * 2.0;
// convert from 0->2 to -1->+1 (clipspace)
vec2 clipSpace = zeroToTwo - 1.0;
gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);
// pass the texCoord to the fragment shader
// The GPU will interpolate this value between points.
v_texCoord = a_texCoord;
}
`;
const fragmentShader = `
precision mediump float;
// our 2 canvases
uniform sampler2D u_canvas1;
uniform sampler2D u_canvas2;
// the texCoords passed in from the vertex shader.
// note: we're only using 1 set of texCoords which means
// we're assuming the canvases are the same size.
varying vec2 v_texCoord;
void main() {
// Look up a pixel from first canvas
vec4 color1 = texture2D(u_canvas1, v_texCoord);
// Look up a pixel from second canvas
vec4 color2 = texture2D(u_canvas2, v_texCoord);
// return the 2 colors multiplied
// TODO Modify this
gl_FragColor = color1 * color2;
}
`;
function setupTexture(gl, canvas, textureUnit, program, uniformName) {
let tex = gl.createTexture();
updateTextureFromCanvas(gl, tex, canvas, textureUnit);
// Set the parameters so we can render any size image.
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
let location = gl.getUniformLocation(program, uniformName);
gl.uniform1i(location, textureUnit);
}
function updateTextureFromCanvas(gl, tex, canvas, textureUnit) {
gl.activeTexture(gl.TEXTURE0 + textureUnit);
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);
}
export function takeScreenshot(sigma) {
// https://stackoverflow.com/questions/12590685/blend-two-canvases-onto-one-with-webgl
let c = sigma.container;
let edges = c.getElementsByClassName('sigma-edges')[0];
let nodes = c.getElementsByClassName('sigma-nodes')[0];
// let sceneCtx = scene.getContext('2d');
// sceneCtx.globalAlpha = 1;
// sceneCtx.drawImage(edges, 0, 0);
// return scene.toDataURL('image/png');
let edgesCtx = twgl.getContext(edges);
//edgesCtx.globalAlpha = 1;
//edgesCtx.drawImage(nodes, 0, 0);
let gl = edgesCtx; // TODO Create separate canvas for this
const program = twgl.createProgramFromSources(gl, [vertexShader, fragmentShader]);
gl.useProgram(program);
const positionLocation = gl.getAttribLocation(program, "a_position");
const texCoordLocation = gl.getAttribLocation(program, "a_texCoord");
const texCoordBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
0.0, 0.0,
1.0, 0.0,
0.0, 1.0,
0.0, 1.0,
1.0, 0.0,
1.0, 1.0]), gl.STATIC_DRAW);
gl.enableVertexAttribArray(texCoordLocation);
gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);
// lookup uniforms
let resolutionLocation = gl.getUniformLocation(program, "u_resolution");
// set the resolution
gl.uniform2f(resolutionLocation, gl.canvas.width, gl.canvas.height);
// Create a buffer for the position of the rectangle corners.
let buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.enableVertexAttribArray(positionLocation);
gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
// Set a rectangle the same size as the image.
setRectangle(gl, 0, 0, gl.canvas.width, gl.canvas.height);
let tex1 = setupTexture(gl, nodes, 0, program, "u_canvas1");
let tex2 = setupTexture(gl, edges, 1, program, "u_canvas2");
// Draw the rectangle.
gl.drawArrays(gl.TRIANGLES, 0, 6);
return gl.canvas.toDataURL('image/png');
}
function setRectangle(gl, x, y, width, height) {
const x1 = x;
const x2 = x + width;
const y1 = y;
const y2 = y + height;
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
x1, y1,
x2, y1,
x1, y2,
x1, y2,
x2, y1,
x2, y2]), gl.STATIC_DRAW);
}
...@@ -10218,6 +10218,11 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: ...@@ -10218,6 +10218,11 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
twgl.js@^5.0.4:
version "5.0.4"
resolved "https://registry.yarnpkg.com/twgl.js/-/twgl.js-5.0.4.tgz#4e3d54c4e8ff01af418bfbf7ce38df26595a6108"
integrity sha512-8U0ehLWvqOMTqMQd3xGjeQJSDwCNtoFvLg4V3Ne4QTCaPoJmOB4CSpy7MMHkMkc1qO2DMRhnV0uAgZmhO3Q/2w==
type-check@~0.3.2: type-check@~0.3.2:
version "0.3.2" version "0.3.2"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment